def learn_mgs_targets(self):
        for host, host_data in self.all_hosts_data.items():
            mgs_local_info = None
            for volume in host_data["local_targets"]:
                if volume["name"] == "MGS" and volume["mounted"] == True:
                    mgs_local_info = volume
            if not mgs_local_info:
                log.debug("No MGS found on host %s" % host)
                continue

            try:
                ManagedMgs.objects.get(uuid=mgs_local_info["uuid"])
            except ManagedMgs.DoesNotExist:
                try:
                    volumenode = self._get_volume_node(
                        host, mgs_local_info["device_paths"])
                except VolumeNode.DoesNotExist:
                    continue

                log.info("Learned MGS %s (%s)" %
                         (host, mgs_local_info["device_paths"][0]))
                # We didn't find an existing ManagedMgs referring to
                # this LUN, create one
                mgs = ManagedMgs(
                    uuid=mgs_local_info["uuid"],
                    state="mounted",
                    volume=volumenode.volume,
                    name="MGS",
                    immutable_state=True,
                )
                mgs.save()
                self.created_mgss.append(mgs)
    def test_HYD1483(self):
        """Test that adding a second MGS to a host emits a useful error."""
        mgt, _ = ManagedMgs.create_for_volume(synthetic_volume_full(self.host).id, name = "MGS")
        mgt.save()

        new_mgt_volume = synthetic_volume_full(self.host)
        mdt_volume = synthetic_volume_full(self.host)
        ost_volume = synthetic_volume_full(self.host)

        response = self.api_client.post("/api/filesystem/",
             data = {
                'name': 'testfs',
                'mgt': {'volume_id': new_mgt_volume.id},
                'mdts': [{
                    'volume_id': mdt_volume.id,
                    'conf_params': {}
                }],
                'osts': [{
                    'volume_id': ost_volume.id,
                    'conf_params': {}
                }],
                'conf_params': {}
            })
        self.assertHttpBadRequest(response)

        errors = self.deserialize(response)
        self.assertIn('only one MGS is allowed per server', errors['mgt']['volume_id'][0])
    def test_HYD424(self):
        """Test that filesystems can't be created using unmanaged MGSs"""
        mgt, _ = ManagedMgs.create_for_volume(synthetic_volume_full(self.host).id, name = "MGS")
        mgt.immutable_state = True
        mgt.save()

        # Shouldn't offer the MGS for FS creation
        response = self.api_client.get("/api/target/", data = {'kind': 'MGT', 'limit': 0, 'immutable_state': False})
        self.assertHttpOK(response)
        mgts = self.deserialize(response)['objects']
        self.assertEqual(len(mgts), 0)

        mdt_volume = synthetic_volume_full(self.host)
        ost_volume = synthetic_volume_full(self.host)

        # Shouldn't accept the MGS for FS creation
        response = self.api_client.post("/api/filesystem/",
             data = {
                'name': 'testfs',
                'mgt': {'id': mgt.id},
                'mdts': [{
                    'volume_id': mdt_volume.id,
                    'conf_params': {}
                }],
                'osts': [{
                    'volume_id': ost_volume.id,
                    'conf_params': {}
                }],
                'conf_params': {}
            })
        self.assertHttpBadRequest(response)

        errors = self.deserialize(response)
        self.assertDictEqual(errors, {
            'mgt': {'id': ['MGT is unmanaged']},
            'mdts': {},
            'osts': {},
         })
    def run(self, all_hosts_data):
        """:param all_hosts_data: Dict of ManagedHost to detect-scan output"""

        logs = []

        with transaction.atomic():
            self.all_hosts_data = all_hosts_data

            # Create ManagedMgs objects
            log.debug(">>learn_mgs_targets")
            self.learn_mgs_targets()

            # Create ManagedTargetMount objects
            log.debug(">>learn_mgs_target_mounts")
            self.learn_target_mounts()

            # Create ManagedMdt and ManagedOst objects
            log.debug(">>learn_fs_targets")
            self.learn_fs_targets()

            # Create ManagedTargetMount objects
            log.debug(">>learn_target_mounts")
            self.learn_target_mounts()

            # Assign a valid primary mount point,
            # and remove any targets which don't have a primary mount point
            for target in self.created_mgss + self.created_targets:
                if self.learn_primary_target(target):
                    for tm in target.managedtargetmount_set.all():
                        self._learn_event(tm.host, target)
                else:
                    logs.append(
                        help_text["found_no_primary_mount_point_for_target"] %
                        (target.target_type(), target))
                    target.mark_deleted()

            if not self.created_filesystems:
                logs.append(help_text["discovered_no_new_filesystem"])
            else:
                # Remove any Filesystems with zero MDTs or zero OSTs, or set state
                # of a valid filesystem
                for fs in self.created_filesystems:
                    mdt_count = ManagedMdt.objects.filter(
                        filesystem=fs).count()
                    ost_count = ManagedOst.objects.filter(
                        filesystem=fs).count()
                    if not mdt_count:
                        logs.append(
                            help_text["found_not_TYPE_for_filesystem"] %
                            ("MDT", fs.name))
                        fs.mark_deleted()
                    elif not ost_count:
                        logs.append(
                            help_text["found_not_TYPE_for_filesystem"] %
                            ("OST", fs.name))
                        fs.mark_deleted()
                    else:
                        logs.append(help_text[
                            "discovered_filesystem_with_n_MDTs_and_n_OSTs"] %
                                    (fs.name, mdt_count, ost_count))

                        if set([t.state for t in fs.get_targets()
                                ]) == set(["mounted"]):
                            fs.state = "available"
                        fs.save()

                        first_target = fs.get_filesystem_targets()[0]
                        self._learn_event(first_target.primary_host,
                                          first_target)

            if not self.created_mgss:
                logs.append(help_text["discovered_no_new_target"] %
                            ManagedMgs().target_type().upper())
            else:
                for mgt in self.created_mgss:
                    logs.append(help_text["discovered_target"] %
                                (mgt.target_type().upper(), mgt.name,
                                 mgt.primary_host))
                    ObjectCache.add(ManagedTarget, mgt.managedtarget_ptr)

            # Bit of additional complication so we can print really cracking messages, and detailed messages.
            for target in [ManagedMdt(), ManagedOst()]:
                if target.target_type() not in [
                        target.target_type() for target in self.created_targets
                ]:
                    logs.append(help_text["discovered_no_new_target"] %
                                target.target_type().upper())

            for target in self.created_targets:
                logs.append(help_text["discovered_target"] %
                            (target.target_type().upper(), target.name,
                             target.primary_host))

        map(self.log, logs)
Exemplo n.º 5
0
    def run(self, all_hosts_data):
        """:param all_hosts_data: Dict of ManagedHost to detect-scan output"""

        logs = []

        log.debug(">>ALL HOSTS DATA:")
        log.debug(all_hosts_data)

        with transaction.atomic():
            self.all_hosts_data = all_hosts_data

            # Create ManagedMgs objects
            log.debug(">>learn_mgs_targets")
            self.learn_mgs_targets()

            # Create ManagedTargetMount objects
            log.debug(">>learn_mgs_target_mounts")
            self.learn_target_mounts()

            # Create ManagedMdt and ManagedOst objects
            log.debug(">>learn_fs_targets")
            self.learn_fs_targets()

            # Create ManagedTargetMount objects
            log.debug(">>learn_target_mounts")
            self.learn_target_mounts()

            # Create ManagedTargetMount objects
            log.debug(">>learn_failed_lustre_tunefs_secondary_lvm_mounts")
            self.learn_failed_lustre_tunefs_secondary_lvm_mounts()

            # Assign a valid primary mount point,
            # and remove any targets which don't have a primary mount point
            for target in self.created_mgss + self.created_targets:
                if self.learn_primary_target(target):
                    for tm in target.managedtargetmount_set.all():
                        self._learn_event(tm.host, target)
                else:
                    logs.append(
                        help_text["found_no_primary_mount_point_for_target"] %
                        (target.target_type(), target))
                    target.mark_deleted()

            if not self.created_filesystems:
                logs.append(help_text["discovered_no_new_filesystem"])
            else:
                # Remove any Filesystems with zero MDTs or zero OSTs, or set state
                # of a valid filesystem
                for fs in self.created_filesystems:
                    mdts = ManagedMdt.objects.filter(filesystem=fs)
                    osts = ManagedOst.objects.filter(filesystem=fs)
                    if not mdts.count():
                        logs.append(
                            help_text["found_not_TYPE_for_filesystem"] %
                            ("MDT", fs.name))
                        fs.mark_deleted()
                    elif not osts.count():
                        logs.append(
                            help_text["found_not_TYPE_for_filesystem"] %
                            ("OST", fs.name))
                        fs.mark_deleted()
                    else:
                        logs.append(help_text[
                            "discovered_filesystem_with_n_MDTs_and_n_OSTs"] %
                                    (fs.name, mdts.count(), osts.count()))

                        targets = fs.get_targets()

                        if all(t.state == "mounted" for t in targets):
                            fs.state = "available"

                        if not any(t.immutable_state for t in targets):
                            fs.immutable_state = False
                            fs.mdt_next_index = max(t.index for t in mdts) + 1
                            fs.ost_next_index = max(t.index for t in osts) + 1
                        fs.save()

                        first_target = fs.get_filesystem_targets()[0]
                        self._learn_event(first_target.primary_host,
                                          first_target)

                        # check for fs ticket
                        if self._has_ticket(first_target.primary_host,
                                            fs.name):
                            ticket = FilesystemTicket(state="granted",
                                                      name=fs.name,
                                                      filesystem=fs,
                                                      ha_label=fs.name)
                            ticket.save()
                            logs.append(help_text["discovered_target"] %
                                        ("Filesystem Ticket", fs.name,
                                         first_target.primary_host))

            if not self.created_mgss:
                logs.append(help_text["discovered_no_new_target"] %
                            ManagedMgs().target_type().upper())
            else:
                for mgt in self.created_mgss:
                    logs.append(help_text["discovered_target"] %
                                (mgt.target_type().upper(), mgt.name,
                                 mgt.primary_host))
                    # check for Master Ticket on discovered MGT
                    if self._has_ticket(mgt.primary_host, "lustre"):
                        ticket = MasterTicket(state="granted",
                                              name="lustre",
                                              mgs=mgt,
                                              ha_label="lustre")
                        ticket.save()
                        logs.append(
                            help_text["discovered_target"] %
                            ("Master Ticket", "lustre", mgt.primary_host))

            # Bit of additional complication so we can print really cracking messages, and detailed messages.
            for target in [ManagedMdt(), ManagedOst()]:
                if target.target_type() not in [
                        target.target_type() for target in self.created_targets
                ]:
                    logs.append(help_text["discovered_no_new_target"] %
                                target.target_type().upper())

            for target in self.created_targets:
                logs.append(help_text["discovered_target"] %
                            (target.target_type().upper(), target.name,
                             target.primary_host))

        map(self.log, logs)