137
137
def _create_disks(self, context, instance):
138
138
disk_image_type = VMHelper.determine_disk_image_type(instance)
139
139
vdis = VMHelper.fetch_image(context, self._session,
140
instance.id, instance.image_ref,
140
instance, instance.image_ref,
141
141
instance.user_id, instance.project_id,
183
183
if instance.kernel_id:
184
184
kernel = VMHelper.fetch_image(context, self._session,
185
instance.id, instance.kernel_id, instance.user_id,
185
instance, instance.kernel_id, instance.user_id,
186
186
instance.project_id, ImageType.KERNEL)[0]
187
187
if instance.ramdisk_id:
188
188
ramdisk = VMHelper.fetch_image(context, self._session,
189
instance.id, instance.kernel_id, instance.user_id,
189
instance, instance.ramdisk_id, instance.user_id,
190
190
instance.project_id, ImageType.RAMDISK)[0]
191
191
# Create the VM ref and attach the first disk
192
192
first_vdi_ref = self._session.call_xenapi('VDI.get_by_uuid',
236
236
raise vm_create_error
238
VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
239
vdi_ref=first_vdi_ref, userdevice=0, bootable=True)
239
self._attach_disks(instance, disk_image_type, vm_ref, first_vdi_ref,
242
# Alter the image before VM start for, e.g. network injection also
243
# alter the image if there's metadata.
244
if FLAGS.flat_injected or instance['metadata']:
245
VMHelper.preconfigure_instance(self._session, instance,
246
first_vdi_ref, network_info)
248
self.create_vifs(vm_ref, instance, network_info)
249
self.inject_network_info(instance, network_info, vm_ref)
252
def _attach_disks(self, instance, disk_image_type, vm_ref, first_vdi_ref,
254
# device 0 reserved for RW disk
257
# DISK_ISO needs two VBDs: the ISO disk and a blank RW disk
258
if disk_image_type == ImageType.DISK_ISO:
259
LOG.debug("detected ISO image type, going to create blank VM for "
262
cd_vdi_ref = first_vdi_ref
263
first_vdi_ref = VMHelper.fetch_blank_disk(session=self._session,
264
instance_type_id=instance.instance_type_id)
266
VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
267
vdi_ref=first_vdi_ref, userdevice=userdevice, bootable=False)
269
# device 1 reserved for rescue disk and we've used '0'
271
VMHelper.create_cd_vbd(session=self._session, vm_ref=vm_ref,
272
vdi_ref=cd_vdi_ref, userdevice=userdevice, bootable=True)
274
# set user device to next free value
277
VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
278
vdi_ref=first_vdi_ref, userdevice=userdevice, bootable=True)
279
# set user device to next free value
280
# userdevice 1 is reserved for rescue and we've used '0'
241
283
# Attach any other disks
242
# userdevice 1 is reserved for rescue
244
284
for vdi in vdis[1:]:
245
285
# vdi['vdi_type'] is either 'os' or 'swap', but we don't
246
286
# really care what it is right here.
254
# Alter the image before VM start for, e.g. network injection
255
if FLAGS.flat_injected:
256
VMHelper.preconfigure_instance(self._session, instance,
257
first_vdi_ref, network_info)
259
self.create_vifs(vm_ref, instance, network_info)
260
self.inject_network_info(instance, network_info, vm_ref)
263
294
def _spawn(self, instance, vm_ref):
264
295
"""Spawn a new instance."""
265
296
LOG.debug(_('Starting VM %s...'), vm_ref)
679
710
if resp['returncode'] != '0':
680
711
LOG.error(_('Failed to update password: %(resp)r') % locals())
682
db.instance_update(nova_context.get_admin_context(),
684
dict(admin_pass=new_pass))
685
713
return resp['message']
687
715
def inject_file(self, instance, path, contents):