You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.5 KiB
Python
119 lines
3.5 KiB
Python
# Copyright 2015 Hewlett-Packard
|
|
#
|
|
# Licensed 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.
|
|
|
|
|
|
import os
|
|
import signal
|
|
import socket
|
|
|
|
from freezerclient import exceptions
|
|
from oslo_log import log
|
|
from oslo_serialization import jsonutils as json
|
|
from oslo_utils import uuidutils
|
|
import psutil
|
|
|
|
|
|
LOG = log.getLogger(__name__)
|
|
|
|
CONFIG_FILE_EXT = '.conf'
|
|
|
|
|
|
def do_register(client, args=None):
|
|
if client:
|
|
client_info = {
|
|
"client_id": client.client_id,
|
|
"hostname": socket.gethostname()
|
|
}
|
|
try:
|
|
client.clients.create(client_info)
|
|
except exceptions.ApiClientException as e:
|
|
if e.status_code == 409:
|
|
print("Client already registered")
|
|
return 73 # os.EX_CANTCREAT
|
|
return 0 # os.EX_OK
|
|
|
|
|
|
def find_config_files(path):
|
|
expanded_path = os.path.expanduser(path)
|
|
if os.path.isfile(expanded_path):
|
|
return [expanded_path]
|
|
file_list = []
|
|
if os.path.isdir(expanded_path):
|
|
for fname in next(os.walk(expanded_path))[2]:
|
|
if CONFIG_FILE_EXT.upper() == os.path.splitext(fname)[1].upper():
|
|
file_list.append('{0}/{1}'.format(expanded_path, fname))
|
|
return file_list
|
|
raise Exception("unable to find job files at the provided path "
|
|
"{0}".format(path))
|
|
|
|
|
|
def load_doc_from_json_file(fname, debug=False):
|
|
with open(fname, 'rb') as fd:
|
|
try:
|
|
doc = json.load(fd)
|
|
except Exception as e:
|
|
raise Exception("Unable to load conf file. {0}".format(e))
|
|
if debug:
|
|
print("File {0} loaded: ".format(fname))
|
|
return doc
|
|
|
|
|
|
def save_doc_to_json_file(doc, fname, debug=False):
|
|
with open(fname, 'w') as fd:
|
|
json.dump(doc, fd, indent=4)
|
|
if debug:
|
|
print('Saved doc to file: {0}'.format(fname))
|
|
|
|
|
|
def get_jobs_from_disk(path):
|
|
job_doc_list = [
|
|
load_doc_from_json_file(f) for f in find_config_files(path)]
|
|
for job_doc in job_doc_list:
|
|
if job_doc:
|
|
job_doc['job_id'] = job_doc.get('job_id', uuidutils.generate_uuid(
|
|
dashed=False))
|
|
return [x for x in job_doc_list if x]
|
|
|
|
|
|
def save_jobs_to_disk(job_doc_list, path):
|
|
for doc in job_doc_list:
|
|
fname = os.path.normpath('{0}/job_{1}.conf'.
|
|
format(path, doc['job_id']))
|
|
save_doc_to_json_file(doc, fname)
|
|
|
|
|
|
def get_active_jobs_from_api(client):
|
|
# might raise
|
|
search = {"match_not": [{"status": "completed"}]}
|
|
job_list, offset = [], 0
|
|
while True:
|
|
jobs = client.jobs.list(limit=10, offset=offset, search=search)
|
|
job_list.extend(jobs)
|
|
if len(jobs) < 10:
|
|
break
|
|
offset += len(jobs)
|
|
return job_list
|
|
|
|
|
|
def terminate_subprocess(pid, name):
|
|
try:
|
|
process = psutil.Process(pid)
|
|
if process.name.startswith(name):
|
|
os.kill(pid, signal.SIGTERM)
|
|
else:
|
|
LOG.warning('The name {} does not match the pid {}'.format(
|
|
name, pid))
|
|
except Exception:
|
|
LOG.debug('Process {} does not exists anymore'.format(pid))
|