962 lines
29 KiB
Python
962 lines
29 KiB
Python
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||
|
# or more contributor license agreements. See the NOTICE file
|
||
|
# distributed with this work for additional information
|
||
|
# regarding copyright ownership. The ASF licenses this file
|
||
|
# to you under the Apache License, Version 2.0 (the
|
||
|
# "License"); you may not use this file except in compliance
|
||
|
# with the License. You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing,
|
||
|
# software distributed under the License is distributed on an
|
||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||
|
# KIND, either express or implied. See the License for the
|
||
|
# specific language governing permissions and limitations
|
||
|
# under the License.
|
||
|
#
|
||
|
# $Id$
|
||
|
#
|
||
|
|
||
|
import os
|
||
|
import sys
|
||
|
import string
|
||
|
import MySQLdb
|
||
|
import subprocess
|
||
|
import traceback
|
||
|
|
||
|
import usermanagement
|
||
|
|
||
|
from infostore import InfoStore
|
||
|
from util import logit
|
||
|
from dhcpdns import DhcpDns
|
||
|
|
||
|
def timeF(f):
|
||
|
def myF(*args, **kw):
|
||
|
start = time.time()
|
||
|
res = f(*args, **kw)
|
||
|
end = time.time()
|
||
|
print "%s took %f" % (f.__name__, end-start)
|
||
|
return res
|
||
|
myF.__name__ = f.__name__
|
||
|
return myF
|
||
|
|
||
|
def checkSuper(f):
|
||
|
def myF(*args, **kw):
|
||
|
if os.getuid() != 0:
|
||
|
print "Please use sudo!"
|
||
|
exit()
|
||
|
res = f(*args, **kw)
|
||
|
return res
|
||
|
return myF
|
||
|
|
||
|
class ResourceQuerySql(InfoStore):
|
||
|
def __init__(self, config, verbose=None):
|
||
|
self.config = config
|
||
|
self.verbose = verbose
|
||
|
self.host = config['dbHost']
|
||
|
self.user = config['dbUser']
|
||
|
self.passwd = config['dbPassword']
|
||
|
self.db = config['dbInst']
|
||
|
|
||
|
self.tftpRootDir = config['tftpRootDir']
|
||
|
self.tftpImageDir = config['tftpImageDir']
|
||
|
self.tftpBootOptionsDir = config['tftpBootOptionsDir']
|
||
|
|
||
|
self.logFile = config['logFile']
|
||
|
|
||
|
if config['dbPort'] == "":
|
||
|
config['dbPort'] = 3306
|
||
|
|
||
|
self.port = config['dbPort']
|
||
|
|
||
|
self.vlan_max = config['vlan_max']
|
||
|
self.vlan_reserved = config['vlan_reserved']
|
||
|
|
||
|
# Connect to DB
|
||
|
try:
|
||
|
self.conn = MySQLdb.connect(host = self.host, port = self.port, user = self.user, passwd = self.passwd, db = self.db)
|
||
|
except MySQLdb.OperationalError, e:
|
||
|
if e[0] == 2005:
|
||
|
print "ZONI ERROR:" + str(e[1])
|
||
|
exit(1)
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
#cursor.execute ("SELECT VERSION()")
|
||
|
#print "server version:", row[0]
|
||
|
#mysql -Dirp-cluster -hrodimus -u reader -e "select * from hostinfo;"
|
||
|
|
||
|
#def gethost(self, host):
|
||
|
#obj = {}
|
||
|
#self.conn
|
||
|
#createConn()
|
||
|
#
|
||
|
|
||
|
def __create_queryopts(self, cmdargs, extra=None):
|
||
|
cmdlen = len(cmdargs)
|
||
|
queryopt = ""
|
||
|
|
||
|
if extra:
|
||
|
queryopt += extra
|
||
|
|
||
|
if cmdlen == 0:
|
||
|
pass
|
||
|
else:
|
||
|
num = cmdlen
|
||
|
if extra:
|
||
|
queryopt += " and "
|
||
|
for k, v in cmdargs.iteritems():
|
||
|
if k == "num_procs":
|
||
|
queryopt += k + " = " + v + " "
|
||
|
if k == "mem_total":
|
||
|
queryopt += k + " >= " + v + " "
|
||
|
if k == "clock_speed":
|
||
|
queryopt += k + " >= " + v + " "
|
||
|
if k == "num_cores":
|
||
|
queryopt += k + " = " + v + " "
|
||
|
if k == "cpu_flags":
|
||
|
queryopt += k + " like \"%" + v + "%\" "
|
||
|
if k == "node_id":
|
||
|
queryopt += " location = " + "\'" + v + "\' "
|
||
|
|
||
|
if num > 1:
|
||
|
queryopt += " and "
|
||
|
|
||
|
num -= 1
|
||
|
|
||
|
if queryopt:
|
||
|
tmp = " where " + queryopt
|
||
|
queryopt = tmp
|
||
|
|
||
|
return queryopt
|
||
|
|
||
|
def updateDatabase(self, table, query):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def showResources(self, cmdargs):
|
||
|
|
||
|
queryopt = ""
|
||
|
defaultFields = "mac_addr, location, num_procs, num_cores, clock_speed, mem_total "
|
||
|
#defaultFields = "*"
|
||
|
|
||
|
queryopt = self.__create_queryopts(cmdargs)
|
||
|
|
||
|
#query = "show fields from sysinfo"
|
||
|
#results = self.__selectDb(query)
|
||
|
|
||
|
query = "select " + defaultFields + "from sysinfo " + queryopt
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
line = ""
|
||
|
for i in defaultFields.split(","):
|
||
|
#line += string.strip(str(i)) + "\t"
|
||
|
line += str(i.center(20))
|
||
|
print line
|
||
|
|
||
|
for row in result.fetchall():
|
||
|
line = ""
|
||
|
for val in row:
|
||
|
line += str(val).center(20)
|
||
|
print line
|
||
|
print str(result.rowcount) + " systems returned"
|
||
|
|
||
|
#mysql -h rodimus -u reader irp-cluster -e "select * from sysinfo where location like 'r1%' and num_procs = 1"
|
||
|
|
||
|
def getLocationFromSysId (self, nodeId):
|
||
|
query = "select location from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
return result.fetchall()[0][0]
|
||
|
|
||
|
def getMacFromSysId(self, nodeId):
|
||
|
query = "select mac_addr from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
return result.fetchall()[0][0]
|
||
|
|
||
|
def getIpFromSysId(self, nodeId):
|
||
|
query = "select ip_addr from sysinfo where sys_id = \"" + str(nodeId) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
return result.fetchall()[0][0]
|
||
|
|
||
|
|
||
|
def getAllSwitches(self):
|
||
|
switchList = []
|
||
|
query = "select hw_name from hardwareinfo where hw_type = \"switch\""
|
||
|
result = self.__selectDb(query)
|
||
|
for switch in result.fetchall():
|
||
|
switchList.append(switch[0])
|
||
|
|
||
|
# Use static list until we get all switches installed
|
||
|
switchList = ['sw1-r1r2', 'sw0-r1r1', 'sw0-r1r2', 'sw0-r1r3', 'sw0-r1r4', 'sw0-r2r3', 'sw0-r3r3', 'sw0-r3r2', 'sw0-r2r1c3', 'sw2-r1r2']
|
||
|
#switchList = ['sw2-r1r2']
|
||
|
#switchList = ['sw1-r1r2']
|
||
|
|
||
|
|
||
|
print switchList
|
||
|
|
||
|
return switchList
|
||
|
|
||
|
def getAvailableVlan(self):
|
||
|
# Get list of available vlans
|
||
|
query = "select vlan_num from vlaninfo where domain = 'private'"
|
||
|
result = self.__selectDb(query)
|
||
|
for vlan in result.fetchall()[0]:
|
||
|
avail = self.isVlanAvailable(vlan)
|
||
|
if avail:
|
||
|
myvlan = vlan
|
||
|
break
|
||
|
if not myvlan:
|
||
|
mesg = "No Vlans for you! You Go Now\n"
|
||
|
logit(self.logFile, mesg)
|
||
|
return myvlan
|
||
|
|
||
|
def isVlanAvailable(self, vlan):
|
||
|
query = "select a.vlan_id, v.vlan_num from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan)
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 1:
|
||
|
return 0
|
||
|
else:
|
||
|
return 1
|
||
|
|
||
|
def getVlanId(self, vlan):
|
||
|
query = "select vlan_id from vlaninfo where vlan_num = \"" + str(vlan) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
#print result.rowcount
|
||
|
if result.rowcount > 0:
|
||
|
return result.fetchall()[0][0]
|
||
|
else:
|
||
|
mesg = "ERROR: VLAN does not exist: " + str(vlan)
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
|
||
|
def isIpAvailable(self, ip_addr, vlan_id):
|
||
|
query = "select * from allocationinfo where ip_addr = \"" + str(ip_addr) + "\" and vlan_id = \"" + str(vlan_id) + "\""
|
||
|
#print "query ", query
|
||
|
result = self.__selectDb(query)
|
||
|
#print "select row count is ", result.rowcount
|
||
|
if result.rowcount > 0:
|
||
|
return 0
|
||
|
else:
|
||
|
return 1
|
||
|
|
||
|
|
||
|
def getDomainIp(self, vlan):
|
||
|
ip_start = 30
|
||
|
query = "select ip_network from vlaninfo where vlan_num = " + str(vlan)
|
||
|
result = self.__selectDb(query)
|
||
|
ip_network = result.fetchall()[0][0]
|
||
|
v = ip_network.split(".")
|
||
|
ip_base = v[0] + "." + v[1] + "." + v[2]
|
||
|
|
||
|
# Check for other allocations and assign IP address
|
||
|
query = "select a.vlan_id, v.vlan_num from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan)
|
||
|
#print "ip is ", ip_network
|
||
|
|
||
|
query = "select a.ip_addr from allocationinfo a, vlaninfo v where a.vlan_id = v.vlan_id and v.vlan_num = " + str(vlan);
|
||
|
result = self.__selectDb(query)
|
||
|
#print "row count is ", result.rowcount
|
||
|
if result.rowcount > 0:
|
||
|
for ip in xrange(ip_start, 255):
|
||
|
ip_check = ip_base + "." + str(ip)
|
||
|
check = self.isIpAvailable(ip_check, self.getVlanId(vlan))
|
||
|
if check:
|
||
|
ip_addr = ip_check
|
||
|
break
|
||
|
else:
|
||
|
ip_addr = ip_base + "." + str(ip_start)
|
||
|
#print "ip_addr", ip_addr
|
||
|
|
||
|
return ip_addr
|
||
|
|
||
|
|
||
|
def showArchive(self):
|
||
|
query = "select * from allocationarchive"
|
||
|
result = self.__selectDb(query)
|
||
|
for i in result:
|
||
|
print i
|
||
|
|
||
|
def showAllocation(self, userId=None):
|
||
|
#from IPython.Shell import IPShellEmbed
|
||
|
#shell = IPShellEmbed(argv="")
|
||
|
#shell(local_ns=locals(), global_ns=globals())
|
||
|
|
||
|
# specify usermanagement - ldap or files
|
||
|
usermgt = usermanagement.ldap()
|
||
|
|
||
|
query = "select r.user_id, s.location, s.num_cores, s.mem_total, \
|
||
|
r.reservation_expiration, r.notes, r.reservation_id, v.vlan_num, a.ip_addr, a.hostname,\
|
||
|
a.notes, i.image_name \
|
||
|
from allocationinfo a, sysinfo s, reservationinfo r, vlaninfo v, imageinfo i, imagemap m where \
|
||
|
s.mac_addr = m.mac_addr and \
|
||
|
m.image_id = i.image_id and \
|
||
|
s.sys_id = a.node_id and \
|
||
|
v.vlan_id = a.vlan_id and \
|
||
|
r.reservation_id = a.reservation_id "
|
||
|
if userId:
|
||
|
myid = userId
|
||
|
if type(userId) == str:
|
||
|
# convert username to id
|
||
|
myid = usermgt.getUserId(userId)
|
||
|
|
||
|
query += " and user_id = " + myid + " "
|
||
|
|
||
|
query += "order by r.reservation_id asc, s.location"
|
||
|
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
print "NODE ALLOCATION"
|
||
|
print "---------------------------------------------------------------------------------"
|
||
|
if self.verbose:
|
||
|
#print "Res_id\tUser \tNode \tCores\tMemory \tExpiration\t\tVLAN\tHOSTNAME \tIPADDR \t\tReservationNotes|AllocationNotes"
|
||
|
print "%-5s%-10s%-10s%-12s%-12s%-5s%-15s%-18s%-24s%s" % ("Res", "User", "Host", "Cores/Mem","Expiration", "Vlan", "Hostname", "IP Addr", "Boot Image Name", "Notes")
|
||
|
else:
|
||
|
print "%-10s%-10s%-12s%-12s%s" % ("User", "Node", "Cores/Mem","Expiration", "Notes")
|
||
|
|
||
|
for i in result.fetchall():
|
||
|
uid = i[0]
|
||
|
host = i[1]
|
||
|
cores = i[2]
|
||
|
memory = i[3]
|
||
|
expire = str(i[4])[0:10]
|
||
|
if expire == "None":
|
||
|
expire = "0000-00-00"
|
||
|
rnotes = i[5]
|
||
|
resId= i[6]
|
||
|
vlanId= i[7]
|
||
|
ip_addr = i[8]
|
||
|
hostname = i[9]
|
||
|
anotes = i[10]
|
||
|
image_name = i[11]
|
||
|
userName = usermgt.getUserName(uid)
|
||
|
combined_notes = str(rnotes) + "|" + str(anotes)
|
||
|
if self.verbose:
|
||
|
#print "%s\t%s \t%s \t%s\t%s \t%s\t%s\t%s \t%s \t%s" % (resId, userName, host, cores, memory,expire, vlanId, hostname, ip_addr, combined_notes)
|
||
|
print "%-5s%-10s%-10s%-2s%-10s%-12s%-5s%-15s%-18s%-24s%s" % (resId, userName, host, cores, memory,expire, vlanId, hostname, ip_addr, image_name, combined_notes)
|
||
|
else:
|
||
|
print "%-10s%-10s%-2s%-10s%-12s%s" % (userName, host, cores, memory,expire, combined_notes)
|
||
|
print "---------------------------------------------------------------------------------"
|
||
|
print str(result.rowcount) + " systems returned"
|
||
|
|
||
|
def showReservation(self, userId=None):
|
||
|
#from IPython.Shell import IPShellEmbed
|
||
|
#shell = IPShellEmbed(argv="")
|
||
|
#shell(local_ns=locals(), global_ns=globals())
|
||
|
|
||
|
# specify usermanagement - ldap or files
|
||
|
usermgt = usermanagement.ldap()
|
||
|
|
||
|
query = "select reservation_id, user_id, \
|
||
|
reservation_expiration, notes \
|
||
|
from reservationinfo order by reservation_id"
|
||
|
if self.verbose:
|
||
|
query = "select r.reservation_id, r.user_id, r.reservation_expiration, r.notes, count(a.reservation_id) \
|
||
|
from reservationinfo r, allocationinfo a \
|
||
|
where r.reservation_id = a.reservation_id \
|
||
|
group by r.reservation_id order by reservation_id"
|
||
|
#if userId:
|
||
|
#myid = userId
|
||
|
#if type(userId) == str:
|
||
|
## convert username to id
|
||
|
#myid = usermgt.getUserId(userId)
|
||
|
|
||
|
#query += " and user_id = " + myid + " "
|
||
|
|
||
|
#query += "order by r.user_id, s.location"
|
||
|
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
print "RESERVATIONS"
|
||
|
print "---------------------------------------------------------------------------------"
|
||
|
if self.verbose:
|
||
|
print "%-7s%-10s%-12s%-7s%s" % ("ResId", "UserName", "Expire", "Total", "Notes")
|
||
|
else:
|
||
|
print "%-7s%-10s%-12s%s" % ("ResId", "UserName", "Expire", "Notes")
|
||
|
|
||
|
total = 0
|
||
|
for i in result.fetchall():
|
||
|
resId= i[0]
|
||
|
uid = i[1]
|
||
|
expire = str(i[2])[0:10]
|
||
|
if expire == "None":
|
||
|
expire = "0000-00-00"
|
||
|
notes = i[3]
|
||
|
userName = usermgt.getUserName(uid)
|
||
|
if self.verbose:
|
||
|
num_nodes = i[4]
|
||
|
total += num_nodes
|
||
|
#print "%s \t%s \t%s\t%s\t\t%s " % (resId, userName, expire, num_nodes, notes)
|
||
|
print "%-7s%-10s%-12s%-7s%s" % (resId, userName, expire, num_nodes, notes)
|
||
|
else:
|
||
|
print "%-7s%-10s%-12s%s" % (resId, userName, expire, notes)
|
||
|
if self.verbose:
|
||
|
print "---------------------------------------------------------------------------------"
|
||
|
print "Total number of nodes - %s" % (total)
|
||
|
|
||
|
|
||
|
def getPxeImages(self):
|
||
|
cursor = self.conn.cursor ()
|
||
|
line = "select image_name from imageinfo"
|
||
|
cursor.execute (line)
|
||
|
row = cursor.fetchall()
|
||
|
desc = cursor.description
|
||
|
|
||
|
imagelist = []
|
||
|
for i in row:
|
||
|
imagelist.append(i[0])
|
||
|
|
||
|
return imagelist
|
||
|
|
||
|
|
||
|
def showPxeImages(self):
|
||
|
cursor = self.conn.cursor ()
|
||
|
line = "select image_name, dist, dist_ver from imageinfo"
|
||
|
cursor.execute (line)
|
||
|
row = cursor.fetchall()
|
||
|
desc = cursor.description
|
||
|
|
||
|
for i in row:
|
||
|
print i
|
||
|
|
||
|
cursor.close ()
|
||
|
|
||
|
def showPxeImagesToSystemMap(self, cmdargs):
|
||
|
extra = "l.mac_addr = j.mac_addr and j.image_id = i.image_id"
|
||
|
queryopt = self.__create_queryopts(cmdargs, extra=extra)
|
||
|
print queryopt
|
||
|
|
||
|
query = "select l.location, j.mac_addr, i.image_name from sysinfo l , imageinfo i, imagemap j " + queryopt + " order by l.location"
|
||
|
#print query
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
for i in result.fetchall():
|
||
|
print i
|
||
|
|
||
|
def close(self):
|
||
|
self.conn.close()
|
||
|
|
||
|
def getHwAccessMethod(self):
|
||
|
pass
|
||
|
|
||
|
mylist = []
|
||
|
|
||
|
return mylist
|
||
|
|
||
|
def getHostInfo(self, node):
|
||
|
host = {}
|
||
|
query = "select * from sysinfo where location = \"" + node + "\""
|
||
|
#print "query is ", query
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 1:
|
||
|
print "Mulitple entries for system exist. Please correct"
|
||
|
exit()
|
||
|
if result.rowcount < 1:
|
||
|
mesg = "node does not exist :" + str(node) + "\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
exit()
|
||
|
|
||
|
for i in result.fetchall():
|
||
|
host['mac_addr'] = host.get("mac_addr", "")
|
||
|
host['node_id'] = int(i[0])
|
||
|
host['mac_addr'] = i[1]
|
||
|
host['num_procs'] = int(i[2])
|
||
|
host['num_cores'] = int(i[3])
|
||
|
host['mem_total'] = int(i[6])
|
||
|
host['clock_speed'] = int(i[8])
|
||
|
host['sys_vendor'] = i[9]
|
||
|
host['sys_model'] = i[10]
|
||
|
host['proc_vendor'] = i[11]
|
||
|
host['proc_model'] = i[12]
|
||
|
host['proc_cache'] = i[13]
|
||
|
host['cpu_flags'] = i[15]
|
||
|
host['bios_rev'] = i[17]
|
||
|
host['location'] = i[16]
|
||
|
host['dell_tag'] = host.get("dell_tag", "")
|
||
|
host['dell_tag'] = i[14]
|
||
|
'''
|
||
|
for k, v in host.iteritems():
|
||
|
print k, v, "\n"
|
||
|
'''
|
||
|
|
||
|
# Get IPMI info
|
||
|
query = "select * from ipmiinfo where node_id = " + str(host['node_id']) + ""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount> 1:
|
||
|
print "Mulitple entries for system exist. Please correct"
|
||
|
exit()
|
||
|
for i in result.fetchall():
|
||
|
host['ipmi_user'] = i[2]
|
||
|
host['ipmi_password'] = i[3]
|
||
|
host['ipmi_addr'] = i[1]
|
||
|
|
||
|
# Get image info
|
||
|
query = "select image_name from imagemap i, imageinfo j where i.image_id = j.image_id and mac_addr = \"" + host['mac_addr'] + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount == 0:
|
||
|
host['pxe_image_name'] = "None"
|
||
|
else:
|
||
|
for i in result.fetchall():
|
||
|
host['pxe_image_name'] = i[0]
|
||
|
|
||
|
# Get switch info
|
||
|
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'switch' and node_id = " + str(host['node_id'])
|
||
|
result = self.__selectDb(query)
|
||
|
for i in result.fetchall():
|
||
|
host['hw_id'] = int(i[0])
|
||
|
host['hw_name'] = i[1]
|
||
|
host['hw_model'] = i[2]
|
||
|
host['hw_ipaddr'] = i[3]
|
||
|
host['hw_userid'] = i[4]
|
||
|
host['hw_password'] = i[5]
|
||
|
host['hw_port'] = int(i[6])
|
||
|
|
||
|
# Get drac info
|
||
|
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'drac' and node_id = " + str(host['node_id'])
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 0:
|
||
|
for i in result.fetchall():
|
||
|
host['drac_id'] = int(i[0])
|
||
|
host['drac_name'] = i[1]
|
||
|
host['drac_model'] = i[2]
|
||
|
host['drac_ipaddr'] = i[3]
|
||
|
host['drac_userid'] = i[4]
|
||
|
host['drac_password'] = i[5]
|
||
|
host['drac_port'] = int(i[6])
|
||
|
|
||
|
# Get PDU info
|
||
|
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password, p.port_num from hardwareinfo h, portmap p where p.hw_id = h.hw_id and hw_type = 'pdu' and node_id = " + str(host['node_id'])
|
||
|
result = self.__selectDb(query)
|
||
|
for i in result.fetchall():
|
||
|
host['pdu_id'] = int(i[0])
|
||
|
host['pdu_name'] = i[1]
|
||
|
host['pdu_model'] = i[2]
|
||
|
host['pdu_ipaddr'] = i[3]
|
||
|
host['pdu_userid'] = i[4]
|
||
|
host['pdu_password'] = i[5]
|
||
|
host['pdu_port'] = int(i[6])
|
||
|
|
||
|
|
||
|
#print "host is ", host
|
||
|
return host
|
||
|
|
||
|
def getSwitchInfo(self, switchName):
|
||
|
host = {}
|
||
|
# Get switch info
|
||
|
#switchList = self.getAllSwitches()
|
||
|
query = "select h.hw_id, h.hw_name, h.hw_model, h.hw_ipaddr, h.hw_userid, h.hw_password from hardwareinfo h where h.hw_name = \"" + str(switchName) + "\""
|
||
|
#print "query is ", query
|
||
|
result = self.__selectDb(query)
|
||
|
#desc = cursor.description
|
||
|
for i in result.fetchall():
|
||
|
host['hw_id'] = int(i[0])
|
||
|
host['hw_name'] = i[1]
|
||
|
host['hw_model'] = i[2]
|
||
|
host['hw_ipaddr'] = i[3]
|
||
|
host['hw_userid'] = i[4]
|
||
|
host['hw_password'] = i[5]
|
||
|
return host
|
||
|
|
||
|
def __queryDb(self, query):
|
||
|
cursor = self.conn.cursor()
|
||
|
cursor.execute (query)
|
||
|
row = cursor.fetchall()
|
||
|
desc = cursor.description
|
||
|
return row
|
||
|
|
||
|
def execQuery(self, query):
|
||
|
cursor = self.conn.cursor()
|
||
|
try:
|
||
|
cursor.execute (query)
|
||
|
#except Exception:
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
except MySQLdb.OperationalError, e:
|
||
|
msg = "ERROR: " + e[1]
|
||
|
sys.stderr.write(msg)
|
||
|
logit(self.logFile, msg)
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
exit()
|
||
|
return cursor
|
||
|
|
||
|
def __selectDb(self, query):
|
||
|
cursor = self.conn.cursor()
|
||
|
try:
|
||
|
cursor.execute (query)
|
||
|
#except Exception:
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
except MySQLdb.OperationalError, e:
|
||
|
msg = "ERROR: " + e[1]
|
||
|
sys.stderr.write(msg)
|
||
|
logit(self.logFile, msg)
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
exit()
|
||
|
return cursor
|
||
|
|
||
|
def __updateDb(self, query):
|
||
|
cursor = self.conn.cursor()
|
||
|
try:
|
||
|
cursor.execute (query)
|
||
|
except MySQLdb.OperationalError, e:
|
||
|
msg = "ERROR: " + e[1]
|
||
|
sys.stderr.write(msg)
|
||
|
logit(self.logFile, msg)
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
exit()
|
||
|
|
||
|
def __insertDb(self, query):
|
||
|
cursor = self.conn.cursor()
|
||
|
try:
|
||
|
cursor.execute (query)
|
||
|
#except Exception:
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
except MySQLdb.OperationalError, e:
|
||
|
msg = "ERROR: " + e[1]
|
||
|
sys.stderr.write(msg)
|
||
|
logit(self.logFile, msg)
|
||
|
#traceback.print_exc(sys.exc_info())
|
||
|
exit()
|
||
|
|
||
|
|
||
|
def updateReservation (self, reservationId, userId=None, reservationDuration=None, vlanIsolate=None, allocationNotes=None):
|
||
|
|
||
|
|
||
|
mesg = "Updating reservation"
|
||
|
logit(self.logFile, mesg)
|
||
|
|
||
|
if reservationDuration:
|
||
|
if len(resDuration) == 8:
|
||
|
expireDate = resDuration
|
||
|
elif len(resDuration) < 4:
|
||
|
numdays = resDuration
|
||
|
cmd = "date +%Y%m%d --date=\"" + numdays + " day\""
|
||
|
p = os.popen(cmd)
|
||
|
expireDate = string.strip(p.read())
|
||
|
else:
|
||
|
mesg = "ERROR: Invalid reservation duration\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
|
||
|
mesg = "Updating reservationDuration :" + resDuration
|
||
|
logit(self.logFile, mesg)
|
||
|
query = "update reservationinfo set reservation_exiration = \"" + expireDate_ + "\" where reservation_id = \"" + str(reservationId) + "\""
|
||
|
self.__updateDb(query)
|
||
|
|
||
|
if allocationNotes:
|
||
|
mesg = "Updating allocationNotes to " + allocationNotes
|
||
|
logit(self.logFile, mesg)
|
||
|
query = "update reservationinfo set notes = \"" + allocationNotes + "\" where reservation_id = \"" + str(reservationId) + "\""
|
||
|
self.__updateDb(query)
|
||
|
if vlanIsolate:
|
||
|
mesg = "UPDATING Vlan: "
|
||
|
logit(self.logFile, mesg)
|
||
|
query = "update reservationinfo set vlan_num = " + vlanIsolate + " where reservation_id = \"" + str(reservationId) + "\""
|
||
|
print "query is ", query
|
||
|
self.__updateDb(query)
|
||
|
if userId:
|
||
|
mesg = "UPDATING USER:"
|
||
|
logit(self.logFile, mesg)
|
||
|
query = "update reservationinfo set user_id = " + userId + " where reservation_id = \"" + str(reservationId) + "\""
|
||
|
self.__updateDb(query)
|
||
|
|
||
|
def addReservation (self, userId, reservationDuration=None, reservationNotes=None):
|
||
|
|
||
|
# set default for reservation duration to 15 days
|
||
|
if not reservationDuration:
|
||
|
resDuration = str(15)
|
||
|
else:
|
||
|
resDuration = str(reservationDuration)
|
||
|
|
||
|
|
||
|
if len(resDuration) == 8:
|
||
|
expireDate = resDuration
|
||
|
elif len(resDuration) < 4:
|
||
|
numdays = resDuration
|
||
|
cmd = "date +%Y%m%d --date=\"" + numdays + " day\""
|
||
|
p = os.popen(cmd)
|
||
|
expireDate = string.strip(p.read())
|
||
|
else:
|
||
|
mesg = "ERROR: Invalid reservation duration\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
|
||
|
# create reservation
|
||
|
# Create the reservation
|
||
|
print userId, expireDate,reservationNotes
|
||
|
query = "insert into reservationinfo (user_id, reservation_expiration, notes) values (\"" + str(userId) + "\", " + str(expireDate) + ", \"" + reservationNotes + "\")"
|
||
|
mesg = "Creating new reservation\n" + query
|
||
|
logit(self.logFile, mesg)
|
||
|
self.__selectDb(query)
|
||
|
# Get the res_id
|
||
|
query = "select max(reservation_id) from reservationinfo"
|
||
|
res_id = self.__selectDb(query).fetchone()[0]
|
||
|
mesg = " Reservation created - ID :" + str(res_id)
|
||
|
logit(self.logFile, mesg)
|
||
|
return res_id
|
||
|
|
||
|
|
||
|
def archiveAllocation(self, nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, res_notes, notes):
|
||
|
combined_notes = str(res_notes) + "|" + str(notes)
|
||
|
mesg = "Insert to allocation archive:"
|
||
|
query = "insert into allocationarchive (node_id, ip_addr, hostname, vlan_id, user_id, reservation_type, notes) \
|
||
|
values (\"" + \
|
||
|
str(nodeId) + "\", \"" + str(ip_addr) + "\", \"" + \
|
||
|
str(hostName) + "\", \"" + str(vlan_id) + "\", \"" + \
|
||
|
str(user_id) + "\", \"" + str(reservation_type) + "\", \"" + \
|
||
|
str(combined_notes) + "\")"
|
||
|
|
||
|
self.__insertDb(query)
|
||
|
|
||
|
@checkSuper
|
||
|
def allocateNode(self, reservationId, nodeId, hostName, vlanIsolate=None, ip_addr=None, notes=None):
|
||
|
#print "nodeId", nodeId, self.getMacFromSysId(nodeId)
|
||
|
|
||
|
# Check if node is already allocated
|
||
|
query = "select * from allocationinfo where node_id = \"" + str(nodeId) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 0:
|
||
|
val = str(result.fetchone())
|
||
|
mesg = "ERROR: Node already allocated " + val + "\n"
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
|
||
|
|
||
|
# Check if reservation exists
|
||
|
|
||
|
query = "select reservation_id, user_id, reservation_date, \
|
||
|
reservation_expiration, notes from reservationinfo \
|
||
|
where reservation_id = \"" + str(reservationId) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
if result.rowcount > 0:
|
||
|
res_results = result.fetchall()[0]
|
||
|
val = str(res_results)
|
||
|
res_id= res_results[0]
|
||
|
user_id = res_results[1]
|
||
|
res_notes = res_results[4]
|
||
|
if self.verbose:
|
||
|
mesg = "Reservation: " + val
|
||
|
logit(self.logFile, mesg)
|
||
|
else:
|
||
|
mesg = "ERROR: Reservation does not exist: " + reservationId + "\n"
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
|
||
|
|
||
|
if not vlanIsolate:
|
||
|
vlan = self.getAvailableVlan()
|
||
|
else:
|
||
|
vlan = vlanIsolate
|
||
|
|
||
|
# Allocate nodes to the reservation
|
||
|
# Reserve the node and assign to user
|
||
|
vlan_id = self.getVlanId(vlan)
|
||
|
if vlan != 999:
|
||
|
if not ip_addr:
|
||
|
ip_addr = self.getDomainIp(vlan)
|
||
|
else:
|
||
|
# Check to see if IP is free
|
||
|
query = "select * from allocationinfo where ip_addr = \"" + str(ip_addr) + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 0:
|
||
|
mesg = "ERROR: IP Address specified (" + str(ip_addr) + ") already in use\n"
|
||
|
mesg += str(result.fetchone())
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
else:
|
||
|
ip_addr = self.getIpFromSysId(nodeId)
|
||
|
#print "ip is ", ip_addr
|
||
|
|
||
|
# If there is no hostname, set to default
|
||
|
if not hostName:
|
||
|
hostName = self.getLocationFromSysId(nodeId)
|
||
|
|
||
|
#print "hostname is ", hostName, "ip is ", ip_addr, "vlan is ", vlan_id
|
||
|
|
||
|
# Assign IP address to node
|
||
|
dhcpdns = DhcpDns(self.config, verbose=1)
|
||
|
dnscheck = dhcpdns.addDhcp(hostName, ip_addr, self.getMacFromSysId(nodeId))
|
||
|
dhcpdns.addDns(hostName, ip_addr)
|
||
|
|
||
|
|
||
|
mesg = "Insert to Node allocation:"
|
||
|
query = "insert into allocationinfo (reservation_id, node_id, ip_addr, hostname, vlan_id, notes) \
|
||
|
values (\"" + str(reservationId) + "\", \"" + str(nodeId) + "\", \"" + \
|
||
|
str(ip_addr) + "\", \"" + str(hostName) + "\", \"" + str(vlan_id) + "\", \"" + \
|
||
|
str(notes) + "\")"
|
||
|
self.__insertDb(query)
|
||
|
|
||
|
#Archive
|
||
|
reservation_type = "allocation"
|
||
|
self.archiveAllocation(nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, res_notes, notes)
|
||
|
|
||
|
|
||
|
def rgasstest(self, vlan_num):
|
||
|
query = "select * from vlaninfo where vlan_num = " + vlan_num
|
||
|
res = self.__selectDb(query).fetchall()
|
||
|
print res
|
||
|
|
||
|
|
||
|
|
||
|
def removeReservation(self, res):
|
||
|
query = "delete from reservationinfo where reservation_id = " + str(res)
|
||
|
self.__updateDb(query)
|
||
|
query = "delete from allocationinfo where reservation_id = " + str(res)
|
||
|
self.__updateDb(query)
|
||
|
|
||
|
@checkSuper
|
||
|
def releaseNode(self, nodeName):
|
||
|
# Get the nodeId
|
||
|
query = "select node_id, r.reservation_id, a.ip_addr, hostname, vlan_id, a.notes, r.notes,r.user_id from allocationinfo a, sysinfo s, reservationinfo r where a.node_id = s.sys_id and a.reservation_id = r.reservation_id and location = \"" + nodeName + "\""
|
||
|
print query
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount == 0:
|
||
|
mesg = "ERROR: Node not allocated\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
exit(1)
|
||
|
if result.rowcount > 1:
|
||
|
mesg = "WARNING: Node allocated multiple times (" + str(result.rowcount) + ")"
|
||
|
logit(self.logFile, mesg)
|
||
|
|
||
|
val = result.fetchone()
|
||
|
nodeId = int(val[0])
|
||
|
resId = int(val[1])
|
||
|
ip_addr = val[2]
|
||
|
hostName = val[3]
|
||
|
vlan_id = int(val[4])
|
||
|
allocation_notes = val[5]
|
||
|
reservation_notes = val[6]
|
||
|
user_id = val[7]
|
||
|
|
||
|
print "hostname is ", hostName
|
||
|
# Assign IP address to node
|
||
|
dhcpdns = DhcpDns(self.config, verbose=1)
|
||
|
dnscheck = dhcpdns.removeDns(hostName)
|
||
|
dhcpdns.removeDhcp(hostName)
|
||
|
|
||
|
'''
|
||
|
query = "select reservation_id, notes from reservationinfo where node_id = " + str(nodeId)
|
||
|
result = self.__selectDb(query)
|
||
|
for i in result:
|
||
|
print i
|
||
|
print result.rowcount
|
||
|
if result.rowcount == 0:
|
||
|
mesg = "No Reservation for this node.\n Please check"
|
||
|
logit(self.logFile, mesg)
|
||
|
exit(1)
|
||
|
if result.rowcount > 1:
|
||
|
mesg = "WARNING: Muliple reservations exist (" + str(result.rowcount) + ")"
|
||
|
logit(self.logFile, mesg)
|
||
|
|
||
|
resId = int(result.fetchone()[0])
|
||
|
res_notes = int(result.fetchone()[1])
|
||
|
|
||
|
print resId, res_notes
|
||
|
'''
|
||
|
|
||
|
# Eventually should add count =1 so deletes do get out of control
|
||
|
query = "delete from allocationinfo where reservation_id = " + str(resId) + " and node_id = " + str(nodeId)
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
# Archive node release
|
||
|
reservation_type = "release"
|
||
|
self.archiveAllocation(nodeId, ip_addr, hostName, vlan_id, user_id, reservation_type, reservation_notes, allocation_notes)
|
||
|
|
||
|
def addImage(self, imageName):
|
||
|
name = ""
|
||
|
dist = ""
|
||
|
dist_ver = ""
|
||
|
|
||
|
if len(imageName.split(":")) > 1:
|
||
|
name = imageName.split(":")[0]
|
||
|
if len(imageName.split(":")) > 2:
|
||
|
dist = imageName.split(":")[1]
|
||
|
if len(imageName.split(":")) >= 3:
|
||
|
dist_ver = imageName.split(":")[2]
|
||
|
|
||
|
query = "select * from imageinfo where image_name = \"" + name + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 0:
|
||
|
mesg = "ERROR: Image already exists\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
exit()
|
||
|
|
||
|
if name == "":
|
||
|
mesg = "ERROR: Image details not specified\n"
|
||
|
logit(self.logFile, mesg)
|
||
|
mesg = "Example amd64-rgass-testing:Ubuntu:8.04\n"
|
||
|
mesg += "or amd64-rgass-testing::\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
exit()
|
||
|
|
||
|
query = "insert into imageinfo (image_name, dist, dist_ver) values(\"" + name + "\", \"" + dist + "\", \"" + dist_ver + "\")"
|
||
|
self.__insertDb(query)
|
||
|
|
||
|
|
||
|
def delImage(self, imageName):
|
||
|
query = "delete from imageinfo where image_name = \"" + imageName + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount == 0:
|
||
|
mesg = "ERROR: No images match your entry\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
exit()
|
||
|
|
||
|
def assignImagetoHost(self, host, image):
|
||
|
# imagemap db should be sys_id instead of mac_addr
|
||
|
# change later
|
||
|
|
||
|
cur_image = host['pxe_image_name']
|
||
|
# Get the id of the new image
|
||
|
query = "select image_id from imageinfo where image_name = " + "\"" + image + "\""
|
||
|
row = self.__queryDb(query)
|
||
|
if len(row) < 1:
|
||
|
mesg = "ERROR: Image \"" + image + "\" does not exist"
|
||
|
logit(self.logFile, mesg)
|
||
|
exit()
|
||
|
new_image_id = str(row[0][0])
|
||
|
|
||
|
# check for entry and delete in exists
|
||
|
query = "select * from imagemap where mac_addr = \"" + host['mac_addr'] + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
if result.rowcount > 0:
|
||
|
query = "delete from imagemap where mac_addr = \"" + host['mac_addr'] + "\""
|
||
|
result = self.__selectDb(query)
|
||
|
|
||
|
|
||
|
# update the database entry with the new image for the host
|
||
|
query = "insert into imagemap (mac_addr, image_id) values (\"" + host['mac_addr'] + "\", " + new_image_id + ")"
|
||
|
self.__selectDb(query)
|
||
|
|
||
|
|
||
|
# Update tftp link
|
||
|
mac_addr = "01-" + string.lower(string.replace(host['mac_addr'], ":", "-"))
|
||
|
maclink = self.tftpImageDir + "/" + mac_addr
|
||
|
#print "mac link is ", maclink
|
||
|
# Check if it exists first
|
||
|
if os.path.exists(maclink):
|
||
|
try:
|
||
|
os.unlink(maclink)
|
||
|
except Exception, e:
|
||
|
traceback.print_exc(sys.exc_info())
|
||
|
if OSError:
|
||
|
print OSError
|
||
|
mesg = "Cannot modify file. Please use sudo\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
return 1
|
||
|
print e
|
||
|
return 1
|
||
|
# Relink
|
||
|
newlink = os.path.basename(self.tftpBootOptionsDir) + "/" + image
|
||
|
try:
|
||
|
os.symlink(newlink, maclink)
|
||
|
mesg = "Image assignment Successful " + host['location'] + " " + host['mac_addr'] + " " + image
|
||
|
logit(self.logFile, mesg)
|
||
|
except Exception, e:
|
||
|
if OSError:
|
||
|
mesg = "Cannot modify file. Please use sudo\n"
|
||
|
sys.stderr.write(mesg)
|
||
|
return 1
|
||
|
print e
|
||
|
return 1
|
||
|
|
||
|
return 0
|
||
|
|