486 lines
20 KiB
Python
486 lines
20 KiB
Python
# /usr/bin/env 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 optparse
|
|
|
|
|
|
import resourcequerysql
|
|
from systemmanagementinterface import SystemManagementInterface
|
|
from ipmi import Ipmi
|
|
from usermanagementinterface import UserManagementInterface
|
|
|
|
from bootmanagementinterface import BootManagementInterface
|
|
import pxe
|
|
from raritanpdu import raritanDominionPx
|
|
from delldrac import dellDrac
|
|
from util import *
|
|
import version
|
|
|
|
from hwswitchinterface import HwSwitchInterface
|
|
from hwswitch import HwDellSwitch
|
|
|
|
import usermanagement
|
|
#from usermanagement import UserManagement
|
|
|
|
def parseTable():
|
|
pass
|
|
|
|
def main():
|
|
""" Main """
|
|
ver = version.version.split(" ")[1]
|
|
rev = version.revision
|
|
|
|
configFile = loadConfigFile("ZONI_DEFAULT.conf")
|
|
#logit(configFile['logFile'], "Starting prs_client")
|
|
#logit(configFile['logFile'], "Loading config file")
|
|
|
|
parser = optparse.OptionParser(usage="%prog [-n] [-u] [--uid] [-v]", version="%prog " + ver + " " + rev)
|
|
parser.add_option("-n", "--nodeName", dest="nodeName", help="Specify node")
|
|
parser.add_option("--switchPort", "--switchport", dest="switchPort", help="Specify switchport switchname:portnum")
|
|
parser.add_option("-u", "--userName", dest="userName", help="Specify user name")
|
|
parser.add_option("--uid", dest="uid", help="Specify user id")
|
|
parser.add_option("-v", "--verbose", dest="verbosity", help="Be verbose", action="store_true", default=False)
|
|
|
|
|
|
# Hardware controller
|
|
group = optparse.OptionGroup(parser, "Hardware control", "Options to control power on nodes")
|
|
group.add_option("--hw", dest="hardwareType", help="Make hardware call to ipmi|drac|pdu")
|
|
group.add_option("--powerStatus", "--powerstatus", dest="POWERSTATUS", help="Get power status on node", action="store_true", default=False)
|
|
group.add_option("--reboot", "--reboot", dest="REBOOTNODE", help="Reboot node (Soft)", action="store_true", default=False)
|
|
group.add_option("--powerCycle", "--powercycle", dest="POWERCYCLE", help="Power Cycle (Hard)", action="store_true", default=False)
|
|
group.add_option("--powerOff", "--poweroff", dest="POWEROFF", help="Power off node", action="store_true", default=False)
|
|
group.add_option("--powerOn", "--poweron", dest="POWERON", help="Power on node", action="store_true", default=False)
|
|
group.add_option("--powerReset", "--powerreset", dest="POWERRESET", help="Power reset node", action="store_true", default=False)
|
|
group.add_option("--console", dest="CONSOLE", help="Console mode", action="store_true", default=False)
|
|
parser.add_option_group(group)
|
|
|
|
# Query Interface
|
|
group = optparse.OptionGroup(parser, "Query Interface", "Query current systems and allocations")
|
|
group.add_option("-R", "--showReservation", "--showreservation", dest="showReservation", help="Show current node reservations", action="store_true", default=False)
|
|
group.add_option("-A", "--showAllocation", "--showallocation", dest="showAllocation", help="Show current node allocation", action="store_true", default=False)
|
|
group.add_option("-s", "--showResources", dest="showResources", help="Show available resources to choose from", action="store_true", default=False)
|
|
group.add_option("-p", "--procs", dest="numProcs", help="Set number of processors" )
|
|
group.add_option("-c", "--clock", dest="clockSpeed", help="Processor clock" )
|
|
group.add_option("--memory", dest="numMemory", help="Amount of memory (Bytes)" )
|
|
group.add_option("-f", "--cpuflags", dest="cpuFlags", help="CPU flags" )
|
|
group.add_option("--cores", dest="numCores", help="Number of Cores" )
|
|
group.add_option("-i", "--showPxeImages", "--showpxeimages", dest="showPxeImages", help="Show available PXE images to choose from", action="store_true", default=False)
|
|
group.add_option("-m", "--showPxeImageMap", "--showpxeimagemap", dest="showPxeImageMap", help="Show PXE images host mapping", action="store_true", default=False)
|
|
group.add_option("--showArchive", "--showarchive", dest="showArchive", help="Show allocation archive", action="store_true", default=False)
|
|
parser.add_option_group(group)
|
|
#parser.add_option("-p", "--printResources", dest="printResources", help="Print available resources to choose from", action="store_true", default=False)
|
|
|
|
# Admin INterface
|
|
group = optparse.OptionGroup(parser, "Admin Interface", "Administration Interface:")
|
|
group.add_option("--admin", dest="ADMIN", help="Enter Admin mode", action="store_true", default=False)
|
|
group.add_option("--addPxeImage", "--addpxeimage", dest="imageName", help="Add PXE image to database", action="store_true", default=False)
|
|
group.add_option("--enableHostPort", "--enablehostport", dest="enableHostPort", help="Enable a switch port", action="store_true", default=False)
|
|
group.add_option("--disableHostPort", "--disablehostport", dest="disableHostPort", help="Disable a switch port", action="store_true", default=False)
|
|
group.add_option("--removeVlan", "--removevlan", dest="removeVlanId", help="Remove vlan from all switches")
|
|
group.add_option("--createVlan", "--createvlan", dest="createVlanId", help="Create a vlan on all switches")
|
|
group.add_option("--addNodeToVlan", "--addnodetovlan", dest="add2Vlan", help="Add node to a vlan")
|
|
group.add_option("--removeNodeFromVlan", "--removenodefromvlan", dest="removeFromVlan", help="Remove node from a vlan")
|
|
group.add_option("--setNativeVlan", "--setnativevlan", dest="setNative", help="Configure native vlan")
|
|
group.add_option("--restoreNativeVlan", "--restorenativevlan", dest="restoreNative", help="Restore native vlan", action="store_true", default=False)
|
|
group.add_option("--removeAllVlans", "--removeallvlans", dest="removeAllVlans", help="Removes all vlans from a switchport", action="store_true", default=False)
|
|
group.add_option("--sendSwitchCommand", "--sendswitchcommand", dest="sendSwitchCommand", help="Send Raw Switch Command, VERY DANGEROUS. config;interface switchport ethernet g14;etc")
|
|
group.add_option("--interactiveSwitchConfig", "--interactiveswitchconfig", dest="interactiveSwitchConfig", help="Interactively configure a switch. switchhname")
|
|
group.add_option("--showSwitchConfig", "--showswitchconfig", dest="showSwitchConfig", help="Show switch config for node", action="store_true", default=False)
|
|
parser.add_option_group(group)
|
|
|
|
# Switch
|
|
#group = optparse.OptionGroup(parser, "Switch Interface", "Switch Interface:")
|
|
#group.add_option("--rawswitch", dest="RAWSWITCH", help="Enter RAW Switch Admin mode", action="store_true", default=False)
|
|
#group.add_option("--enablePort", "--enableport", dest="enablePort", help="Enable a port on the switch")
|
|
#group.add_option("--disablePort", "--disableport", dest="disablePort", help="Disable a port on the switch")
|
|
#group.add_option("--addVlanToTrunks", "--addvlantotrunks", dest="addVlanToTrunks", help="")
|
|
|
|
|
|
# Allocation Interface
|
|
group = optparse.OptionGroup(parser, "Allocation Interface", "Change current systems allocations:")
|
|
#group.add_option("-a", "--allocateResources", dest="allocateResources", help="Allocate resource", action="store_true", default=False)
|
|
group.add_option("--addImage", "--addimage", dest="addImage", help="Add image to PRS - amd64-image:dist:dist_ver")
|
|
group.add_option("--delImage", "--delimage", dest="delImage", help="Delete PXE image")
|
|
group.add_option("--assignImage", "--assignimage", dest="assignImage", help="Assign image to resource")
|
|
|
|
group.add_option("--allocateNode", "--allocatenode", dest="allocateNode", help="Assign node to a user", action="store_true", default=False)
|
|
group.add_option("--allocationNotes", "--allocationnotes", dest="allocationNotes", help="Description of allocation")
|
|
group.add_option("--vlanIsolate", "--vlanisolate", dest="vlanIsolate", help="Specify vlan for network isolation")
|
|
group.add_option("--hostName", "--hostname", dest="hostName", help="Specify hostname for node")
|
|
group.add_option("--ipaddr", dest="ipAddr", help="Specify ip address for node")
|
|
|
|
group.add_option("--releaseNode", "--releasenode", dest="releaseNode", help="Release current node allocation", action="store_true", default=False)
|
|
group.add_option("--reservationDuration", "--reservationduration", dest="reservationDuration", help="Specify duration of node reservation - YYYYMMDD format")
|
|
group.add_option("--reservationId", "--reservationid", dest="reservationId", help="Reservation ID")
|
|
group.add_option("--reservationNotes", "--reservationnotes", dest="reservationNotes", help="Description of reservation")
|
|
group.add_option("--addReservation", "--addreservation", dest="addReservation", help="Add a Reservation", action="store_true", default=False)
|
|
group.add_option("--updateReservation", "--updatereservation", dest="updateReservation", help="Update Reservation", action="store_true", default=False)
|
|
group.add_option("--delReservation", "--delreservation", dest="delReservation", help="Delete Reservation")
|
|
#group.add_option("-a", "--allocateResources", dest="allocateResources", help="Allocate resource", action="store_true", default=False)
|
|
group.add_option("--rgasstest", dest="rgasstest", help="Debug testing function", action="store_true", default=False)
|
|
parser.add_option_group(group)
|
|
|
|
(options, args) = parser.parse_args()
|
|
|
|
cmdargs = {}
|
|
|
|
# setup db connection
|
|
query = resourcequerysql.ResourceQuerySql(configFile, options.verbosity)
|
|
|
|
# Get host info
|
|
host=None
|
|
if options.nodeName:
|
|
host = query.getHostInfo(options.nodeName)
|
|
#print host
|
|
|
|
|
|
# Hardware control
|
|
if options.hardwareType:
|
|
|
|
if (options.hardwareType) and options.hardwareType not in configFile['hardware_control']:
|
|
mesg = "Non support hardware type specified\n"
|
|
mesg += "Supported types:\n"
|
|
mesg += str(configFile['hardware_control'])
|
|
mesg += "\n\n"
|
|
sys.stdout.write(mesg)
|
|
exit()
|
|
|
|
if (options.hardwareType) and options.nodeName:
|
|
#host = query.getHostInfo(options.nodeName)
|
|
if options.hardwareType == "ipmi":
|
|
hw = Ipmi(options.nodeName, host["ipmi_user"], host["ipmi_password"])
|
|
|
|
if options.hardwareType == "pdu":
|
|
hw = raritanDominionPx(host)
|
|
|
|
if options.hardwareType == "drac":
|
|
# Check if node has drac card
|
|
if "drac_name" in host:
|
|
hw = dellDrac(host)
|
|
else:
|
|
mesg = "Host (" + options.nodeName + ") does not have a DRAC card!!\n"
|
|
sys.stdout.write(mesg)
|
|
exit(1)
|
|
|
|
if options.verbosity:
|
|
hw.setVerbose(True)
|
|
|
|
if options.REBOOTNODE:
|
|
hw.powerReset()
|
|
exit()
|
|
if options.POWERCYCLE:
|
|
hw.powerCycle()
|
|
exit()
|
|
if options.POWEROFF:
|
|
hw.powerOff()
|
|
exit()
|
|
if options.POWERON:
|
|
hw.powerOn()
|
|
exit()
|
|
if options.POWERRESET:
|
|
hw.powerReset()
|
|
exit()
|
|
if options.POWERSTATUS:
|
|
hw.getPowerStatus()
|
|
exit()
|
|
if options.CONSOLE:
|
|
hw.activateConsole()
|
|
exit()
|
|
hw.getPowerStatus()
|
|
|
|
|
|
if (options.hardwareType) and not options.nodeName:
|
|
mesg = "\nMISSSING OPTION: Node name required -n or --nodeName\n"
|
|
parser.print_help();
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
|
|
if (options.REBOOTNODE or options.POWERCYCLE or options.POWEROFF or \
|
|
options.POWERON or options.POWERSTATUS or options.CONSOLE or \
|
|
options.POWERRESET) and not options.hardwareType:
|
|
parser.print_help()
|
|
usage = "\nMISSING OPTION: When specifying hardware parameters, you need the --hw option\n"
|
|
print usage
|
|
exit()
|
|
|
|
# Query Interface
|
|
if (options.numProcs):
|
|
cmdargs["num_procs"] = options.numProcs
|
|
if (options.numMemory):
|
|
cmdargs["mem_total"] = options.numMemory
|
|
if (options.clockSpeed):
|
|
cmdargs["clock_speed"] = options.clockSpeed
|
|
if (options.numCores):
|
|
cmdargs["num_cores"] = options.numCores
|
|
if (options.cpuFlags):
|
|
cmdargs["cpu_flags"] = options.cpuFlags
|
|
if (options.nodeName):
|
|
cmdargs["node_id"] = options.nodeName
|
|
|
|
if (options.numCores or options.clockSpeed or options.numMemory or options.numProcs or options.cpuFlags) and not options.showResources:
|
|
usage = "MISSING OPTION: When specifying hardware parameters, you need the -s or --showResources switch"
|
|
print usage
|
|
parser.print_help()
|
|
exit()
|
|
|
|
# Show current allocations
|
|
if (options.showAllocation):
|
|
if options.uid:
|
|
print "set"
|
|
nameorid = int(options.uid)
|
|
else:
|
|
nameorid = options.userName
|
|
|
|
query.showAllocation(nameorid)
|
|
exit()
|
|
|
|
# Show current reservation
|
|
if (options.showReservation):
|
|
if options.uid:
|
|
print "set"
|
|
nameorid = int(options.uid)
|
|
else:
|
|
nameorid = options.userName
|
|
|
|
query.showReservation(nameorid)
|
|
exit()
|
|
|
|
# Show allocation Archive
|
|
if (options.showArchive):
|
|
query.showArchive()
|
|
|
|
# Print all Resources
|
|
if (options.showResources):
|
|
query.showResources(cmdargs)
|
|
|
|
# Show PXE images
|
|
if (options.showPxeImages):
|
|
query.showPxeImages()
|
|
|
|
# Show machine to PXE image mapping
|
|
if (options.showPxeImageMap):
|
|
query.showPxeImagesToSystemMap(cmdargs)
|
|
exit()
|
|
|
|
if (len(sys.argv) == 1):
|
|
parser.print_help()
|
|
exit()
|
|
|
|
|
|
# Get the host object
|
|
#hostObj = getHostObject()
|
|
#if (options.allocateResources) and options.nodeName:
|
|
#query.getHostInfo(options.nodeName)
|
|
|
|
#exit()
|
|
|
|
# Delete reservation
|
|
if (options.delReservation):
|
|
query.removeReservation(options.delReservation)
|
|
exit()
|
|
|
|
# Specify usermanagement, ldap or files
|
|
usermgt = usermanagement.ldap()
|
|
|
|
|
|
if (options.rgasstest):
|
|
#pdu = raritanDominionPx(host)
|
|
#print pdu
|
|
#bootit = pxe.Pxe(configFile, options.verbosity)
|
|
#bootit.createPxeUpdateFile(query.getPxeImages())
|
|
#bootit.updatePxe()
|
|
#print "host is ", host
|
|
#drac = dellDrac("drac-r2r1c3", 1)
|
|
#drac.getPowerStatus()
|
|
#drac.powerOff()
|
|
#drac.powerOn()
|
|
#drac.powerCycle()
|
|
#drac.powerReset()
|
|
#drac.getPowerStatus()
|
|
print "host is ", host
|
|
pdu = raritanDominionPx(host)
|
|
print "pdu", pdu
|
|
pdu.getPowerStatus()
|
|
exit()
|
|
|
|
# Create a reservation for a user
|
|
if (options.addReservation):
|
|
if not (options.userName or options.uid):
|
|
mesg = "ERROR: AddReservation requires the following arguments...\n"
|
|
if not (options.userName or options.uid):
|
|
mesg += " Username: --userName=username or --uid 1000\n"
|
|
|
|
mesg += " Reservation Duration: --reservationDuration YYYYMMDD or numdays(optional, default 15 days)\n"
|
|
#mesg += " ReservationId: --reservationId IDNUM(optional, you want this if you want to add nodes to an existing reservation)\n"
|
|
mesg += " Notes: --reservationNotes(optional)\n"
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
|
|
userId = options.uid
|
|
if not options.uid:
|
|
userId = usermgt.getUserId(options.userName)
|
|
|
|
reservationId = query.addReservation(userId, options.reservationDuration, options.reservationNotes)
|
|
|
|
|
|
# Allocate node to user
|
|
if (options.allocateNode):
|
|
vlanNum = 999
|
|
if (options.vlanIsolate):
|
|
vlanNum = options.vlanIsolate
|
|
|
|
if not (options.reservationId) or not options.nodeName:
|
|
mesg = "ERROR: AllocateNode requires the following arguments...\n"
|
|
if not (options.nodeName):
|
|
mesg += " NodeName: --nodeName r1r1u25 \n"
|
|
if not (options.reservationId):
|
|
mesg += " ReservationId: --reservationId IDNUM(add nodes to an existing reservation)\n"
|
|
|
|
mesg += " Hostname: --hostName mynode01\n"
|
|
mesg += " Domain: --vlanIsolate vlan_num(default 999)\n"
|
|
mesg += " IP address: --ipaddr 172.17.10.100\n"
|
|
mesg += " Notes: --allocationNotes(optional)\n"
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
|
|
query.allocateNode(options.reservationId, host['node_id'], options.hostName, vlanNum, options.ipAddr, options.allocationNotes)
|
|
exit()
|
|
|
|
# Update allocation
|
|
if (options.updateReservation):
|
|
if not options.reservationId:
|
|
mesg = "ERROR: UpdateReservation requires the following arguments...\n"
|
|
if not (options.reservationId):
|
|
mesg += " Reservation ID: --reservationId RES\n"
|
|
mesg += " NodeName: --nodeName r1r1u25 (optional)\n"
|
|
mesg += " Username: --userName=username or --uid 1000 (optional)\n"
|
|
mesg += " Reservation Duration: --reservationDuration YYYYMMDD or numdays (optional, default 15 days)\n"
|
|
mesg += " Vlan: --vlanIsolate vlan_num(optional)\n"
|
|
mesg += " Notes: --reservationNotes(optional)\n"
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
|
|
userId = None
|
|
if options.uid and options.userName:
|
|
# Get the username from uid
|
|
userId = options.uid
|
|
if not options.uid:
|
|
userId = usermgt.getUserId(options.userName)
|
|
|
|
print options.reservationId, userId, options.reservationDuration, options.vlanIsolate, options.reservationNotes
|
|
query.updateReservation(options.reservationId, userId, options.reservationDuration, options.vlanIsolate, options.reservationNotes)
|
|
|
|
# Release node allocation
|
|
if (options.releaseNode):
|
|
if not options.nodeName:
|
|
mesg = "ERROR: releaseNode requires the following arguments...\n"
|
|
if not (options.nodeName):
|
|
mesg += " NodeName: --nodeName r1r1u25 \n"
|
|
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
query.releaseNode(options.nodeName)
|
|
|
|
# Assign image to host
|
|
if (options.assignImage):
|
|
if not options.nodeName:
|
|
usage = "Node not specified. Please specify a node with --nodeName or -n"
|
|
print usage
|
|
exit()
|
|
if query.assignImagetoHost(host, options.assignImage):
|
|
print "ERROR"
|
|
exit()
|
|
|
|
# Update PXE
|
|
bootit = pxe.Pxe(configFile, options.verbosity)
|
|
bootit.createPxeUpdateFile(query.getPxeImages())
|
|
bootit.updatePxe()
|
|
|
|
|
|
# Add image to database
|
|
if (options.addImage):
|
|
query.addImage(options.addImage)
|
|
# Delete PXE image
|
|
if (options.delImage):
|
|
query.delImage(options.delImage)
|
|
|
|
# Admin Interface
|
|
# snmpwalk -v2c -c prs-domain sw0-r1r1 .1.3.6.1.2.1.17.7.1.4.3.1.5
|
|
if (options.ADMIN):
|
|
|
|
if not options.nodeName and not options.createVlanId and not options.removeVlanId and not options.switchPort and not options.interactiveSwitchConfig:
|
|
mesg = "\nERROR: nodeName or switch not specified. Please specify nodename with -n or --nodeName or --switchport\n"
|
|
parser.print_help()
|
|
sys.stderr.write(mesg)
|
|
exit()
|
|
|
|
# We can specify port/switch combinations here
|
|
if options.switchPort:
|
|
host = query.getSwitchInfo(options.switchPort.split(":")[0])
|
|
if len(options.switchPort.split(":")) > 1:
|
|
host['hw_port'] = options.switchPort.split(":")[1]
|
|
|
|
host['location'] = options.switchPort
|
|
|
|
if options.interactiveSwitchConfig:
|
|
host = query.getSwitchInfo(options.interactiveSwitchConfig)
|
|
|
|
HwSwitch = HwDellSwitch
|
|
hwswitch = HwSwitch(configFile, host)
|
|
if options.verbosity:
|
|
hwswitch.setVerbose(True)
|
|
|
|
#print "create vlan", options.createVlanId
|
|
if options.enableHostPort and options.nodeName:
|
|
hwswitch.enableHostPort()
|
|
if options.disableHostPort and (options.nodeName or options.switchPort):
|
|
hwswitch.disableHostPort()
|
|
if options.createVlanId:
|
|
hwswitch.createVlans(options.createVlanId, query.getAllSwitches(), query)
|
|
if options.removeVlanId:
|
|
hwswitch.removeVlans(options.removeVlanId, query.getAllSwitches(), query)
|
|
|
|
if options.add2Vlan and (options.nodeName or options.switchPort):
|
|
hwswitch.addNodeToVlan(options.add2Vlan)
|
|
|
|
if options.removeFromVlan and options.nodeName:
|
|
hwswitch.removeNodeFromVlan(options.removeFromVlan)
|
|
if options.setNative and (options.nodeName or options.switchPort):
|
|
hwswitch.setNativeVlan(options.setNative)
|
|
if options.restoreNative and options.nodeName:
|
|
hwswitch.restoreNativeVlan()
|
|
if options.removeAllVlans and (options.nodeName or options.switchPort):
|
|
hwswitch.removeAllVlans()
|
|
|
|
if options.sendSwitchCommand and (options.nodeName or options.switchPort):
|
|
hwswitch.sendSwitchCommand(options.sendSwitchCommand)
|
|
if options.interactiveSwitchConfig:
|
|
hwswitch.interactiveSwitchConfig()
|
|
if options.showSwitchConfig and (options.nodeName or options.switchPort):
|
|
hwswitch.showInterfaceConfig()
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|