Skip to content
Snippets Groups Projects
ceph-disk-list.py 5.11 KiB
Newer Older
  • Learn to ignore specific revisions
  • #!/usr/bin/python
    
    import re
    import os
    import sys
    import argparse
    
    root's avatar
    root committed
    import subprocess
    import socket
    
    
    try:
        myfullpath = os.path.dirname(os.path.realpath(__file__))
    except NameError:
        myfullpath = os.path.abspath(os.path.curdir)
    
    parser = argparse.ArgumentParser(description='Perform standalone CEPH installation.')
    parser.add_argument('-t','--data', help='Data partition size')
    parser.add_argument('-w','--wal', help='Wal partition size')
    parser.add_argument('-d','--db', help='DB partition size')
    
    root's avatar
    root committed
    parser.add_argument('-s','--ssd', help='ssd disks wal and db partitions')
    
    args = parser.parse_args()
    
    if args.wal == None or args.db == None or args.data == None:
        print("Required arguments not provided. Exit.")
        sys.exit(1)
    
    
    root's avatar
    root committed
    s = args.ssd
    ssd_list = []
    
    if len(s) == 0 :
      print("No ssd disks provided")
    else:
      tmp =  s.split(',')
    
    for t in tmp:
      try:
        os.stat(t)
      except OSError:
        print("Device %s doesn't exists. Exit."%t)
        sys.exit(-1)
      ssd_list.append(t)
      
    ssd_string=""
    
    for s in ssd_list:
      ssd_string = ssd_string + s + " "
    
    os.system("echo pvcreate "+ssd_string)
    
    hostname = socket.gethostname().split('.')[0]
    
    vg_name_ssd = hostname+"_journal"
    
    os.system("echo vgcreate "+vg_name_ssd+" "+ssd_string)
    
    
    
    pattern = re.compile("^\d+(%FREE|K|M|G|T|P)$")
    
    root's avatar
    root committed
    hostname = socket.gethostname().split('.')[0]
    
    
    if pattern.match(args.wal) and pattern.match(args.db) and pattern.match(args.data):
    
        # CREATE JBOD DISKS MAP IF DOES NOT EXIST
        fn = os.path.join(myfullpath,'diskPosition2.out')
    
    root's avatar
    root committed
        #if not os.path.isfile(fn):
        #    os.system(myfullpath+"/diskPosition2 > "+myfullpath+"/diskPosition2.out")
        os.system(myfullpath+"/diskPosition2 > "+myfullpath+"/diskPosition2.out")
    
        # OPEN JBOD DISKS MAP FILE
        with open(fn, 'r') as f:
            lines = f.readlines()
    
    
    root's avatar
    root committed
        
    
    root's avatar
    root committed
        #import subprocess
        #subprocess.call("echo yes | cp  disks_lists_template.pp disks_lists.pp", shell=True)
    
    root's avatar
    root committed
        tp = open("disks_lists.pp","r")
    
    root's avatar
    root committed
        tp_lines = tp.readlines()
    
        tp.close()
       
        #Remove last parantheses
        ll = tp_lines[0:-2]
    
        disk_tag_template = 'ceph_osd_list_prod'
       
        disk_tag = disk_tag_template+"_"+hostname
       
        ll.append("    \'"+disk_tag+"\'" + " => {\n")
        ll.append('  }\n')
        ll.append('}\n')
    
        n = open("disks_lists.pp", "w")
        for l in ll:
          n.write(l)
        n.close()
        
        #print("sed -n -i /s/"+disk_tag_template+"/"+disk_tag+"/g' disks_lists.pp")
       
        #os.system('cat disks_lists.pp')
        #subprocess.call(["sed -i -e 's/"+disk_tag_template+"/"+disk_tag+"/g' disks_lists.pp"], shell=True) 
    
        #os.system('cat disks_lists.pp')
    
    root's avatar
    root committed
        #sys.exit(0)
    
        # CREATE PARTITIONS FOR CEPH OSDS AND UPDATE PUPPET CONFIGURATION
    
        sed_string=""
    
        for i in range(0,len(lines),3):
    
    root's avatar
    root committed
            res_dev = re.search(r"/sys/block/\wd[a-z]+",lines[i])
    
            res_bayid = re.search(r"BayID: \d+", lines[i])
            res_sn = re.search(r"Serial number:        \w+",lines[i])
            res_vnd = re.search(r"Vendor:               \w+", lines[i])
            res_prd = re.search(r"Product:              \w+", lines[i])
    
    
    root's avatar
    root committed
            dev = str(re.search(r"\wd[a-z]+",res_dev.group()).group())
    
            bayid = int(re.search(r"\d+",res_bayid.group()).group())
            sn = str(re.search(r"        \w+",res_sn.group()).group()).strip()
            vnd = str(re.search(r"               \w+",res_vnd.group()).group()).strip()
            prd = str(re.search(r"              \w+",res_prd.group()).group()).strip()
    
    
    root's avatar
    root committed
            #os.system("pvcreate /dev/"+dev)
            #os.system("vgcreate "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd+" /dev/"+dev)
            #os.system("lvcreate -L"+args.data+" -n "+dev+"_data "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
            #os.system("lvcreate -L"+args.wal+" -n "+dev+"_wal "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
            #os.system("lvcreate -L"+args.db+" -n "+dev+"_db "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
    
            os.system("echo pvcreate /dev/"+dev)
            os.system("echo vgcreate "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd+" /dev/"+dev)
    
    root's avatar
    root committed
            if ('FREE' in args.data):
              os.system("echo lvcreate -l"+args.data+" -n "+dev+"_data "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
            else:
              os.system("echo lvcreate -L"+args.data+" -n "+dev+"_data "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
            
            #os.system("echo lvcreate -L"+args.wal+" -n "+dev+"_wal "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
            #os.system("echo lvcreate -L"+args.db+" -n "+dev+"_db "+str(bayid)+"-"+sn+"-"+vnd+"-"+prd)
    
            os.system("echo lvcreate -L"+args.wal+" -n "+dev+"_wal "+vg_name_ssd)
            os.system("echo lvcreate -L"+args.db+" -n "+dev+"_db "+vg_name_ssd)
    
    
            sed_string = sed_string + "\ \ \ \ \ \ \'\"'\"'"+str(bayid)+"-"+sn+"-"+vnd+"-"+prd+"/"+dev+"_data\'\"'\"'=> \
            {\\n \ \ \ \ \ \ \ \ store_type => '\"'\"'bluestore'\"'\"',\
    
    root's avatar
    root committed
            \\n \ \ \ \ \ \ \ \ bluestore_wal => '\"'\"'"+vg_name_ssd+"/"+dev+"_wal'"+"\"'\"',\
            \\n \ \ \ \ \ \ \ \ bluestore_db => '\"'\"'"+vg_name_ssd+"/"+dev+"_db'"+"\"'\"',\
    
            \\n \ \ \ \ \ \ \ \ ensure     => '\"'\"'present'\"'\"',\\n \ \ \ \ \ \},\\n"
    
        sed_string = sed_string + "\ \ \ \ \},"
    
    root's avatar
    root committed
       
        #print sed_string
    
        os.system("sed -i '/    '\"'\""+disk_tag+"\"'\"' => {/a "+sed_string+\
        "' "+"./disks_lists.pp")