Skip to content
Snippets Groups Projects
Commit 3a139426 authored by Vladimir Bahyl's avatar Vladimir Bahyl Committed by Michael Davis
Browse files

Adding first draft version of the supply pool refill mechanism

parent 00ebfc0b
Branches
Tags
No related merge requests found
#!/usr/bin/python36
import sys
import json
import logging
from random import shuffle
from subprocess import STDOUT, check_output, CalledProcessError
##########
#
# CONFIGURATION
#
##########
timeout = 10 # how many seconds to wait for the external command to finish
separator = "," # characted which separates multiple tape pools in the CTA "supply" column
# Configure logging
logfile = sys.argv[0] + ".log"
logging.basicConfig (
level = logging.DEBUG, # only messages with log level above this are logged
format = "[%(levelname)-5.5s] %(message)s", # format of the logging (can be very complex - see the manual)
handlers = [
logging.FileHandler(logfile), # log to a logfile
logging.StreamHandler() # log to console STDOUT
])
##########
#
# FUNCTIONS
#
##########
# Extract eligible (not DISABLED, not FULL and NOT in a DISABLED library) tapes from a given tape pool
def extract_tapes(tapelibrary, tapepool):
tapes = []
command = ["/usr/bin/cta-admin", "--json", "tape", "ls", "--tapepool", tapepool, "--disabled", "false", "--full", "false"]
if ((tapelibrary) and (tapelibrary != "ALL")):
command.extend(["--logicallibrary", tapelibrary])
try:
logging.debug("Executing command " + format(command) + " with timeout of " + format(timeout) + " seconds")
output = check_output(command, stderr = STDOUT, timeout = timeout).decode("UTF-8")
except Exception as error:
logging.error(format(error))
sys.exit(-1)
if output == "]": output = "" # TEMPORARY UNTIL --json FIXED !!!
if output:
tapes = [line["vid"] for line in json.loads(output)]
else:
logging.warn("No eligible tapes extracted from the tape pool: " + tapepool)
return tapes
##########
#
# MAIN
#
##########
# Extract the list of all tape pools in CTA in JSON format
command = ["/usr/bin/cta-admin", "--json", "tapepool", "ls"]
try:
logging.debug("Executing command " + format(command) + " with timeout of " + format(timeout) + " seconds")
output = check_output(command, stderr = STDOUT, timeout = timeout).decode("UTF-8")
except Exception as error:
logging.error(format(error))
sys.exit(-1)
if output:
tapepools = json.loads(output)
else:
logging.error("List of CTA tape pools is empty, nothing to do, exiting")
sys.exit(0)
# Extract the list of DISABLED tape libraries
# LATER as --json not yet implemented
#logging.debug("List of extracted tape pools from CTA:\n" + format(tapepools))
# Iterate over the extracted CTA tape pools and re-fill them with supply tapes as needed
for tapepool in tapepools:
logging.info("Tape pool: " + tapepool["name"] + " which should have at least: " + tapepool["numPartialTapes"] + " partial tape(s) is supplied from: " + tapepool["supply"])
if (tapepool["numPartialTapes"] and tapepool["supply"]):
# Check if re-filling is actually needed
currentpartialtapes = len([tape for tape in extract_tapes("ALL", tapepool["name"])])
if (currentpartialtapes < int(tapepool["numPartialTapes"])):
logging.info("Tape pool: " + tapepool["name"] + " only has: " + format(currentpartialtapes) + " partial tape(s) available, re-filling")
else:
logging.info("Tape pool: " + tapepool["name"] + " already has: " + format(currentpartialtapes) + " partial tape(s) available, skipping")
continue
# Prepare the eligible supply tapes from a given supply pool
supplytapes = []
for supplypool in tapepool["supply"].split(separator):
supplytapes.extend([tape for tape in extract_tapes("ALL", supplypool)])
shuffle(supplytapes) # Randomize it (so that tapes are picked at random from multiple pools)
if len(supplytapes):
# Move the required number of supply tapes to the given tape pool
logging.info("Identified: " + format(len(supplytapes)) + " supply tapes, moving " + format(int(tapepool["numPartialTapes"]) - currentpartialtapes) + " to the pool: " + tapepool["name"])
for i in range(int(tapepool["numPartialTapes"]) - currentpartialtapes):
command = ["/usr/bin/cta-admin", "tape", "ch", "--vid", supplytapes[i], "--tapepool", tapepool["name"]]
try:
logging.debug("Executing command " + format(command) + " with timeout of " + format(timeout) + " seconds")
# output = check_output(command, stderr = STDOUT, timeout = timeout).decode("UTF-8")
except Exception as error:
logging.error(format(error))
sys.exit(-1)
logging.info("Tape: " + format(supplytapes[i]) + " moved to the pool: " + tapepool["name"])
else:
logging.warn("Unable to re-fill the tape pool: " + tapepool["name"] + ", no eligible supply tapes identified")
else:
logging.warn("Unable to re-fill the tape pool: " + tapepool["name"] + " because either the number of partial tapes: " + tapepool["numPartialTapes"] + " or the supply pool: " + tapepool["supply"] + " is not properly configured")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment