1- package iso
1+ package common
22
33import (
44 "context"
@@ -9,18 +9,21 @@ import (
99 "github.com/hashicorp/packer-plugin-sdk/packer"
1010 xenapi "github.com/terra-farm/go-xen-api-client"
1111 xsclient "github.com/terra-farm/go-xen-api-client"
12- xscommon "github.com/xenserver/packer-builder-xenserver/builder/xenserver/common"
1312)
1413
15- type stepCreateInstance struct {
14+ type StepCreateInstance struct {
15+ // The XVA builder assumes it will boot an instance with an OS installed on its disks
16+ // while the ISO builder needs packer to create a disk for an OS to be installed on.
17+ AssumePreInstalledOS bool
18+
1619 instance * xsclient.VMRef
1720 vdi * xsclient.VDIRef
1821}
1922
20- func (self * stepCreateInstance ) Run (ctx context.Context , state multistep.StateBag ) multistep.StepAction {
23+ func (self * StepCreateInstance ) Run (ctx context.Context , state multistep.StateBag ) multistep.StepAction {
2124
22- c := state .Get ("client" ).(* xscommon. Connection )
23- config := state .Get ("config" ).(xscommon. Config )
25+ c := state .Get ("client" ).(* Connection )
26+ config := state .Get ("config" ).(Config )
2427 ui := state .Get ("ui" ).(packer.Ui )
2528
2629 ui .Say ("Step: Create Instance" )
@@ -101,43 +104,45 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
101104 }
102105 }
103106
104- err = c .GetClient ().VM .RemoveFromOtherConfig (c .GetSessionRef (), instance , "disks" )
105- if err != nil {
106- ui .Error (fmt .Sprintf ("Error removing disks from VM other-config: %s" , err .Error ()))
107- return multistep .ActionHalt
108- }
107+ if ! self .AssumePreInstalledOS {
108+ err = c .GetClient ().VM .RemoveFromOtherConfig (c .GetSessionRef (), instance , "disks" )
109+ if err != nil {
110+ ui .Error (fmt .Sprintf ("Error removing disks from VM other-config: %s" , err .Error ()))
111+ return multistep .ActionHalt
112+ }
109113
110- // Create VDI for the instance
111- sr , err := config .GetSR (c )
114+ // Create VDI for the instance
115+ sr , err := config .GetSR (c )
112116
113- if err != nil {
114- ui .Error (fmt .Sprintf ("Unable to get SR: %s" , err .Error ()))
115- return multistep .ActionHalt
116- }
117+ if err != nil {
118+ ui .Error (fmt .Sprintf ("Unable to get SR: %s" , err .Error ()))
119+ return multistep .ActionHalt
120+ }
117121
118- ui .Say (fmt .Sprintf ("Using the following SR for the VM: %s" , sr ))
119-
120- vdi , err := c .GetClient ().VDI .Create (c .GetSessionRef (), xenapi.VDIRecord {
121- NameLabel : "Packer-disk" ,
122- VirtualSize : int (config .DiskSize * 1024 * 1024 ),
123- Type : "user" ,
124- Sharable : false ,
125- ReadOnly : false ,
126- SR : sr ,
127- OtherConfig : map [string ]string {
128- "temp" : "temp" ,
129- },
130- })
131- if err != nil {
132- ui .Error (fmt .Sprintf ("Unable to create packer disk VDI: %s" , err .Error ()))
133- return multistep .ActionHalt
134- }
135- self .vdi = & vdi
122+ ui .Say (fmt .Sprintf ("Using the following SR for the VM: %s" , sr ))
123+
124+ vdi , err := c .GetClient ().VDI .Create (c .GetSessionRef (), xenapi.VDIRecord {
125+ NameLabel : "Packer-disk" ,
126+ VirtualSize : int (config .DiskSize * 1024 * 1024 ),
127+ Type : "user" ,
128+ Sharable : false ,
129+ ReadOnly : false ,
130+ SR : sr ,
131+ OtherConfig : map [string ]string {
132+ "temp" : "temp" ,
133+ },
134+ })
135+ if err != nil {
136+ ui .Error (fmt .Sprintf ("Unable to create packer disk VDI: %s" , err .Error ()))
137+ return multistep .ActionHalt
138+ }
139+ self .vdi = & vdi
136140
137- err = xscommon .ConnectVdi (c , instance , vdi , xsclient .VbdTypeDisk )
138- if err != nil {
139- ui .Error (fmt .Sprintf ("Unable to connect packer disk VDI: %s" , err .Error ()))
140- return multistep .ActionHalt
141+ err = ConnectVdi (c , instance , vdi , xsclient .VbdTypeDisk )
142+ if err != nil {
143+ ui .Error (fmt .Sprintf ("Unable to connect packer disk VDI: %s" , err .Error ()))
144+ return multistep .ActionHalt
145+ }
141146 }
142147
143148 // Connect Network
@@ -174,7 +179,7 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
174179 }
175180
176181 log .Printf ("Creating VIF on network '%s' on VM '%s'\n " , network , instance )
177- _ , err = xscommon . ConnectNetwork (c , network , instance , "0" )
182+ _ , err = ConnectNetwork (c , network , instance , "0" )
178183
179184 if err != nil {
180185 ui .Error (fmt .Sprintf ("Failed to create VIF with error: %v" , err ))
@@ -203,7 +208,7 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
203208
204209 //we need the VIF index string
205210 vifIndexString := fmt .Sprintf ("%d" , i )
206- _ , err = xscommon . ConnectNetwork (c , networks [0 ], instance , vifIndexString )
211+ _ , err = ConnectNetwork (c , networks [0 ], instance , vifIndexString )
207212
208213 if err != nil {
209214 ui .Say (fmt .Sprintf ("Failed to connect VIF with error: %v" , err .Error ()))
@@ -223,14 +228,14 @@ func (self *stepCreateInstance) Run(ctx context.Context, state multistep.StateBa
223228 return multistep .ActionContinue
224229}
225230
226- func (self * stepCreateInstance ) Cleanup (state multistep.StateBag ) {
227- config := state .Get ("config" ).(xscommon. Config )
231+ func (self * StepCreateInstance ) Cleanup (state multistep.StateBag ) {
232+ config := state .Get ("config" ).(Config )
228233 if config .ShouldKeepVM (state ) {
229234 return
230235 }
231236
232237 ui := state .Get ("ui" ).(packer.Ui )
233- c := state .Get ("client" ).(* xscommon. Connection )
238+ c := state .Get ("client" ).(* Connection )
234239
235240 if self .instance != nil {
236241 ui .Say ("Destroying VM" )
0 commit comments