func TestStepCheckRepo_Ignore_Repo_Name(t *testing.T) { env := new(multistep.BasicStateBag) os.MkdirAll("tmp", 0777) env.Put("path", "tmp") env.Put("ignored_owners", []string{}) env.Put("ignored_repos", []string{"bootstrap"}) repo := Repo{FullName: "pearkes/bootstrap"} env.Put("repo", repo) step := &StepCheckRepo{} results := step.Run(env) state := env.Get("repo_state").(string) if state != "ignore" { t.Fatal("repo state does not match ignore") } if results != multistep.ActionContinue { t.Fatal("step did not return ActionContinue") } os.RemoveAll("tmp") }
// Run executes a googlecompute Packer build and returns a packer.Artifact // representing a GCE machine image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriverGCE( ui, b.config.ProjectId, &b.config.Account) if err != nil { return nil, err } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ new(StepCheckExistingImage), &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("gce_%s.pem", b.config.PackerBuildName), }, &StepCreateInstance{ Debug: b.config.PackerDebug, }, &StepInstanceInfo{ Debug: b.config.PackerDebug, }, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, new(common.StepProvision), new(StepWaitInstanceStartup), new(StepTeardownInstance), new(StepCreateImage), } // Run the steps. b.runner = common.NewRunner(steps, b.config.PackerConfig, ui) b.runner.Run(state) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image"); !ok { log.Println("Failed to find image in state. Bug?") return nil, nil } artifact := &Artifact{ image: state.Get("image").(*Image), driver: driver, config: b.config, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver := &DockerDriver{Tpl: b.config.tpl, Ui: ui} if err := driver.Verify(); err != nil { return nil, err } steps := []multistep.Step{ &StepTempDir{}, &StepPull{}, &StepRun{}, &StepProvision{}, } if b.config.Commit { steps = append(steps, new(StepCommit)) } else { steps = append(steps, new(StepExport)) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Setup the driver that will talk to Docker state.Put("driver", driver) // 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.GetOk("error"); ok { return nil, rawErr.(error) } var artifact packer.Artifact // No errors, must've worked if b.config.Commit { artifact = &ImportArtifact{ IdValue: state.Get("image_id").(string), BuilderIdValue: BuilderIdImport, Driver: driver, } } else { artifact = &ExportArtifact{path: b.config.ExportPath} } 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 := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("client", client) state.Put("hook", hook) state.Put("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(stepShutdown), 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.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("snapshot_name"); !ok { log.Println("Failed to find snapshot_name in state. Bug?") return nil, nil } artifact := &Artifact{ snapshotName: state.Get("snapshot_name").(string), snapshotId: state.Get("snapshot_image_id").(uint), client: client, } return artifact, nil }
// Run executes a googlecompute Packer build and returns a packer.Artifact // representing a GCE machine image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriverGCE( ui, b.config.ProjectId, b.config.clientSecrets, b.config.privateKeyBytes) if err != nil { return nil, err } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ new(StepCreateSSHKey), new(StepCreateInstance), new(StepInstanceInfo), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: 5 * time.Minute, }, new(common.StepProvision), new(StepUpdateGsutil), new(StepCreateImage), new(StepUploadImage), new(StepRegisterImage), } // 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) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image_name"); !ok { log.Println("Failed to find image_name in state. Bug?") return nil, nil } artifact := &Artifact{ imageName: state.Get("image_name").(string), driver: driver, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config := b.config driver, err := NewDriverTriton(ui, config) if err != nil { return nil, err } state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &StepCreateSourceMachine{}, &communicator.StepConnect{ Config: &config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, &StepStopMachine{}, &StepCreateImageFromMachine{}, &StepDeleteMachine{}, } 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there is no image, just return if _, ok := state.GetOk("image"); !ok { return nil, nil } artifact := &Artifact{ ImageID: state.Get("image").(string), BuilderIDValue: BuilderId, Driver: driver, } return artifact, nil }
// Run executes a SoftLayer Packer build and returns a packer.Artifact // representing a SoftLayer machine image (flex). func (self *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Create the client client := (SoftlayerClient{}).New(self.config.Username, self.config.APIKey) // Set up the state which is used to share state between the steps state := new(multistep.BasicStateBag) state.Put("config", &self.config) state.Put("client", client) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &stepCreateSshKey{ PrivateKeyFile: self.config.SSHPrivateKey, }, new(stepCreateInstance), new(stepWaitforInstance), &communicator.StepConnect{ Config: &self.config.Config, Host: sshHost, SSHPort: sshPort, SSHConfig: sshConfig, }, new(common.StepProvision), new(stepCaptureImage), } // Create the runner which will run the steps we just build self.runner = &multistep.BasicRunner{Steps: steps} self.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image_id"); !ok { log.Println("Failed to find image_id in state. Bug?") return nil, nil } // Create an artifact and return it artifact := &Artifact{ imageName: self.config.ImageName, imageId: state.Get("image_id").(string), datacenterName: self.config.DatacenterName, client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { steps := []multistep.Step{ &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("pb_%s", b.config.SnapshotName), }, new(stepCreateServer), &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, new(stepTakeSnapshot), } state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) config := state.Get("config").(*Config) 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 rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } artifact := &Artifact{ snapshotData: config.SnapshotName, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriver(&b.config) if err != nil { return nil, fmt.Errorf("Failed creating VMware driver: %s", err) } // Determine the output dir implementation var dir OutputDir switch d := driver.(type) { case OutputDir: dir = d default: dir = new(vmwcommon.LocalOutputDir) } if b.config.RemoteType != "" && b.config.Format != "" { b.config.OutputDir = b.config.VMName } dir.SetOutputDir(b.config.OutputDir) // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("dir", dir) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &vmwcommon.StepPrepareTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, }, &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, Extension: "iso", TargetPath: b.config.TargetPath, }, &vmwcommon.StepOutputDir{ Force: b.config.PackerForce, }, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &stepRemoteUpload{ Key: "floppy_path", Message: "Uploading Floppy to remote machine...", }, &stepRemoteUpload{ Key: "iso_path", Message: "Uploading ISO to remote machine...", }, &stepCreateDisk{}, &stepCreateVMX{}, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXData, }, &vmwcommon.StepSuppressMessages{}, &vmwcommon.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, &vmwcommon.StepConfigureVNC{ VNCPortMin: b.config.VNCPortMin, VNCPortMax: b.config.VNCPortMax, }, &StepRegister{ Format: b.config.Format, }, &vmwcommon.StepRun{ BootWait: b.config.BootWait, DurationBeforeStop: 5 * time.Second, Headless: b.config.Headless, }, &vmwcommon.StepTypeBootCommand{ BootCommand: b.config.BootCommand, VMName: b.config.VMName, Ctx: b.config.ctx, }, &communicator.StepConnect{ Config: &b.config.SSHConfig.Comm, Host: driver.CommHost, SSHConfig: vmwcommon.SSHConfigFunc(&b.config.SSHConfig), }, &vmwcommon.StepUploadTools{ RemoteType: b.config.RemoteType, ToolsUploadFlavor: b.config.ToolsUploadFlavor, ToolsUploadPath: b.config.ToolsUploadPath, Ctx: b.config.ctx, }, &common.StepProvision{}, &vmwcommon.StepShutdown{ Command: b.config.ShutdownCommand, Timeout: b.config.ShutdownTimeout, }, &vmwcommon.StepCleanFiles{}, &vmwcommon.StepConfigureVMX{ CustomData: b.config.VMXDataPost, SkipFloppy: true, }, &vmwcommon.StepCleanVMX{}, &StepUploadVMX{ RemoteType: b.config.RemoteType, }, &vmwcommon.StepCompactDisk{ Skip: b.config.SkipCompaction, }, &StepExport{ Format: b.config.Format, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list var files []string if b.config.RemoteType != "" { dir = new(vmwcommon.LocalOutputDir) dir.SetOutputDir(b.config.OutputDir) files, err = dir.ListFiles() } else { files, err = state.Get("dir").(OutputDir).ListFiles() } if err != nil { return nil, err } // Set the proper builder ID builderId := vmwcommon.BuilderId if b.config.RemoteType != "" { builderId = BuilderIdESX } return &Artifact{ builderId: builderId, dir: dir, f: files, }, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { computeClient, err := b.config.computeV2Client() if err != nil { return nil, fmt.Errorf("Error initializing compute client: %s", err) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepLoadExtensions{}, &StepLoadFlavor{ Flavor: b.config.Flavor, }, &StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("os_%s.pem", b.config.PackerBuildName), }, &StepRunSourceServer{ Name: b.config.ImageName, SourceImage: b.config.SourceImage, SecurityGroups: b.config.SecurityGroups, Networks: b.config.Networks, AvailabilityZone: b.config.AvailabilityZone, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, }, &StepWaitForRackConnect{ Wait: b.config.RackconnectWait, }, &StepAllocateIp{ FloatingIpPool: b.config.FloatingIpPool, FloatingIp: b.config.FloatingIp, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: CommHost( computeClient, b.config.SSHInterface), SSHConfig: SSHConfig(b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &StepStopServer{}, &stepCreateImage{}, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Client: computeClient, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } api := &gophercloud.ApiCriteria{ Name: "cloudServersOpenStack", Region: b.config.AccessConfig.Region(), VersionId: "2", UrlChoice: gophercloud.PublicURL, } csp, err := gophercloud.ServersApi(auth, *api) if err != nil { log.Printf("Region: %s", b.config.AccessConfig.Region()) return nil, err } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("csp", csp) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepKeyPair{}, &StepRunSourceServer{ Name: b.config.ImageName, Flavor: b.config.Flavor, SourceImage: b.config.SourceImage, }, &common.StepConnectSSH{ SSHAddress: SSHAddress(csp, b.config.SSHPort), SSHConfig: SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &stepCreateImage{}, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Conn: csp, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config, err := b.config.Config() if err != nil { return nil, err } ec2conn := ec2.New(config) // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.SSHKeyPairName, TemporaryKeyPairName: b.config.TemporaryKeyPairName, PrivateKeyFile: b.config.RunConfig.Comm.SSHPrivateKey, }, &awscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, CommConfig: &b.config.RunConfig.Comm, VpcId: b.config.VpcId, }, &stepCleanupVolumes{ BlockDevices: b.config.BlockDevices, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "ebs", SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, IamInstanceProfile: b.config.IamInstanceProfile, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, &awscommon.StepGetPassword{ Comm: &b.config.RunConfig.Comm, Timeout: b.config.WindowsPasswordTimeout, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: awscommon.SSHHost( ec2conn, b.config.SSHPrivateIp), SSHConfig: awscommon.SSHConfig( b.config.RunConfig.Comm.SSHUsername), }, &common.StepProvision{}, &stepStopInstance{SpotPrice: b.config.SpotPrice}, // TODO(mitchellh): verify works with spots &stepModifyInstance{}, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, AMIName: b.config.AMIName, }, &stepCreateAMI{}, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("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) { if runtime.GOOS != "linux" { return nil, errors.New("The amazon-chroot builder only works on Linux environments.") } config, err := b.config.Config() if err != nil { return nil, err } session := session.New(config) ec2conn := ec2.New(session) wrappedCommand := func(command string) (string, error) { ctx := b.config.ctx ctx.Data = &wrappedCommandTemplate{Command: command} return interpolate.Render(b.config.CommandWrapper, &ctx) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) state.Put("wrappedCommand", CommandWrapper(wrappedCommand)) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &StepInstanceInfo{}, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &StepCheckRootDevice{}, &StepFlock{}, &StepPrepareDevice{}, &StepCreateVolume{ RootVolumeSize: b.config.RootVolumeSize, }, &StepAttachVolume{}, &StepEarlyUnflock{}, &StepMountDevice{ MountOptions: b.config.MountOptions, MountPartition: b.config.MountPartition, }, &StepMountExtra{}, &StepCopyFiles{}, &StepChrootProvision{}, &StepEarlyCleanup{}, &StepSnapshot{}, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, AMIName: b.config.AMIName, }, &StepRegisterAMI{ RootVolumeSize: b.config.RootVolumeSize, }, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("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) { // Create the driver that we'll use to communicate with Qemu driver, err := b.newDriver(b.config.QemuBinary) if err != nil { return nil, fmt.Errorf("Failed creating Qemu driver: %s", err) } steprun := &stepRun{} if !b.config.DiskImage { steprun.BootDrive = "once=d" steprun.Message = "Starting VM, booting from CD-ROM" } else { steprun.BootDrive = "c" steprun.Message = "Starting VM, booting disk image" } steps := []multistep.Step{ &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", Extension: "iso", ResultKey: "iso_path", TargetPath: b.config.TargetPath, Url: b.config.ISOUrls, }, new(stepPrepareOutputDir), &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, new(stepCreateDisk), new(stepCopyDisk), new(stepResizeDisk), &common.StepHTTPServer{ HTTPDir: b.config.HTTPDir, HTTPPortMin: b.config.HTTPPortMin, HTTPPortMax: b.config.HTTPPortMax, }, new(stepForwardSSH), new(stepConfigureVNC), steprun, &stepBootWait{}, &stepTypeBootCommand{}, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, SSHPort: commPort, }, new(common.StepProvision), new(stepShutdown), new(stepConvertDisk), } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("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.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(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, state: make(map[string]interface{}), } artifact.state["diskName"] = state.Get("disk_filename").(string) artifact.state["diskType"] = b.config.Format artifact.state["diskSize"] = uint64(b.config.DiskSize) artifact.state["domainType"] = b.config.Accelerator return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, err := b.config.Region() if err != nil { return nil, err } 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 := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Required by StepRunSourceInstance. Seems a better alternative // to duplicating ~300 lines of code just to remove it as a dependency state.Put("keyPair", "") // Build the steps steps := []multistep.Step{ &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &winawscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, WinRMPort: b.config.WinRMPort, VpcId: b.config.VpcId, }, &winawscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "ebs", SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, IamInstanceProfile: b.config.IamInstanceProfile, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, winawscommon.NewConnectStep(ec2conn, b.config.WinRMPrivateIp, b.config.WinRMConfig), &common.StepProvision{}, &stepStopInstance{SpotPrice: b.config.SpotPrice}, // TODO(mitchellh): verify works with spots &stepModifyInstance{}, &stepCreateAMI{}, &awscommon.StepAMIRegionCopy{ Regions: b.config.AMIRegions, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
func (self *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { //Setup XAPI client client := xsclient.NewXenAPIClient(self.config.HostIp, self.config.Username, self.config.Password) artifactState := make(map[string]interface{}) err := client.Login() if err != nil { return nil, err.(error) } ui.Say("XAPI client session established") client.GetHosts() //Share state between the other steps using a statebag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("client", client) state.Put("config", self.config) state.Put("commonconfig", self.config.CommonConfig) state.Put("hook", hook) state.Put("ui", ui) httpReqChan := make(chan string, 1) //Build the steps steps := []multistep.Step{ &xscommon.StepPrepareOutputDir{ Force: self.config.PackerForce, Path: self.config.OutputDir, }, &xscommon.StepPrepareNfsExport{ NfsMount: self.config.NfsMount, }, &xscommon.StepHTTPServer{ Chan: httpReqChan, }, new(stepSnapshotInstance), &xscommon.StepStartOnHIMN{ PingTest: false, }, new(xscommon.StepGetVNCPort), &xscommon.StepForwardPortOverSSH{ RemotePort: xscommon.InstanceVNCPort, RemoteDest: xscommon.InstanceVNCIP, HostPortMin: self.config.HostPortMin, HostPortMax: self.config.HostPortMax, ResultKey: "local_vnc_port", }, &stepCopyCleanScript{ ScriptUrl: self.config.ScriptUrl, }, new(xscommon.StepBootWait), &xscommon.StepTypeBootCommand{ Ctx: self.config.ctx, }, new(xscommon.StepWaitForShutdown), new(stepRestoreNetwork), new(xscommon.StepStartVm), &xscommon.StepWaitForIP{ Chan: httpReqChan, Timeout: self.config.BootTimeout, // @todo change this }, &xscommon.StepForwardPortOverSSH{ // do this again as could have new host and IP RemotePort: xscommon.InstanceSSHPort, RemoteDest: xscommon.InstanceSSHIP, HostPortMin: self.config.HostPortMin, HostPortMax: self.config.HostPortMax, ResultKey: "local_ssh_port", }, &communicator.StepConnectSSH{ Config: &self.config.SSHConfig.Comm, Host: xscommon.CommHost, SSHConfig: xscommon.SSHConfigFunc(self.config.CommonConfig.SSHConfig), SSHPort: xscommon.SSHPort, }, new(common.StepProvision), new(xscommon.StepShutdown), &xscommon.StepExport{ OutputFormat: self.config.Format, }, } self.runner = &multistep.BasicRunner{Steps: steps} self.runner.Run(state) if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } if len(state.Get("virtualization_type").(string)) == 0 { artifactState["virtualizationType"] = "PV" } else { artifactState["virtualizationType"] = "HVM" } value, found := state.Get("configured_disk").(string) if found { artifactState["diskSize"] = value } value, found = state.Get("configured_ram").(string) if found { artifactState["ramSize"] = value } artifactState["vm_name"] = self.config.VMName artifact, _ := xscommon.NewArtifact(self.config.OutputDir, artifactState, state.Get("export_files").([]string)) return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { api := brkt.NewAPIForCustomPortal(b.config.AccessToken, b.config.MacKey, b.config.PortalUrl) state := new(multistep.BasicStateBag) state.Put("api", api) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) steps := []multistep.Step{ &stepGetMachineType{ MinCpuCores: b.config.MachineTypeConfig.MinCpuCores, MinRam: b.config.MachineTypeConfig.MinRam, AvatarEnabled: b.config.WorkloadConfig.MetavisorEnabled, MachineType: b.config.MachineTypeConfig.MachineType, }, &stepGetZone{ Zone: b.config.WorkloadConfig.Zone, ComputingCell: b.config.WorkloadConfig.ComputingCell, }, &stepDeployInstance{ ImageDefinition: b.config.WorkloadConfig.ImageDefinition, BillingGroup: b.config.WorkloadConfig.BillingGroup, CloudConfig: b.config.WorkloadConfig.CloudConfig, SecurityGroup: b.config.WorkloadConfig.SecurityGroup, MetavisorEnabled: b.config.WorkloadConfig.MetavisorEnabled, }, &stepLoadKeyFile{ PrivateKeyFile: b.config.Comm.SSHPrivateKey, }, &communicator.StepConnect{ Config: &b.config.Comm, Host: SSHost, SSHConfig: SSHConfig(b.config.Comm.SSHUsername), }, &common.StepProvision{}, &stepCreateImage{ ImageName: b.config.ImageConfig.ImageName, }, } b.runner = &multistep.BasicRunner{Steps: steps} b.runner.Run(state) if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } imageId := state.Get("imageId").(string) imageName := state.Get("imageName").(string) artifact := Artifact{ ImageId: imageId, ImageName: imageName, BuilderIdValue: BuilderId, ApiClient: api.ApiClient, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver := &DockerDriver{Ctx: &b.config.ctx, Ui: ui} if err := driver.Verify(); err != nil { return nil, err } version, err := driver.Version() if err != nil { return nil, err } log.Printf("[DEBUG] Docker version: %s", version.String()) steps := []multistep.Step{ &StepTempDir{}, &StepPull{}, &StepRun{}, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig(&b.config.Comm), CustomConnect: map[string]multistep.Step{ "docker": &StepConnectDocker{}, }, }, &common.StepProvision{}, } if b.config.Discard { log.Print("[DEBUG] Container will be discarded") } else if b.config.Commit { log.Print("[DEBUG] Container will be committed") steps = append(steps, new(StepCommit)) } else if b.config.ExportPath != "" { log.Printf("[DEBUG] Container will be exported to %s", b.config.ExportPath) steps = append(steps, new(StepExport)) } else { return nil, errArtifactNotUsed } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Setup the driver that will talk to Docker state.Put("driver", driver) // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If it was cancelled, then just return if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, nil } // No errors, must've worked var artifact packer.Artifact if b.config.Commit { artifact = &ImportArtifact{ IdValue: state.Get("image_id").(string), BuilderIdValue: BuilderIdImport, Driver: driver, } } else { artifact = &ExportArtifact{path: b.config.ExportPath} } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { config, err := b.config.Config() if err != nil { return nil, err } session, err := session.NewSession(config) if err != nil { return nil, err } ec2conn := ec2.New(session) // If the subnet is specified but not the AZ, try to determine the AZ automatically if b.config.SubnetId != "" && b.config.AvailabilityZone == "" { log.Printf("[INFO] Finding AZ for the given subnet '%s'", b.config.SubnetId) resp, err := ec2conn.DescribeSubnets(&ec2.DescribeSubnetsInput{SubnetIds: []*string{&b.config.SubnetId}}) if err != nil { return nil, err } b.config.AvailabilityZone = *resp.Subnets[0].AvailabilityZone log.Printf("[INFO] AZ found: '%s'", b.config.AvailabilityZone) } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepPreValidate{ DestAmiName: b.config.AMIName, ForceDeregister: b.config.AMIForceDeregister, }, &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, AmiFilters: b.config.SourceAmiFilter, }, &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, SSHAgentAuth: b.config.Comm.SSHAgentAuth, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.SSHKeyPairName, TemporaryKeyPairName: b.config.TemporaryKeyPairName, PrivateKeyFile: b.config.RunConfig.Comm.SSHPrivateKey, }, &awscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, CommConfig: &b.config.RunConfig.Comm, VpcId: b.config.VpcId, }, &stepCleanupVolumes{ BlockDevices: b.config.BlockDevices, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "ebs", SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, IamInstanceProfile: b.config.IamInstanceProfile, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, EbsOptimized: b.config.EbsOptimized, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, InstanceInitiatedShutdownBehavior: b.config.InstanceInitiatedShutdownBehavior, }, &stepTagEBSVolumes{ VolumeRunTags: b.config.VolumeRunTags, }, &awscommon.StepGetPassword{ Debug: b.config.PackerDebug, Comm: &b.config.RunConfig.Comm, Timeout: b.config.WindowsPasswordTimeout, }, &communicator.StepConnect{ Config: &b.config.RunConfig.Comm, Host: awscommon.SSHHost( ec2conn, b.config.SSHPrivateIp), SSHConfig: awscommon.SSHConfig( b.config.RunConfig.Comm.SSHAgentAuth, b.config.RunConfig.Comm.SSHUsername, b.config.RunConfig.Comm.SSHPassword), }, &common.StepProvision{}, &awscommon.StepStopEBSBackedInstance{ SpotPrice: b.config.SpotPrice, DisableStopInstance: b.config.DisableStopInstance, }, &awscommon.StepModifyEBSBackedInstance{ EnableEnhancedNetworking: b.config.AMIEnhancedNetworking, }, &awscommon.StepDeregisterAMI{ ForceDeregister: b.config.AMIForceDeregister, ForceDeleteSnapshot: b.config.AMIForceDeleteSnapshot, AMIName: b.config.AMIName, }, &stepCreateAMI{}, &stepCreateEncryptedAMICopy{}, &awscommon.StepAMIRegionCopy{ AccessConfig: &b.config.AccessConfig, Regions: b.config.AMIRegions, Name: b.config.AMIName, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, SnapshotTags: b.config.SnapshotTags, }, } // Run! b.runner = common.NewRunner(steps, b.config.PackerConfig, ui) b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("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) { if runtime.GOOS != "linux" { return nil, errors.New("The amazon-chroot builder only works on Linux environments.") } region, err := b.config.Region() if err != nil { return nil, err } 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 := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepInstanceInfo{}, &StepSourceAMIInfo{}, &StepFlock{}, &StepPrepareDevice{}, &StepCreateVolume{}, &StepAttachVolume{}, &StepEarlyUnflock{}, &StepMountDevice{}, &StepMountExtra{}, &StepCopyFiles{}, &StepChrootProvision{}, &StepEarlyCleanup{}, &StepSnapshot{}, &StepRegisterAMI{}, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, }, &awscommon.StepAMIRegionCopy{ Regions: b.config.AMIRegions, Tags: b.config.AMITags, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("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) { // Initialize the Cloudstack API client client := gopherstack.CloudstackClient{}.New(b.config.APIURL, b.config.APIKey, b.config.SecretKey, b.config.InsecureSkipVerify) // Set up the state state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("client", client) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ new(stepHTTPServer), new(stepCreateSSHKeyPair), new(stepDeployVirtualMachine), new(stepVirtualMachineState), new(stepDetachIso), &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: b.config.sshTimeout, }, new(common.StepProvision), new(stepStopVirtualMachine), new(stepCreateTemplate), new(stepCreateTags), } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } if _, ok := state.GetOk("template_name"); !ok { log.Println("Failed to find template_name in state. Bug?") return nil, nil } artifact := &Artifact{ templateName: state.Get("template_name").(string), templateId: state.Get("template_id").(string), client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, err := b.config.Region() if err != nil { return nil, err } 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 := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepSourceAMIInfo{ SourceAmi: b.config.SourceAmi, EnhancedNetworking: b.config.AMIEnhancedNetworking, }, &winawscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, WinRMPort: b.config.WinRMPort, VpcId: b.config.VpcId, }, &winawscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, SpotPrice: b.config.SpotPrice, SpotPriceProduct: b.config.SpotPriceAutoProduct, InstanceType: b.config.InstanceType, IamInstanceProfile: b.config.IamInstanceProfile, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, winawscommon.NewConnectStep(ec2conn, b.config.WinRMPrivateIp, b.config.WinRMConfig), &common.StepProvision{}, &awsinstcommon.StepUploadX509Cert{}, &awsinstcommon.StepBundleVolume{ Debug: b.config.PackerDebug, }, &awsinstcommon.StepUploadBundle{ Debug: b.config.PackerDebug, }, &awsinstcommon.StepRegisterAMI{}, &awscommon.StepAMIRegionCopy{ Regions: b.config.AMIRegions, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
// Run implements the packer.Builder interface. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { b.ui = ui // Create a CloudStack API client. client := cloudstack.NewAsyncClient( b.config.APIURL, b.config.APIKey, b.config.SecretKey, !b.config.SSLNoVerify, ) // Set the time to wait before timing out client.AsyncTimeout(int64(b.config.AsyncTimeout.Seconds())) // Some CloudStack service providers only allow HTTP GET calls. client.HTTPGETOnly = b.config.HTTPGetOnly // Set up the state. state := new(multistep.BasicStateBag) state.Put("client", client) state.Put("config", b.config) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ &stepPrepareConfig{}, &stepCreateInstance{}, &stepSetupNetworking{}, &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, &common.StepProvision{}, &stepShutdownInstance{}, &stepCreateTemplate{}, } // Configure the runner. if b.config.PackerDebug { b.runner = &multistep.DebugRunner{ Steps: steps, PauseFn: common.MultistepDebugFn(ui), } } else { b.runner = &multistep.BasicRunner{Steps: steps} } // Run the steps. b.runner.Run(state) // If there are no templates, then just return template, ok := state.Get("template").(*cloudstack.CreateTemplateResponse) if !ok || template == nil { return nil, nil } // Build the artifact and return it artifact := &Artifact{ client: client, config: b.config, template: template, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { client := godo.NewClient(oauth2.NewClient(oauth2.NoContext, &apiTokenSource{ AccessToken: b.config.APIToken, })) if b.config.APIURL != "" { u, err := url.Parse(b.config.APIURL) if err != nil { return nil, fmt.Errorf("DigitalOcean: Invalid API URL, %s.", err) } client.BaseURL = u } // Set up the state state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("client", client) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &stepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("do_%s.pem", b.config.PackerBuildName), }, new(stepCreateDroplet), new(stepDropletInfo), &communicator.StepConnect{ Config: &b.config.Comm, Host: commHost, SSHConfig: sshConfig, }, new(common.StepProvision), new(stepShutdown), new(stepPowerOff), new(stepSnapshot), } // Run the steps b.runner = common.NewRunner(steps, b.config.PackerConfig, ui) b.runner.Run(state) // If there was an error, return that if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("snapshot_name"); !ok { log.Println("Failed to find snapshot_name in state. Bug?") return nil, nil } artifact := &Artifact{ snapshotName: state.Get("snapshot_name").(string), snapshotId: state.Get("snapshot_image_id").(int), regionName: state.Get("region").(string), client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { auth, err := b.config.AccessConfig.Auth() if err != nil { return nil, err } //fetches the api requisites from gophercloud for the appropriate //openstack variant api, err := gophercloud.PopulateApi(b.config.RunConfig.OpenstackProvider) if err != nil { return nil, err } api.Region = b.config.AccessConfig.Region() csp, err := gophercloud.ServersApi(auth, api) if err != nil { log.Printf("Region: %s", b.config.AccessConfig.Region()) return nil, err } // Setup the state bag and initial state for the steps state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("csp", csp) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("os_%s.pem", b.config.PackerBuildName), }, &StepRunSourceServer{ Name: b.config.ImageName, Flavor: b.config.Flavor, SourceImage: b.config.SourceImage, SecurityGroups: b.config.SecurityGroups, Networks: b.config.Networks, }, &StepWaitForRackConnect{ Wait: b.config.RackconnectWait, }, &StepAllocateIp{ FloatingIpPool: b.config.FloatingIpPool, FloatingIp: b.config.FloatingIp, }, &common.StepConnectSSH{ SSHAddress: SSHAddress(csp, b.config.SSHInterface, b.config.SSHPort), SSHConfig: SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &stepCreateImage{}, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no images, then just return if _, ok := state.GetOk("image"); !ok { return nil, nil } // Build the artifact and return it artifact := &Artifact{ ImageId: state.Get("image").(string), BuilderIdValue: BuilderId, Conn: csp, } return artifact, nil }
func (self *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { //Setup XAPI client client := xsclient.NewXenAPIClient(self.config.HostIp, self.config.Username, self.config.Password) err := client.Login() if err != nil { return nil, err.(error) } ui.Say("XAPI client session established") client.GetHosts() //Share state between the other steps using a statebag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("client", client) state.Put("config", self.config) state.Put("commonconfig", self.config.CommonConfig) state.Put("hook", hook) state.Put("ui", ui) httpReqChan := make(chan string, 1) //Build the steps steps := []multistep.Step{ &xscommon.StepPrepareOutputDir{ Force: self.config.PackerForce, Path: self.config.OutputDir, }, &xscommon.StepPrepareNfsExport{ NfsMount: self.config.NfsMount, }, &xscommon.StepIsoDownload{ IsoName: self.config.ISOName, SrName: self.config.ISOSRName, DlUrl: self.config.ISOUrl, ScriptUrl: self.config.ScriptUrl, }, &common.StepCreateFloppy{ Files: self.config.FloppyFiles, }, &xscommon.StepHTTPServer{ Chan: httpReqChan, }, &xscommon.StepUploadVdi{ VdiNameFunc: func() string { return "Packer-floppy-disk" }, ImagePathFunc: func() string { if floppyPath, ok := state.GetOk("floppy_path"); ok { return floppyPath.(string) } return "" }, VdiUuidKey: "floppy_vdi_uuid", }, &xscommon.StepFindVdi{ VdiName: self.config.ToolsIsoName, VdiUuidKey: "tools_vdi_uuid", }, &xscommon.StepFindVdi{ VdiName: self.config.ISOName, VdiUuidKey: "iso_vdi_uuid", }, new(stepCreateInstance), &xscommon.StepAttachVdi{ VdiUuidKey: "floppy_vdi_uuid", VdiType: xsclient.Floppy, }, &xscommon.StepAttachVdi{ VdiUuidKey: "iso_vdi_uuid", VdiType: xsclient.CD, }, new(xscommon.StepStartVmPaused), new(xscommon.StepGetVNCPort), &xscommon.StepForwardPortOverSSH{ RemotePort: xscommon.InstanceVNCPort, RemoteDest: xscommon.InstanceVNCIP, HostPortMin: self.config.HostPortMin, HostPortMax: self.config.HostPortMax, ResultKey: "local_vnc_port", }, new(xscommon.StepBootWait), &xscommon.StepTypeBootCommand{ Ctx: self.config.ctx, }, new(xscommon.StepWaitForShutdown), &xscommon.StepDetachVdi{ VdiUuidKey: "iso_vdi_uuid", }, &xscommon.StepAttachVdi{ VdiUuidKey: "tools_vdi_uuid", VdiType: xsclient.CD, }, new(xscommon.StepStartVmPaused), new(xscommon.StepBootWait), &xscommon.StepWaitForIP{ // do this again as could have new host and IP Chan: httpReqChan, Timeout: self.config.InstallTimeout, // @todo change this }, &xscommon.StepForwardPortOverSSH{ RemotePort: xscommon.InstanceSSHPort, RemoteDest: xscommon.InstanceSSHIP, HostPortMin: self.config.HostPortMin, HostPortMax: self.config.HostPortMax, ResultKey: "local_ssh_port", }, &communicator.StepConnect{ Config: &self.config.SSHConfig.Comm, Host: xscommon.CommHost, SSHConfig: xscommon.SSHConfigFunc(self.config.CommonConfig.SSHConfig), SSHPort: xscommon.SSHPort, }, new(xscommon.StepShutdown), &xscommon.StepDetachVdi{ VdiUuidKey: "floppy_vdi_uuid", }, new(xscommon.StepStartVmPaused), new(xscommon.StepBootWait), &xscommon.StepWaitForIP{ // do this again as could have new host and IP Chan: httpReqChan, Timeout: self.config.InstallTimeout, // @todo change this }, &xscommon.StepForwardPortOverSSH{ RemotePort: xscommon.InstanceSSHPort, RemoteDest: xscommon.InstanceSSHIP, HostPortMin: self.config.HostPortMin, HostPortMax: self.config.HostPortMax, ResultKey: "local_ssh_port", }, /*&common.StepConnectSSH{ SSHAddress: xscommon.SSHLocalAddress, SSHConfig: xscommon.SSHConfig, SSHWaitTimeout: self.config.SSHWaitTimeout, },*/ &communicator.StepConnectSSH{ Config: &self.config.SSHConfig.Comm, Host: xscommon.CommHost, SSHConfig: xscommon.SSHConfigFunc(self.config.CommonConfig.SSHConfig), SSHPort: xscommon.SSHPort, }, new(common.StepProvision), new(xscommon.StepShutdown), &xscommon.StepDetachVdi{ VdiUuidKey: "tools_vdi_uuid", }, &xscommon.StepExport{ OutputFormat: self.config.Format, }, } self.runner = &multistep.BasicRunner{Steps: steps} self.runner.Run(state) if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } artifactState := make(map[string]interface{}) if len(state.Get("virtualization_type").(string)) == 0 { artifactState["virtualizationType"] = "PV" } else { artifactState["virtualizationType"] = "HVM" } artifactState["diskSize"] = fmt.Sprintf("%d", self.config.DiskSize) artifactState["ramSize"] = fmt.Sprintf("%d", self.config.VMMemory) artifactState["vm_name"] = self.config.VMName artifact, _ := xscommon.NewArtifact(self.config.OutputDir, artifactState, state.Get("export_files").([]string)) return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriver(&b.config) if err != nil { return nil, fmt.Errorf("Failed creating VMware driver: %s", err) } // Seed the random number generator rand.Seed(time.Now().UTC().UnixNano()) steps := []multistep.Step{ &stepPrepareTools{}, &common.StepDownload{ Checksum: b.config.ISOChecksum, ChecksumType: b.config.ISOChecksumType, Description: "ISO", ResultKey: "iso_path", Url: b.config.ISOUrls, }, &stepPrepareOutputDir{}, &common.StepCreateFloppy{ Files: b.config.FloppyFiles, }, &stepRemoteUpload{ Key: "iso_path", Message: "Uploading ISO to remote machine...", }, &stepCreateDisk{}, &stepCreateVMX{}, &stepSuppressMessages{}, &stepHTTPServer{}, &stepConfigureVNC{}, &stepRun{}, &stepTypeBootCommand{}, &common.StepConnectSSH{ SSHAddress: driver.SSHAddress, SSHConfig: sshConfig, SSHWaitTimeout: b.config.sshWaitTimeout, NoPty: b.config.SSHSkipRequestPty, }, &stepUploadTools{}, &common.StepProvision{}, &stepShutdown{}, &stepCleanFiles{}, &stepCleanVMX{}, &stepCompactDisk{}, } // Setup the state bag state := new(multistep.BasicStateBag) state.Put("cache", cache) state.Put("config", &b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("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.GetOk("error"); ok { return nil, rawErr.(error) } // If we were interrupted or cancelled, then just exit. if _, ok := state.GetOk(multistep.StateCancelled); ok { return nil, errors.New("Build was cancelled.") } if _, ok := state.GetOk(multistep.StateHalted); ok { return nil, errors.New("Build was halted.") } // Compile the artifact list files, err := state.Get("dir").(OutputDir).ListFiles() if err != nil { return nil, err } // Set the proper builder ID builderId := BuilderId if b.config.RemoteType != "" { builderId = BuilderIdESX } return &Artifact{ builderId: builderId, dir: b.config.OutputDir, f: files, }, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { // Initialize the DO API client client, err := vultr.NewClient(b.config.APIKey) if err != nil { return nil, err } // Set up the state state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("client", client) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ new(stepCreateServer), new(stepServerInfo), &communicator.StepConnectSSH{ Host: sshAddress, SSHConfig: sshConfig, }, new(common.StepProvision), new(stepShutdown), new(stepHalt), 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.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("snapshot_name"); !ok { log.Println("Failed to find snapshot_name in state. Bug?") return nil, nil } var region string // GetId ensures we have an idea and then we get the label. We ignore errors because they would have shown earlier region_id, _ := client.Params.GetId("region", b.config.Region) region, _ = client.Params.GetLabel("region", region_id) if err != nil { return nil, err } artifact := &Artifact{ snapshotName: state.Get("snapshot_name").(string), snapshotId: state.Get("snapshot_id").(string), regionName: region, client: client, } return artifact, nil }
func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { region, err := b.config.Region() if err != nil { return nil, err } 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 := new(multistep.BasicStateBag) state.Put("config", &b.config) state.Put("ec2", ec2conn) state.Put("hook", hook) state.Put("ui", ui) // Build the steps steps := []multistep.Step{ &awscommon.StepKeyPair{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("ec2_%s.pem", b.config.PackerBuildName), KeyPairName: b.config.TemporaryKeyPairName, PrivateKeyFile: b.config.SSHPrivateKeyFile, }, &awscommon.StepSecurityGroup{ SecurityGroupIds: b.config.SecurityGroupIds, SSHPort: b.config.SSHPort, VpcId: b.config.VpcId, }, &awscommon.StepRunSourceInstance{ Debug: b.config.PackerDebug, ExpectedRootDevice: "instance-store", InstanceType: b.config.InstanceType, IamInstanceProfile: b.config.IamInstanceProfile, UserData: b.config.UserData, UserDataFile: b.config.UserDataFile, SourceAMI: b.config.SourceAmi, SubnetId: b.config.SubnetId, AssociatePublicIpAddress: b.config.AssociatePublicIpAddress, AvailabilityZone: b.config.AvailabilityZone, BlockDevices: b.config.BlockDevices, Tags: b.config.RunTags, }, &common.StepConnectSSH{ SSHAddress: awscommon.SSHAddress(ec2conn, b.config.SSHPort), SSHConfig: awscommon.SSHConfig(b.config.SSHUsername), SSHWaitTimeout: b.config.SSHTimeout(), }, &common.StepProvision{}, &StepUploadX509Cert{}, &StepBundleVolume{}, &StepUploadBundle{}, &StepRegisterAMI{}, &awscommon.StepAMIRegionCopy{ Regions: b.config.AMIRegions, }, &awscommon.StepModifyAMIAttributes{ Description: b.config.AMIDescription, Users: b.config.AMIUsers, Groups: b.config.AMIGroups, ProductCodes: b.config.AMIProductCodes, }, &awscommon.StepCreateTags{ Tags: b.config.AMITags, }, } // 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.GetOk("error"); ok { return nil, rawErr.(error) } // If there are no AMIs, then just return if _, ok := state.GetOk("amis"); !ok { return nil, nil } // Build the artifact and return it artifact := &awscommon.Artifact{ Amis: state.Get("amis").(map[string]string), BuilderIdValue: BuilderId, Conn: ec2conn, } return artifact, nil }
// Run executes a googlecompute Packer build and returns a packer.Artifact // representing a GCE machine image. func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { driver, err := NewDriverGCE( ui, b.config.ProjectId, &b.config.account) if err != nil { return nil, err } // Set up the state. state := new(multistep.BasicStateBag) state.Put("config", b.config) state.Put("driver", driver) state.Put("hook", hook) state.Put("ui", ui) // Build the steps. steps := []multistep.Step{ new(StepCheckExistingImage), &StepCreateSSHKey{ Debug: b.config.PackerDebug, DebugKeyPath: fmt.Sprintf("gce_%s.pem", b.config.PackerBuildName), }, &StepCreateInstance{ Debug: b.config.PackerDebug, }, &StepInstanceInfo{ Debug: b.config.PackerDebug, }, &common.StepConnectSSH{ SSHAddress: sshAddress, SSHConfig: sshConfig, SSHWaitTimeout: 5 * time.Minute, }, new(common.StepProvision), new(StepTeardownInstance), new(StepCreateImage), } // 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) // Report any errors. if rawErr, ok := state.GetOk("error"); ok { return nil, rawErr.(error) } if _, ok := state.GetOk("image_name"); !ok { log.Println("Failed to find image_name in state. Bug?") return nil, nil } artifact := &Artifact{ imageName: state.Get("image_name").(string), driver: driver, } return artifact, nil }