def _get_disk_shares(ssh): stdin, stdout, stderr = ssh.exec_command("multipath -l") pvs = {} for line in stdout.readlines(): line = line.strip() if not line.startswith('mpath'): continue try: path, wwn, pv, model = line.strip().split(None, 3) except ValueError: wwn, pv, model = line.strip().split(None, 2) path = None wwn = network.normalize_wwn(wwn.strip('()')) pvs['/dev/%s' % pv] = wwn if path: pvs['/dev/mapper/%s' % path] = wwn stdin, stdout, stderr = ssh.exec_command("pvs --noheadings --units M") vgs = {} for line in stdout.readlines(): pv, vg, fmt, attr, psize, pfree = line.split(None, 5) vgs[vg] = pv stdin, stdout, stderr = ssh.exec_command("lvs --noheadings --units M") storage = {} for line in stdout.readlines(): lv, vg, attr, size, rest = (line + ' x').strip().split(None, 4) size = int(float(size.strip('M'))) try: wwn = pvs[vgs[vg]] except KeyError: continue storage[lv] = (wwn, size) return storage
def _save_shares(dev, volumes): wwns = [] for (label, serial, size, type, speed) in volumes: wwn = network.normalize_wwn(serial) wwns.append(wwn) model, created = ComponentModel.concurrent_get_or_create( name='MSA %s disk share' % type, type=ComponentType.share.id, family=type, speed=speed) share, created = DiskShare.concurrent_get_or_create(wwn=wwn, device=dev) share.model = model share.label = label share.size = size * 512 / 1024 / 1024 share.snapshot_size = 0 share.save() dev.diskshare_set.exclude(wwn__in=wwns).delete()
def _save_shares(dev, shares): wwns = [] for share_id, (label, wwn, snapshot_size, size, type, speed, full) in shares.iteritems(): wwn = network.normalize_wwn(wwn) wwns.append(wwn) model, created = ComponentModel.concurrent_get_or_create( name='3PAR %s disk share' % type, type=ComponentType.share.id, family=type, speed=speed) share, created = DiskShare.concurrent_get_or_create(wwn=wwn, device=dev) share.model = model share.label = label share.full = full share.size = size share.share_id = share_id share.snapshot_size = snapshot_size share.save() dev.diskshare_set.exclude(wwn__in=wwns).delete()
def parse_wwn(facts, dev): def make_mount(wwn): try: share = DiskShare.objects.get(wwn=wwn) except DiskShare.DoesNotExist: return None mount, created = DiskShareMount.concurrent_get_or_create( share=share, device=dev) return mount wwns = [] for key, wwn in facts.iteritems(): if not key.startswith('wwn_mpath'): continue wwns.append(network.normalize_wwn(wwn)) for wwn in wwns: mount = make_mount(wwn) if not mount: continue path = key.replace('wwn_', '') mount.volume = '/dev/mapper/%s' % path mount.save(priority=SAVE_PRIORITY) dev.disksharemount_set.filter(server=None).exclude(share__wwn__in=wwns).delete()
def run_ssh_aix(ip): ssh = _connect_ssh(ip) try: ethernets = [] for model_line in _ssh_lines(ssh, "lsattr -El sys0 | grep ^modelname"): machine_model = model_line.split(None, 2)[1] break for mac_line in _ssh_lines(ssh, "netstat -ia | grep link"): interface, mtu, net, mac, rest = mac_line.split(None, 4) if "." not in mac: continue octets = mac.split(".") mac = "".join("%02x" % int(o, 16) for o in octets).upper() ethernets.append(Eth(label=interface, mac=mac, speed=0)) disks = {} for disk_line in _ssh_lines(ssh, "lsdev -c disk"): disk, rest = disk_line.split(None, 1) wwn = None model = None for line in _ssh_lines(ssh, "lscfg -vl %s" % disk): if "Serial Number..." in line: label, sn = line.split(".", 1) sn = sn.strip(". \n") elif "Machine Type and Model." in line: label, model = line.split(".", 1) model = model.strip(". \n") disks[disk] = (model, sn) finally: ssh.close() dev = Device.create( ethernets=ethernets, model_type=DeviceType.rack_server, model_name="%s AIX" % MODELS.get(machine_model, machine_model), ) ipaddr = IPAddress.objects.get(address=ip) ipaddr.device = dev ipaddr.save() wwns = [] sns = [] stors = [] for disk, (model_name, sn) in disks.iteritems(): if not sn: continue if model_name == "VV": wwns.append(sn) else: stors.append((disk, model_name, sn)) sns.append(sn) for mount in dev.disksharemount_set.exclude(share__wwn__in=wwns): mount.delete() for stor in dev.storage_set.exclude(sn__in=sns): stor.delete() for wwn in wwns: try: share = DiskShare.objects.get(wwn=wwn) except DiskShare.DoesNotExist: continue wwn = network.normalize_wwn(sn[-4:] + sn[:-4]) mount, created = DiskShareMount.concurrent_get_or_create(share=share, device=dev, is_virtual=False) mount.volume = disk mount.save() for disk, model_name, sn in stors: model, mcreated = ComponentModel.concurrent_get_or_create( type=ComponentType.disk.id, family=model_name, extra_hash="" ) model.name = model_name model.save() stor, created = Storage.concurrent_get_or_create(device=dev, sn=sn) stor.model = model stor.label = disk stor.save() mem, created = Memory.concurrent_get_or_create(device=dev, index=0) mem.label = "Memory" mem.model, c = ComponentModel.concurrent_get_or_create( size=0, speed=0, type=ComponentType.memory.id, family="pSeries", extra_hash="" ) mem.model.name = "pSeries Memory" mem.model.save() mem.save() cpu, created = Processor.concurrent_get_or_create(device=dev, index=0) cpu.label = "CPU" cpu.model, c = ComponentModel.concurrent_get_or_create( speed=0, cores=0, type=ComponentType.processor.id, extra_hash="", family="pSeries CPU" ) cpu.model.name = "pSeries CPU" cpu.model.save() cpu.save() return machine_model