def test_watchdog_show_non_running_task(self): with session.begin(): r1 = data_setup.create_recipe() data_setup.create_job_for_recipes([r1]) data_setup.mark_recipe_waiting(r1) out = run_client(['bkr', 'watchdog-show', '%s' % r1.tasks[0].id]) self.assertEquals(out, '%s: N/A\n' % r1.tasks[0].id, out)
def test_unknown_fqdns_dont_appear(self): # If we have a recipe where the FQDN is not known (for example # a guest that hasn't finished installing yet), previously it would # appear as the string 'None'. Now it's just not included. with session.begin(): hostrecipe = data_setup.create_recipe(role=u'SERVERS') guestrecipe = data_setup.create_guestrecipe(host=hostrecipe, role=u'CLIENTS') data_setup.create_job_for_recipes([hostrecipe, guestrecipe]) system = data_setup.create_system(fqdn=u'host.bz952948', lab_controller=self.lc) data_setup.mark_recipe_running(hostrecipe, system=system) data_setup.mark_recipe_waiting(guestrecipe) self.assertEquals(guestrecipe.resource.fqdn, None) self.server.auth.login_password(self.lc.user.user_name, u'logmein') self.assertEquals(self.server.recipes.tasks.peer_roles( hostrecipe.tasks[0].id), {'SERVERS': ['host.bz952948'], 'STANDALONE': ['host.bz952948'], 'CLIENTS': []}) self.assertEquals(self.server.recipes.tasks.peer_roles( guestrecipe.tasks[0].id), {'SERVERS': ['host.bz952948'], 'STANDALONE': ['host.bz952948'], 'CLIENTS': []})
def test_recipe_provisioned(self): with session.begin(): distro_tree = data_setup.create_distro_tree( arch=u'x86_64', osmajor=u'Fedora20', lab_controllers=[self.lc], urls=[ u'nfs://example.nfs.test:/path/to/os', u'http://example.com/ipxe-test/F20/x86_64/os/' ]) recipe = data_setup.create_recipe(distro_tree=distro_tree) data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) response.raise_for_status() self.assertEquals( response.text, """#!ipxe kernel http://example.com/ipxe-test/F20/x86_64/os/pxeboot/vmlinuz console=tty0 console=ttyS0,115200n8 ks=%s noverifyssl netboot_method=ipxe initrd http://example.com/ipxe-test/F20/x86_64/os/pxeboot/initrd boot """ % recipe.installation.rendered_kickstart.link)
def test_unknown_fqdns_dont_appear(self): # If we have a recipe where the FQDN is not known (for example # a guest that hasn't finished installing yet), previously it would # appear as the string 'None'. Now it's just not included. with session.begin(): hostrecipe = data_setup.create_recipe(role=u'SERVERS') guestrecipe = data_setup.create_guestrecipe(host=hostrecipe, role=u'CLIENTS') data_setup.create_job_for_recipes([hostrecipe, guestrecipe]) system = data_setup.create_system(fqdn=u'host.bz952948') data_setup.mark_recipe_running(hostrecipe, system=system) data_setup.mark_recipe_waiting(guestrecipe) self.assertEquals(guestrecipe.resource.fqdn, None) self.server.auth.login_password(self.lc.user.user_name, u'logmein') self.assertEquals( self.server.recipes.tasks.peer_roles(hostrecipe.tasks[0].id), { 'SERVERS': ['host.bz952948'], 'STANDALONE': ['host.bz952948'], 'CLIENTS': [] }) self.assertEquals( self.server.recipes.tasks.peer_roles(guestrecipe.tasks[0].id), { 'SERVERS': ['host.bz952948'], 'STANDALONE': [], 'CLIENTS': [] })
def test_handles_null_recipe_task_id(self): with session.begin(): dt = data_setup.create_distro_tree() running_recipe = data_setup.create_recipe(distro_tree=dt) waiting_recipe = data_setup.create_recipe(distro_tree=dt) job = data_setup.create_job_for_recipes([running_recipe, waiting_recipe]) data_setup.mark_recipe_running(running_recipe) data_setup.mark_recipe_waiting(waiting_recipe) self.assertEquals(waiting_recipe.watchdog.recipetask, None) b = self.browser b.get(get_server_base() + "watchdogs/") self.assertEquals(b.title, "Watchdogs")
def _make_command(lc=None, creation_date=None): job = data_setup.create_job(distro_tree=distro_tree) recipe = job.recipesets[0].recipes[0] system = data_setup.create_system(lab_controller=lc) data_setup.mark_recipe_waiting(recipe, system=system) command = CommandActivity( user=None, service=u'testdata', action=u'on', status=CommandStatus.running, callback=u'bkr.server.model.auto_cmd_handler') if creation_date is not None: command.created = command.updated = creation_date system.command_queue.append(command) return recipe.tasks[0], command
def test_reserves_system_when_recipe_waiting(self): # Anaconda installs the OS (Status: Installing) and reboots # beakerd comes along and calls update_dirty_jobs which sets the recipe to: Waiting data_setup.mark_recipe_waiting(self.recipe) # In the meantime however our task has finished really quickly, which # means the min_status is TaskStatus.completed and therefore finished data_setup.mark_recipe_tasks_finished(self.recipe, only=True) # beakerd hasn't come along and updated our recipe yet, so it's still # in waiting self.assertEqual(self.recipe.status, TaskStatus.waiting) # Now beakerd updates it and should reserve our system self.job.update_status() self.assertEqual(self.recipe.status, TaskStatus.reserved)
def test_handles_null_recipe_task_id(self): with session.begin(): dt = data_setup.create_distro_tree() running_recipe = data_setup.create_recipe(distro_tree=dt) waiting_recipe = data_setup.create_recipe(distro_tree=dt) job = data_setup.create_job_for_recipes( [running_recipe, waiting_recipe]) data_setup.mark_recipe_running(running_recipe) data_setup.mark_recipe_waiting(waiting_recipe) self.assertEquals(waiting_recipe.watchdog.recipetask, None) b = self.browser b.get(get_server_base() + 'watchdogs/') self.assertEquals(b.title, 'Watchdogs')
def test_install_done_preserves_system_resource_fqdn(self): with session.begin(): distro_tree = data_setup.create_distro_tree() recipe = data_setup.create_recipe(distro_tree=distro_tree) system = data_setup.create_system(lab_controller=self.lc) initial_fqdn = system.fqdn data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, system=system) self.assertEqual(recipe.resource.fqdn, initial_fqdn) result = self.server.recipes.install_done(recipe.id, 'somename') self.assertEqual(result, initial_fqdn) with session.begin(): session.expire(recipe.resource) self.assertEqual(recipe.resource.fqdn, initial_fqdn)
def test_recipe_provision_with_custom_distro_and_incompatible_url(self): with session.begin(): recipe = data_setup.create_recipe(custom_distro=True) self.assertIsNone(recipe.distro_tree) recipe.installation.tree_url = 'nfs://mydistro.dummylab.test:/os/' data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) self.assertEqual(response.status_code, 404) self.assertMultiLineEqual( response.text, 'Given tree URL nfs://mydistro.dummylab.test:/os/ incompatible with iPXE')
def test_install_done_updates_resource_fqdn(self): with session.begin(): distro_tree = data_setup.create_distro_tree() recipe = data_setup.create_recipe(distro_tree=distro_tree) guestrecipe = data_setup.create_guestrecipe( host=recipe, distro_tree=distro_tree) data_setup.create_job_for_recipes([recipe, guestrecipe]) data_setup.mark_recipe_running(recipe) data_setup.mark_recipe_waiting(guestrecipe) fqdn = 'theguestname' result = self.server.recipes.install_done(guestrecipe.id, fqdn) self.assertEqual(result, fqdn) with session.begin(): session.expire(guestrecipe.resource) self.assertEqual(guestrecipe.resource.fqdn, fqdn)
def test_reserves_system_when_recipe_waiting(self): recipe = data_setup.create_recipe(task_list=[Task.by_name(u"/distribution/utils/dummy")], reservesys=True) job = data_setup.create_job_for_recipes([recipe]) # Anaconda installs the OS (Status: Installing) and reboots # beakerd comes along and calls update_dirty_jobs which sets the recipe to: Waiting data_setup.mark_recipe_waiting(recipe) # In the meantime however our task has finished really quickly, which # means the min_status is TaskStatus.completed and therefore finished data_setup.mark_recipe_tasks_finished(recipe, only=True) # beakerd hasn't come along and updated our recipe yet, so it's still # in waiting self.assertEqual(job.recipesets[0].recipes[0].status, TaskStatus.waiting) # Now beakerd updates it and should reserve our system job.update_status() self.assertEqual(job.recipesets[0].recipes[0].status, TaskStatus.reserved)
def test_install_start(self): with session.begin(): system = data_setup.create_system(lab_controller=self.lc) recipe = data_setup.create_recipe() data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, system=system) self.server.recipes.install_start(recipe.id) with session.begin(): session.expire_all() assert_datetime_within(recipe.installation.install_started, tolerance=datetime.timedelta(seconds=10), reference=datetime.datetime.utcnow()) assert_datetime_within(recipe.watchdog.kill_time, tolerance=datetime.timedelta(seconds=10), reference=datetime.datetime.utcnow() + datetime.timedelta(hours=3))
def test_install_done_updates_resource_fqdn(self): with session.begin(): distro_tree = data_setup.create_distro_tree() recipe = data_setup.create_recipe(distro_tree=distro_tree) guestrecipe = data_setup.create_guestrecipe(host=recipe, distro_tree=distro_tree) data_setup.create_job_for_recipes([recipe, guestrecipe]) data_setup.mark_recipe_running(recipe) data_setup.mark_recipe_waiting(guestrecipe) fqdn = 'theguestname' result = self.server.recipes.install_done(guestrecipe.id, fqdn) self.assertEqual(result, fqdn) with session.begin(): session.expire(guestrecipe.resource) self.assertEqual(guestrecipe.resource.fqdn, fqdn)
def test_recipe_provision_with_custom_distro(self): with session.begin(): recipe = data_setup.create_recipe(custom_distro=True) self.assertIsNone(recipe.distro_tree) recipe.installation.tree_url = 'http://mydistro.dummylab.test/os/' data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) response.raise_for_status() self.assertMultiLineEqual(response.text, """#!ipxe kernel http://mydistro.dummylab.test/os/pxeboot/vmlinuz console=tty0 console=ttyS0,115200n8 ks=%s noverifyssl netboot_method=ipxe initrd http://mydistro.dummylab.test/os/pxeboot/initrd boot """ % recipe.installation.rendered_kickstart.link)
def test_install_start(self): with session.begin(): system = data_setup.create_system(lab_controller=self.lc) recipe = data_setup.create_recipe() data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, system=system) self.server.auth.login_password(self.lc.user.user_name, u'logmein') self.server.recipes.install_start(recipe.id) with session.begin(): session.expire_all() assert_datetime_within(recipe.watchdog.kill_time, tolerance=datetime.timedelta(seconds=10), reference=datetime.datetime.utcnow() + datetime.timedelta(hours=3)) self.assertEqual(recipe.tasks[0].results[0].result, TaskResult.pass_) self.assertEqual(recipe.tasks[0].results[0].path, u'/start') self.assertEqual(recipe.tasks[0].results[0].log, u'Install Started')
def test_recipe_provision_with_custom_distro_and_incompatible_url(self): with session.begin(): recipe = data_setup.create_recipe(custom_distro=True) self.assertIsNone(recipe.distro_tree) recipe.installation.tree_url = 'nfs://mydistro.dummylab.test:/os/' data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) self.assertEqual(response.status_code, 404) self.assertMultiLineEqual( response.text, 'Given tree URL nfs://mydistro.dummylab.test:/os/ incompatible with iPXE' )
def test_lab_incompatible_URLs(self): with session.begin(): distro_tree = data_setup.create_distro_tree( arch=u'x86_64', osmajor=u'Fedora20', lab_controllers=[self.lc], urls=[u'nfs://example.nfs.test:/path/to/os']) recipe = data_setup.create_recipe(distro_tree=distro_tree) data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) self.assertEqual(response.status_code, 404) self.assertMultiLineEqual( response.text, 'Lab lab.ipxescript.httptest does not provide HTTP or FTP URLs for distro tree: %s' % distro_tree.id)
def test_recipe_provision_with_custom_distro(self): with session.begin(): recipe = data_setup.create_recipe(custom_distro=True) self.assertIsNone(recipe.distro_tree) recipe.installation.tree_url = 'http://mydistro.dummylab.test/os/' data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) response.raise_for_status() self.assertMultiLineEqual(response.text, """#!ipxe kernel http://mydistro.dummylab.test/os/pxeboot/vmlinuz console=tty0 console=ttyS0,115200n8 inst.ks=%s noverifyssl netboot_method=ipxe initrd http://mydistro.dummylab.test/os/pxeboot/initrd boot """ % recipe.installation.rendered_kickstart.link) # noqa: E501
def test_recipe_provisioned(self): with session.begin(): distro_tree = data_setup.create_distro_tree( arch=u'x86_64', osmajor=u'Fedora20', lab_controllers=[self.lc], urls=[u'http://example.com/ipxe-test/F20/x86_64/os/']) recipe = data_setup.create_recipe(distro_tree=distro_tree) data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe, virt=True, lab_controller=self.lc) recipe.provision() response = requests.get(get_server_base() + 'systems/by-uuid/%s/ipxe-script' % recipe.resource.instance_id) response.raise_for_status() self.assertEquals(response.text, """#!ipxe kernel http://example.com/ipxe-test/F20/x86_64/os/pxeboot/vmlinuz console=tty0 console=ttyS0,115200n8 ks=%s noverifyssl netboot_method=ipxe initrd http://example.com/ipxe-test/F20/x86_64/os/pxeboot/initrd boot """ % recipe.rendered_kickstart.link)
def test_install_start_faulty(self): s = xmlrpclib.ServerProxy(self.get_proxy_url()) with session.begin(): recipe = data_setup.create_recipe() data_setup.create_job_for_recipes([recipe]) data_setup.mark_recipe_waiting(recipe) s.install_start(recipe.id) with session.begin(): session.expire_all() start1_kill_time = recipe.watchdog.kill_time # a buggy second start report time.sleep(1) s.install_start(recipe.id) with session.begin(): session.expire_all() start2_kill_time = recipe.watchdog.kill_time self.assertTrue(start1_kill_time == start2_kill_time)
def setUp(self): with session.begin(): self.recipe = data_setup.create_recipe() data_setup.create_job_for_recipes([self.recipe]) data_setup.mark_recipe_waiting(self.recipe)