func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, ok := aws.Regions[b.config.Region] if !ok { panic("region not found") } auth := aws.Auth{b.config.AccessKey, b.config.SecretKey} ec2conn := ec2.New(auth, region) // Setup the state bag and initial state for the steps state := make(map[string]interface{}) state["config"] = b.config state["ec2"] = ec2conn state["hook"] = hook state["ui"] = ui // Build the steps steps := []multistep.Step{ &stepKeyPair{}, &stepSecurityGroup{}, &stepRunSourceInstance{}, &stepConnectSSH{}, &stepProvision{}, &stepStopInstance{}, &stepCreateAMI{}, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state["error"]; ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state["amis"]; !ok { return nil, nil } // Build the artifact and return it artifact := &artifact{ amis: state["amis"].(map[string]string), conn: ec2conn, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Initialize the DO API client client := DigitalOceanClient{}.New(b.config.ClientID, b.config.APIKey) // Set up the state state := make(map[string]interface{}) state["config"] = b.config state["client"] = client state["hook"] = hook state["ui"] = ui // Build the steps steps := []multistep.Step{ new(stepCreateSSHKey), new(stepCreateDroplet), new(stepDropletInfo), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: 5 * time.Minute, }, new(common.StepProvision), new(stepPowerOff), new(stepSnapshot), } // Run the steps if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state["error"]; ok { return nil, rawErr.(error) } if _, ok := state["snapshot_name"]; !ok { log.Println("Failed to find snapshot_name in state. Bug?") return nil, nil } artifact := &Artifact{ snapshotName: state["snapshot_name"].(string), snapshotId: state["snapshot_image_id"].(uint), client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, ok := aws.Regions[b.config.Region] if !ok { panic("region not found") } auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } ec2conn := ec2.New(auth, region) // Setup the state bag and initial state for the steps state := make(map[string]interface{}) state["config"] = &b.config state["ec2"] = ec2conn state["hook"] = hook state["ui"] = ui // Build the steps steps := []multistep.Step{ &awscommon.StepKeyPair{}, &awscommon.StepSecurityGroup{ SecurityGroupId: b.config.SecurityGroupId, SSHPort: b.config.SSHPort, VpcId: b.config.VpcId, }, &awscommon.StepRunSourceInstance{ ExpectedRootDevice: "instance-store", InstanceType: b.config.InstanceType, SourceAMI: b.config.SourceAmi, SubnetId: b.config.SubnetId, }, &common.StepConnectSSH{ SSHAddress: awscommon.SSHAddress(b.config.SSHPort), SSHConfig: awscommon.SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &StepUploadX509Cert{}, &StepBundleVolume{}, &StepUploadBundle{}, &StepRegisterAMI{}, } // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state["error"]; ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state["amis"]; !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state["amis"].(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Seed the random number generator rand.Seed(time.Now().UTC().UnixNano()) steps := []multistep.Step{ &stepPrepareTools{}, &stepDownloadISO{}, &stepPrepareOutputDir{}, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &stepCreateDisk{}, &stepCreateVMX{}, &stepHTTPServer{}, &stepConfigureVNC{}, &stepRun{}, &stepTypeBootCommand{}, &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: b.config.sshWaitTimeout, }, &stepUploadTools{}, &common.StepProvision{}, &stepShutdown{}, &stepCleanFiles{}, &stepCleanVMX{}, &stepCompactDisk{}, } // Setup the state bag state := make(map[string]interface{}) state["cache"] = cache state["config"] = &b.config state["driver"] = b.driver state["hook"] = hook state["ui"] = ui // Run! if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state["error"]; ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state[multistep.StateCancelled]; ok { return nil, errors.New("Build was cancelled.") } if _, ok := state[multistep.StateHalted]; ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files := make([]string, 0, 10) visit := func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() { files = append(files, path) } return nil } if err := filepath.Walk(b.config.OutputDir, visit); err != nil { return nil, err } return &Artifact{b.config.OutputDir, files}, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { steps := []multistep.Step{ new(stepDownloadGuestAdditions), new(stepDownloadISO), new(stepPrepareOutputDir), &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, new(stepHTTPServer), new(stepSuppressMessages), new(stepCreateVM), new(stepCreateDisk), new(stepAttachISO), new(stepAttachFloppy), new(stepForwardSSH), new(stepVBoxManage), new(stepRun), new(stepTypeBootCommand), new(stepWaitForSSH), new(stepUploadVersion), new(stepUploadGuestAdditions), new(stepProvision), new(stepShutdown), new(stepExport), } // Setup the state bag state := make(map[string]interface{}) state["cache"] = cache state["config"] = &b.config state["driver"] = b.driver state["hook"] = hook state["ui"] = ui // Run if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } b.runner.Run(state) // If there was an error, return that if rawErr, ok := state["error"]; ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state[multistep.StateCancelled]; ok { return nil, errors.New("Build was cancelled.") } if _, ok := state[multistep.StateHalted]; ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files := make([]string, 0, 5) visit := func(path string, info os.FileInfo, err error) error { if !info.IsDir() { files = append(files, path) } return err } if err := filepath.Walk(b.config.OutputDir, visit); err != nil { return nil, err } artifact := &Artifact{ dir: b.config.OutputDir, f: files, } return artifact, nil }