Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

overwrite images #58

Merged
merged 4 commits into from
Nov 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion builder/nutanix/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ const (

type Config struct {
common.PackerConfig `mapstructure:",squash"`
CommConfig communicator.Config `mapstructure:",squash"`
CommConfig communicator.Config `mapstructure:",squash"`
commonsteps.CDConfig `mapstructure:",squash"`
shutdowncommand.ShutdownConfig `mapstructure:",squash"`
ClusterConfig `mapstructure:",squash"`
VmConfig `mapstructure:",squash"`
ForceDeregister bool `mapstructure:"force_deregister" json:"force_deregister" required:"false"`


ctx interpolate.Context
}
Expand Down
2 changes: 2 additions & 0 deletions builder/nutanix/config.hcl2spec.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

39 changes: 37 additions & 2 deletions builder/nutanix/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ type Driver interface {
PowerOff(string) error
UploadImage(string, VmConfig) (*nutanixImage, error)
DeleteImage(string) error
SaveVMDisk(string, string) (*nutanixImage, error)
SaveVMDisk(string, string, bool) (*nutanixImage, error)
WaitForShutdown(string, <-chan struct{}) bool
}

Expand Down Expand Up @@ -640,7 +640,7 @@ func (d *NutanixDriver) PowerOff(vmUUID string) error {
log.Printf("PowerOff task: %s", taskUUID)
return nil
}
func (d *NutanixDriver) SaveVMDisk(diskUUID string, imageName string) (*nutanixImage, error) {
func (d *NutanixDriver) SaveVMDisk(diskUUID string, imageName string, ForceDeregister bool) (*nutanixImage, error) {

configCreds := client.Credentials{
URL: fmt.Sprintf("%s:%d", d.ClusterConfig.Endpoint, d.ClusterConfig.Port),
Expand All @@ -656,6 +656,41 @@ func (d *NutanixDriver) SaveVMDisk(diskUUID string, imageName string) (*nutanixI
return nil, fmt.Errorf("error while NewV3Client, %s", err.Error())
}

// When force_deregister, check if image already exists
if ForceDeregister {
log.Println("force_deregister is set, check if image already exists")
ImageList, err:=conn.V3.ListAllImage(fmt.Sprintf("name==%s",imageName))
if err != nil {
return nil, fmt.Errorf("error while ListAllImage, %s", err.Error())
}
if *ImageList.Metadata.TotalMatches==0 {
log.Println("Image with given Name not found, no need to deregister")
} else if *ImageList.Metadata.TotalMatches>1 {
log.Println("More than one image with given Name found, will not deregister")
} else if *ImageList.Metadata.TotalMatches==1 {
log.Println("Exactly one image with given Name found, will deregister")
resp,err:= conn.V3.DeleteImage(*ImageList.Entities[0].Metadata.UUID)
if err != nil {
return nil, fmt.Errorf("error while DeleteImage, %s", err.Error())
}
taskUUID := resp.Status.ExecutionContext.TaskUUID.(string)
log.Printf("Wait until delete Image %s is finished, %s\n",*ImageList.Entities[0].Metadata.UUID,taskUUID)
// Wait for the Image to be deleted
for i := 0; i < 1200; i++ {
resp, err := conn.V3.GetTask(taskUUID)
if err != nil || *resp.Status != "SUCCEEDED" {
<-time.After(1 * time.Second)
continue
}
if *resp.Status == "SUCCEEDED" {
break
}
return nil, fmt.Errorf("error while Image Delete getting Task Status, %s", err.Error())
}


}
}
req := &v3.ImageIntentInput{
Spec: &v3.Image{
Name: &imageName,
Expand Down
2 changes: 1 addition & 1 deletion builder/nutanix/step_copy_image.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func (s *stepCopyImage) Run(ctx context.Context, state multistep.StateBag) multi
return multistep.ActionHalt
}

imageResponse, err := d.SaveVMDisk(diskToCopy, s.Config.VmConfig.ImageName)
imageResponse, err := d.SaveVMDisk(diskToCopy, s.Config.VmConfig.ImageName, s.Config.ForceDeregister)
if err != nil {
ui.Error("Unexpected Nutanix Task status: " + err.Error())
state.Put("error", err)
Expand Down
3 changes: 2 additions & 1 deletion example/source.nutanix.pkr.hcl
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ source "nutanix" "centos" {
subnet_name = var.nutanix_subnet
}

image_name ="centos-{{isotime `Jan-_2-15:04:05`}}"
image_name = "centos-packer-image"
force_deregister = true
user_data = "I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGNlbnRvcwogICAgc3VkbzogWydBTEw9KEFMTCkgTk9QQVNTV0Q6QUxMJ10KY2hwYXNzd2Q6CiAgbGlzdDogfAogICAgY2VudG9zOnBhY2tlcgogIGV4cGlyZTogRmFsc2UKc3NoX3B3YXV0aDogVHJ1ZQ=="

shutdown_command = "echo 'packer' | sudo -S shutdown -P now"
Expand Down