def delete_keystone_trust(username): """ Deletes the Keystone trust for a user account. :param username: The user's username. """ user = _get_user(username) if not config.get('openstack.identity_api_url'): raise BadRequest400("OpenStack Integration is not enabled") if not user.can_edit_keystone_trust(identity.current.user): raise Forbidden403('Cannot edit Keystone trust of user %s' % username) if not user.openstack_trust_id: raise BadRequest400('No Keystone trust created by %s' % user) try: manager = dynamic_virt.VirtManager(user) manager.delete_keystone_trust() except ValueError as e: # If we can't create a VirtManager we presume that the trust has been # invalidated by different means. log.debug(e.message) old_trust_id = user.openstack_trust_id user.openstack_trust_id = None user.record_activity(user=identity.current.user, service=u'HTTP', field=u'OpenStack Trust ID', action=u'Deleted', old=old_trust_id) return '', 204
def provision_virt_recipe(recipe_id): log.debug('Attempting to provision dynamic virt guest for recipe %s', recipe_id) session.begin() try: recipe = Recipe.by_id(recipe_id) manager = dynamic_virt.VirtManager(recipe.recipeset.job.owner) available_flavors = manager.available_flavors() # We want them in order of smallest to largest, so that we can pick the # smallest flavor that satisfies the recipe's requirements. Sorting by RAM # is a decent approximation. possible_flavors = XmlHost.from_string(recipe.host_requires)\ .filter_openstack_flavors(available_flavors, manager.lab_controller) if not possible_flavors: log.debug('No OpenStack flavors matched recipe %s, marking precluded', recipe.id) recipe.virt_status = RecipeVirtStatus.precluded return possible_flavors = sorted(possible_flavors, key=lambda flavor: flavor.ram) flavor = possible_flavors[0] vm_name = '%srecipe-%s' % ( ConfigItem.by_name(u'guest_name_prefix').current_value(u'beaker-'), recipe.id) # FIXME can we control use of virtio? #virtio_possible = True #if self.recipe.distro_tree.distro.osversion.osmajor.osmajor == "RedHatEnterpriseLinux3": # virtio_possible = False vm = manager.create_vm(vm_name, flavor) vm.instance_created = datetime.utcnow() try: recipe.createRepo() recipe.systems = [] recipe.watchdog = Watchdog() recipe.resource = vm recipe.recipeset.lab_controller = manager.lab_controller recipe.virt_status = RecipeVirtStatus.succeeded recipe.schedule() log.info("recipe ID %s moved from Queued to Scheduled by provision_virt_recipe" % recipe.id) recipe.waiting() recipe.provision() log.info("recipe ID %s moved from Scheduled to Waiting by provision_virt_recipe" % recipe.id) except: exc_type, exc_value, exc_tb = sys.exc_info() try: manager.destroy_vm(vm) except Exception: log.exception('Failed to clean up vm %s ' 'during provision_virt_recipe, leaked!', vm.instance_id) # suppress this exception so the original one is not masked raise exc_type, exc_value, exc_tb session.commit() except Exception, e: log.exception('Error in provision_virt_recipe(%s)', recipe_id) session.rollback() # As an added precaution, let's try and avoid this recipe in future with session.begin(): recipe = Recipe.by_id(recipe_id) recipe.virt_status = RecipeVirtStatus.failed
def console_output(self, recipe_id, output_length=None, offset=None): """ Get text console log output from OpenStack """ try: recipe = Recipe.by_id(recipe_id) except InvalidRequestError: raise BX(_('Invalid recipe ID: %s' % recipe_id)) manager = dynamic_virt.VirtManager(recipe.recipeset.job.owner) return manager.get_console_output(recipe.resource.instance_id, output_length)
def delete_keystone_trust(username): """ Deletes the Keystone trust for a user account. :param username: The user's username. """ user = _get_user(username) if not config.get('openstack.identity_api_url'): raise BadRequest400("OpenStack Integration is not enabled") if not user.can_edit_keystone_trust(identity.current.user): raise Forbidden403('Cannot edit Keystone trust of user %s' % username) if not user.openstack_trust_id: raise BadRequest400('No Keystone trust created by %s' % user) manager = dynamic_virt.VirtManager(user) manager.delete_keystone_trust() old_trust_id = user.openstack_trust_id user.openstack_trust_id = None user.record_activity(user=identity.current.user, service=u'HTTP', field=u'OpenStack Trust ID', action=u'Deleted', old=old_trust_id) return '', 204
def provision_virt_recipe(recipe_id): log.debug('Attempting to provision dynamic virt guest for recipe %s', recipe_id) session.begin() try: recipe = Recipe.by_id(recipe_id) job_owner = recipe.recipeset.job.owner manager = dynamic_virt.VirtManager(job_owner) available_flavors = manager.available_flavors() # We want them in order of smallest to largest, so that we can pick the # smallest flavor that satisfies the recipe's requirements. Sorting by RAM # is a decent approximation. possible_flavors = XmlHost.from_string(recipe.host_requires)\ .filter_openstack_flavors(available_flavors, manager.lab_controller) if not possible_flavors: log.info( 'No OpenStack flavors matched recipe %s, marking precluded', recipe.id) recipe.virt_status = RecipeVirtStatus.precluded return # cheapest flavor has the smallest disk and ram # id guarantees consistency of our results flavor = min(possible_flavors, key=lambda flavor: (flavor.ram, flavor.disk, flavor.id)) vm_name = '%srecipe-%s' % (ConfigItem.by_name( u'guest_name_prefix').current_value(u'beaker-'), recipe.id) log.debug('Creating VM named %s as flavor %s', vm_name, flavor) vm = manager.create_vm(vm_name, flavor) vm.instance_created = datetime.utcnow() try: recipe.createRepo() recipe.clear_candidate_systems() recipe.watchdog = Watchdog() recipe.resource = vm recipe.recipeset.lab_controller = manager.lab_controller recipe.virt_status = RecipeVirtStatus.succeeded recipe.schedule() log.info( "recipe ID %s moved from Queued to Scheduled by provision_virt_recipe", recipe.id) recipe.waiting() recipe.provision() log.info( "recipe ID %s moved from Scheduled to Waiting by provision_virt_recipe", recipe.id) except: exc_type, exc_value, exc_tb = sys.exc_info() try: manager.destroy_vm(vm) except Exception: log.exception( 'Failed to clean up VM %s during provision_virt_recipe, leaked!', vm.instance_id) # suppress this exception so the original one is not masked raise exc_type, exc_value, exc_tb session.commit() except Exception as e: log.exception('Error in provision_virt_recipe(%s)', recipe_id) session.rollback() # As an added precaution, let's try and avoid this recipe in future with session.begin(): recipe = Recipe.by_id(recipe_id) recipe.virt_status = RecipeVirtStatus.failed finally: session.close()