~usc-isi/nova/hpc-trunk

« back to all changes in this revision

Viewing changes to nova/virt/xenapi/vmops.py

  • Committer: Lorin Hochstein
  • Date: 2011-08-25 16:40:05 UTC
  • mfrom: (662.621.209 nova)
  • Revision ID: lorin@isi.edu-20110825164005-fkbcxu0ikwpxdq6r
Merged upstream revision 1492 with resolved conflicts

Show diffs side-by-side

added added

removed removed

Lines of Context:
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,
142
142
                disk_image_type)
143
143
        return vdis
182
182
        try:
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',
235
235
 
236
236
            raise vm_create_error
237
237
 
238
 
        VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
239
 
                vdi_ref=first_vdi_ref, userdevice=0, bootable=True)
 
238
        # Add disks to VM
 
239
        self._attach_disks(instance, disk_image_type, vm_ref, first_vdi_ref,
 
240
            vdis)
 
241
 
 
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)
 
247
 
 
248
        self.create_vifs(vm_ref, instance, network_info)
 
249
        self.inject_network_info(instance, network_info, vm_ref)
 
250
        return vm_ref
 
251
 
 
252
    def _attach_disks(self, instance, disk_image_type, vm_ref, first_vdi_ref,
 
253
            vdis):
 
254
        # device 0 reserved for RW disk
 
255
        userdevice = 0
 
256
 
 
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 "
 
260
                  "install")
 
261
 
 
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)
 
265
 
 
266
            VMHelper.create_vbd(session=self._session, vm_ref=vm_ref,
 
267
                vdi_ref=first_vdi_ref, userdevice=userdevice, bootable=False)
 
268
 
 
269
            # device 1 reserved for rescue disk and we've used '0'
 
270
            userdevice = 2
 
271
            VMHelper.create_cd_vbd(session=self._session, vm_ref=vm_ref,
 
272
                    vdi_ref=cd_vdi_ref, userdevice=userdevice, bootable=True)
 
273
 
 
274
            # set user device to next free value
 
275
            userdevice += 1
 
276
        else:
 
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'
 
281
            userdevice = 2
240
282
 
241
283
        # Attach any other disks
242
 
        # userdevice 1 is reserved for rescue
243
 
        userdevice = 2
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.
251
291
                    bootable=False)
252
292
            userdevice += 1
253
293
 
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)
258
 
 
259
 
        self.create_vifs(vm_ref, instance, network_info)
260
 
        self.inject_network_info(instance, network_info, vm_ref)
261
 
        return vm_ref
262
 
 
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())
681
712
            return None
682
 
        db.instance_update(nova_context.get_admin_context(),
683
 
                                  instance['id'],
684
 
                                  dict(admin_pass=new_pass))
685
713
        return resp['message']
686
714
 
687
715
    def inject_file(self, instance, path, contents):