def test_resetting_all_disks(self):
        '''Validate that all selected disks can be reset'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)

        # Set disk.label to VTOC explicitly. If there is no label set
        # then TargetController will default it to GPT and remove the
        # MBR partitions.
        for i in [1, 2]:
            discovered_disks[i].label = "VTOC"

        selected_disks = tc.select_disk(
            [discovered_disks[1], discovered_disks[2]])

        selected_disks[0].delete_children(class_type=Partition)
        selected_disks[1].delete_children(class_type=Partition)

        tc.reset_layout()

        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 2,
                         "there should be 2 Disks selected")
        self.assertEqual(
            len(desired_disks[0].get_children(class_type=Partition)), 1,
            "1st disk should have 1 partition")
        self.assertEqual(
            len(desired_disks[1].get_children(class_type=Partition)), 1,
            "2nd disk should have 1 partition")
    def test_clears_existing_partitions(self):
        '''Validate that existing partitions are removed with wipe_disk set.'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, dry_run=True)
        selected_disks = tc.select_disk(discovered_disks[3])
        tc.apply_default_layout(selected_disks[0], False, True)

        self.assertEqual(len(selected_disks), 1,
                         "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[3].ctd,
                         "incorrect disk returned")

        # Since this is X86, wiping the disk and applying default layout
        # should result in a GPT partitioned disk with 3 GPTPartitions:
        # 1 - EFI system or BIOS boot depending on firmware
        # 2 - Solaris
        # 3 - Solaris reserved
        partitions = selected_disks[0].get_children(class_type=GPTPartition)

        self.assertEqual(len(partitions), 3,
                         "disk should only have 1 partition now")
        self.assertEqual(partitions[0].guid, selected_disks[0].sysboot_guid,
                         "GPTPartition 1 is not the correct type for boot")
        self.assertTrue(partitions[1].is_solaris,
                        "GPTPartition 2 is not a solaris partition")
        self.assertTrue(partitions[2].is_reserved,
                        "GPTPartition 3 is not a reserved partition")
    def test_disks_associated_with_vdev(self):
        '''Validate selected disks are associated with a Vdev'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(
            [discovered_disks[1], discovered_disks[2]])

        desired_root = self.doc.get_descendants(name=Target.DESIRED,
            class_type=Target,
            max_depth=2,
            max_count=1,
            not_found_is_err=True)[0]
        vdev = desired_root.get_descendants(class_type=Vdev,
            max_depth=3,
            max_count=1,
            not_found_is_err=True)[0]
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 2, "should be 2 seleted disks")
        self.assertEqual(vdev.name, "vdev", "Vdev's name should be 'vdev'")

        for desired_disk in desired_disks:
            slices = desired_disk.get_descendants(class_type=Slice)
            if not slices:
                self.assertEqual(desired_disk.in_vdev, vdev.name,
                    "Selected disk should be associated with vdev")
            else:
                bootslices = desired_disk.get_descendants(class_type=Slice,
                    name="0", not_found_is_err=True)
                bootslice = bootslices[0]
                if bootslice:
                    self.assertEqual(bootslice.in_vdev, vdev.name,
                        "Selected slice should be associated with vdev")
                else:
                    self.assertTrue(not bootslice,
                        "No root slice associated with vdev")
    def test_initial_disk_selected(self):
        '''Validate that an initial disk is returned and selected.'''
        tc = TargetController(self.doc)
        returned_disks = tc.initialize()

        self.assertEqual(returned_disks[0].ctd, "c2t0d0",
            "initial disk not correctly returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(desired_disks[0].ctd, "c2t0d0",
            "initial disk not correctly selected")
    def test_no_initial_disk_works(self):
        '''Validate no_initial_disk=True works'''
        tc = TargetController(self.doc)
        returned_disks = tc.initialize(no_initial_disk=True)

        self.assertEqual(len(returned_disks), 0,
            "initialize() should have returned empty list")
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 0,
            "desired targets should not contain any disks")
    def test_initial_disk_selected_by_size(self):
        '''Validate that initial disk matches size criteria'''
        tc = TargetController(self.doc)
        returned_disks = tc.initialize(image_size=Size("110GB"))

        self.assertEqual(returned_disks[0].ctd, "c2t2d0",
            "incorrect initial disk returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(desired_disks[0].ctd, "c2t2d0",
            "incorrect initial disk selected")
    def test_restoring_from_backup(self):
        '''Validate restoring previously edited disk from backup'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, dry_run=True)
        # select, edit, de-select and re-select a disk
        selected_disks = tc.select_disk(discovered_disks[1])
        selected_disks[0].delete_children(class_type=Partition)
        selected_disks = tc.select_disk(discovered_disks[2])
        selected_disks = tc.select_disk(discovered_disks[1])

        desired_disks = self._get_desired_disks()
        self.assertEqual(
            len(desired_disks[0].get_children(class_type=Partition)), 0,
            "selected disk should have 0 partitions")
    def test_existing_partitions(self):
        '''Validate that existing partitions can be presevered.'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[3])
        tc.apply_default_layout(selected_disks[0], False, False)

        self.assertEqual(len(selected_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[3].ctd,
            "incorrect disk returned")
        self.assertEqual(
            len(selected_disks[0].get_children(class_type=Partition)),
            2,
            "disk should still have 2 partitions")
    def test_restoring_from_backup(self):
        '''Validate restoring previously edited disk from backup'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        # select, edit, de-select and re-select a disk
        selected_disks = tc.select_disk(discovered_disks[1])
        selected_disks[0].delete_children(class_type=Partition)
        selected_disks = tc.select_disk(discovered_disks[2])
        selected_disks = tc.select_disk(discovered_disks[1])

        desired_disks = self._get_desired_disks()
        self.assertEqual(
            len(desired_disks[0].get_children(class_type=Partition)),
            0,
            "selected disk should have 0 partitions")
    def test_selecting_specific_disk(self):
        '''Validate that a specific disk can be selected.'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[1])

        self.assertEqual(len(selected_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[1].ctd,
            "incorrect disk returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 1,
            "there should be 1 Disk selected")
        self.assertEqual(desired_disks[0].ctd, discovered_disks[1].ctd,
            "incorrect disk selected")
 def test_error_if_no_discovered(self):
     '''Validate error raised if "discovered targets" doesn't exist'''
     self.doc.persistent.delete_children(class_type=Target,
         name=Target.DISCOVERED,
         not_found_is_err=True)
     tc = TargetController(self.doc)
     self.assertRaises(BadDiskError, tc.initialize)
    def test_use_whole_disk(self):
        '''Validate that partitions deleted if use_whole_disk specified'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[1],
            use_whole_disk=True)

        desired_disks = self._get_desired_disks()
        # There should be at least one partition since we create this in
        # _fixup_disk().
        self.assertEqual(
            len(desired_disks[0].get_children(class_type=Partition)), 1,
            "selected disk should have 1 partitions")
    def test_previous_disk_unselected(self):
        '''Validate that selecting a new disk un-selects the previous disk'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[1])
        selected_disks = tc.select_disk(discovered_disks[2])

        self.assertEqual(len(selected_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[2].ctd,
            "incorrect disk returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 1,
            "there should be 1 Disk selected")
        self.assertEqual(desired_disks[0].ctd, discovered_disks[2].ctd,
            "incorrect disk selected")
    def test_clears_existing_partitions(self):
        '''Validate that existing partitions are removed with wipe_disk set.'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[3])
        tc.apply_default_layout(selected_disks[0], False, True)

        self.assertEqual(len(selected_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[3].ctd,
            "incorrect disk returned")
        self.assertEqual(
            len(selected_disks[0].get_children(class_type=Partition)),
            1,
            "disk should only have 1 partition now")
    def test_add_disk(self):
        '''Validate that adding a disk works'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[1])
        added_disks = tc.add_disk(discovered_disks[2])

        self.assertEqual(len(added_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(added_disks[0].ctd, discovered_disks[2].ctd,
            "incorrect disk returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 2,
            "there should be 2 Disks selected")
        self.assertEqual(desired_disks[0].ctd, discovered_disks[1].ctd,
            "incorrect disk selected")
        self.assertEqual(desired_disks[1].ctd, discovered_disks[2].ctd,
            "incorrect disk selected")
    def test_existing_partitions(self):
        '''Validate that existing MBR partitions can be presevered.'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, dry_run=True)

        # Set disk.label to VTOC explicitly. If there is no label set
        # then TargetController will default it to GPT and remove the
        # MBR partitions.
        discovered_disks[3].label = "VTOC"
        selected_disks = tc.select_disk(discovered_disks[3])
        tc.apply_default_layout(selected_disks[0], False, False)

        self.assertEqual(len(selected_disks), 1,
                         "there should be 1 Disk returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[3].ctd,
                         "incorrect disk returned")
        self.assertEqual(
            len(selected_disks[0].get_children(class_type=Partition)), 2,
            "disk should still have 2 partitions")
    def test_selecting_specific_disks(self):
        '''Validate that 2 specific disks can be selected.'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, dry_run=True)
        selected_disks = tc.select_disk(
            [discovered_disks[1], discovered_disks[2]])

        self.assertEqual(len(selected_disks), 2,
                         "there should be 2 Disks returned")
        self.assertEqual(selected_disks[0].ctd, discovered_disks[1].ctd,
                         "incorrect disk returned")
        self.assertEqual(selected_disks[1].ctd, discovered_disks[2].ctd,
                         "incorrect disk returned")
        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 2,
                         "there should be 2 Disks selected")
        self.assertEqual(desired_disks[0].ctd, discovered_disks[1].ctd,
                         "incorrect disk selected")
        self.assertEqual(desired_disks[1].ctd, discovered_disks[2].ctd,
                         "incorrect disk selected")
    def test_reset_layout(self):
        '''Validate that existing partitions are restored with reset_layout.'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, debug=True)

        # Set disk.label to VTOC explicitly. If there is no label set
        # then TargetController will default it to GPT and remove the
        # MBR partitions.
        discovered_disks[3].label = "VTOC"

        selected_disks = tc.select_disk(discovered_disks[3])
        self.assertEqual(len(selected_disks), 1,
                         "there should be 1 Disk returned")

        # When wipe_disk is True the default layout becomes GPT based rather
        # than VTOC.
        tc.apply_default_layout(selected_disks[0], use_whole_disk=False, \
                                wipe_disk=True)
        self.assertEqual(selected_disks[0].label, "GPT",
            "disk should have a GPT label now. Has %s instead." \
            % selected_disks[0].label)
        self.assertEqual(
            len(selected_disks[0].get_children(class_type=GPTPartition)), 3,
            "disk should have 3 GPT partitions now")
        copy_disks = tc.reset_layout(selected_disks[0], use_whole_disk=False)

        self.assertEqual(len(copy_disks), 1, "there should be 1 Disk returned")
        self.assertEqual(copy_disks[0].ctd, discovered_disks[3].ctd,
                         "incorrect disk returned")
        self.assertEqual(len(copy_disks[0].get_children(class_type=Partition)),
                         2, "disk should have 2 partitions again")
    def test_use_whole_disk(self):
        '''Validate that partitions deleted if use_whole_disk specified'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(discovered_disks[1],
                                        use_whole_disk=True)

        desired_disks = self._get_desired_disks()

        # There should be 0 partitions. ZFS handles whole disk mode for GPT
        partitions = desired_disks[0].get_children(class_type=Partition)
        self.assertEqual(
            len(partitions), 0,
            "selected whole_disk mode disk should have 0 partitions")

        partitions = desired_disks[0].get_children(class_type=GPTPartition)
        self.assertEqual(
            len(partitions), 0,
            "selected whole_disk mode disk should have 0 GPT partitions")
    def test_resetting_all_disks(self):
        '''Validate that all selected disks can be reset'''
        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc)
        selected_disks = tc.select_disk(
            [discovered_disks[1], discovered_disks[2]])

        selected_disks[0].delete_children(class_type=Partition)
        selected_disks[1].delete_children(class_type=Partition)

        tc.reset_layout()

        desired_disks = self._get_desired_disks()
        self.assertEqual(len(desired_disks), 2,
            "there should be 2 Disks selected")
        self.assertEqual(
            len(desired_disks[0].get_children(class_type=Partition)),
            1,
            "1st disk should have 1 partition")
        self.assertEqual(
            len(desired_disks[1].get_children(class_type=Partition)),
            1,
            "2nd disk should have 1 partition")
    def test_reset_layout(self):
        '''Validate that existing partitions are restored with reset_layout.'''
        if platform.processor() != "i386":
            raise SkipTest("test not supported on sparc")

        discovered_disks = self._get_discovered_disks()
        tc = TargetController(self.doc, debug=True)
        selected_disks = tc.select_disk(discovered_disks[3])
        self.assertEqual(len(selected_disks), 1,
            "there should be 1 Disk returned")
        tc.apply_default_layout(selected_disks[0], use_whole_disk=False, \
                                wipe_disk=True)
        self.assertEqual(
            len(selected_disks[0].get_children(class_type=Partition)),
            1, "disk should have 1 partition now")
        copy_disks = tc.reset_layout(selected_disks[0], use_whole_disk=False)

        self.assertEqual(len(copy_disks), 1,
            "there should be 1 Disk returned")
        self.assertEqual(copy_disks[0].ctd, discovered_disks[3].ctd,
            "incorrect disk returned")
        self.assertEqual(
            len(copy_disks[0].get_children(class_type=Partition)),
            2, "disk should have 2 partitions again")
Exemple #22
0
            main_win = MainWindow(initscr,
                                  screen_list,
                                  actions,
                                  force_bw=options.force_bw)
            screen_list.help = HelpScreen(
                main_win, _("Help Topics"), _("Help Index"),
                _("Select a topic and press "
                  "Continue."))
            doc = InstallEngine.get_instance().doc

            debug_tc = False
            if options.debug:
                debug_tc = True
            target_controller = TargetController(doc,
                                                 debug=debug_tc,
                                                 dry_run=options.no_install)

            win_list = make_screen_list(main_win, target_controller,
                                        install_data)
            screen_list.help.setup_help_data(win_list)
            screen_list.screen_list = win_list
            screen = screen_list.get_next()
            ctrl_c = None
            errcode = 0
            while screen is not None:
                LOGGER.debug("Displaying screen: %s", type(screen))
                screen = screen.show()
                if not options.debug and ctrl_c is None:
                    # This prevents the user from accidentally hitting
                    # ctrl-c halfway through the install. Ctrl-C is left
 def test_error_if_no_suitable_disk(self):
     '''Validate error raised if "discovered targets" are too small'''
     tc = TargetController(self.doc)
     self.assertRaises(BadDiskError, tc.initialize,
         image_size=Size("1TB"))