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)
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)