from afs.model.Partition import Partition from afs.model.ExtendedPartitionAttributes import ExtPartAttr from afs.dao.UbikPeerDAO import UbikPeerDAO from afs.dao.OSDVolumeDAO import OSDVolumeDAO myParser=argparse.ArgumentParser(parents=[afs.argParser], add_help=False) myParser.add_argument("--prj", dest="ProjectName", help="Name of Project") myParser.add_argument("--volname", dest="VolumeName", required=True, help="Name of Volume") myParser.add_argument("--voltype", dest="VolumeType", default="RW", help="Type of Volume") myParser.add_argument("--force", action='store_true', dest="force", default=False, help="force creation, even if Volume does not fit in given project") parseDefaultConfig(myParser) PS=ProjectService() # we get a list of Projects, sorted by the Nesting Level. # only get the most specific one PrjObj=PS.getProjectsByVolumeName(afs.defaultConfig.VolumeName)[0] if afs.defaultConfig.ProjectName != None : thisPrjObj=PS.getProjectByName(afs.defaultConfig.ProjectName) if thisPrjObj == None : myParser.error("Project \"%s\" does not exist" % afs.defaultConfig.ProjectName) if thisPrjObj.id != PrjObj.id : if not afs.defaultConfig.force : myParser.error("VolumeName \"%s\" not matched by given Project \"%s\"\n" % (afs.defaultConfig.VolumeName,afs.defaultConfig.ProjectName)) sys.exit(1) PrjObj = thisPrjObj print (PS.getNewVolumeLocation(thisPrjObj.name,afs.defaultConfig.VolumeType))
thisPrjObj=PS.getProjectByName(afs.defaultConfig.ProjectName) if thisPrjObj == None : myParser.error("Project \"%s\" does not exist" % afs.defaultConfig.ProjectName) if thisPrjObj.id != PrjObj.id : if not afs.defaultConfig.force : myParser.error("VolumeName \"%s\" not matched by given Project \"%s\"\n" % (VolumeName,afs.defaultConfig.ProjectName)) sys.exit(1) PrjObj = thisPrjObj if not PrjObj : sys.stderr.write("Cannot guess Project for volume %s" % VolumeName) VolObj=Volume() VolObj.name=VolumeName VolObj.type=VolumeType if VolObj.type == "RW" : RWServ,RWPart=(PS.getNewVolumeLocation(PrjObj.name,VolObj)) print "Creating new volume %s of type %s on %s %s with size %d" % (VolObj.name, VolObj.type, RWServ,RWPart,VolSize) VD.create(VolObj.name,RWServ,RWPart,VolSize) print "Creating accompanying RO" VlD.addsite(VolObj.name,RWServ,RWPart) # XXX it's a bit shitty, but we have to release after each addsite for now, since we get the locations from vos examine atm and not from vos listvldb VD.release(VolObj.name) for i in range(1,PrjObj.minnum_ro) : print "Creating additional RO-copy number %s" % i ROServ,ROPart=(PS.getNewVolumeLocation(PrjObj.name,VolObj)) VlD.addsite(VolObj.name,ROServ,ROPart) VD.release(VolObj.name) elif VolObj.type == "RO" : ROServ,ROPart=(PS.getNewVolumeLocation(PrjObj.name,VolObj)) print "Creating new volume %s of type %s on %s %s" % (VolObj.name, VolObj.type, ROServ,ROPart) VlD.addsite(VolObj.name,ROServ,ROPart)
if int(v.get("diskused")) < minUsage : print "Skipping %s, because it is smaller than %s" % (v["name"], minUsage) continue # remove osd-attributes from dict, create Obj v.pop("filequota") v.pop("osdPolicy") v["serv_uuid"]=afs.LookupUtil[afs.defaultConfig.CELL_NAME].getFSUUID(v["servername"]) VolObj.setByDict(v) if dstFS == None : minNestingLevel=-1 # NestingLevel should be "spezifizitaet" for p in PS.getProjectsByVolumeName(v["name"]) : if p.NestingLevel < minNestingLevel or minNestingLevel == -1 : minNestingLevel = p.NestingLevel PrjObj=p dstSrv,dstP = PS.getNewVolumeLocation(PrjObj.name,VolObj) if dstSrv == None : sys.stderr.write("found no appropriate location for %s, part of project %s. Skipping\n" % (VolObj.name,PrjObj.name)) continue else : dstSrv = dstFS.servernames[0] parts=FS.getPartitions(dstSrv) if reqDstPart == None : maxFree=0 for p in parts : if parts[p]["free"] > maxFree : dstP=p maxFree=parts[p]["free"] else : dstP=reqDstPart print "moving volume %s from %s %s to %s %s" % (v["name"],srcFS.servernames[0],srcP,dstSrv,dstP)