Skip to content

Commit

Permalink
adding force_deregister (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
wolfganghuse authored Nov 7, 2022
1 parent bf659ad commit 8e24259
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 5 deletions.
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

0 comments on commit 8e24259

Please sign in to comment.