Commit 20b509de authored by Michael Hanselmann's avatar Michael Hanselmann

Add RAPI client utility module with RAPI PollJob function

The RAPI client module shouldn't depend on any Ganeti module, yet it's
useful to have some Ganeti-specific code, like a PollJob function for
RAPI.
Signed-off-by: default avatarMichael Hanselmann <hansmi@google.com>
Reviewed-by: default avatarDavid Knowles <dknowles@google.com>
parent 8a019a03
......@@ -126,6 +126,7 @@ rapi_PYTHON = \
lib/rapi/__init__.py \
lib/rapi/baserlib.py \
lib/rapi/client.py \
lib/rapi/client_utils.py \
lib/rapi/connector.py \
lib/rapi/rlib2.py
......
#
#
# Copyright (C) 2010 Google Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
"""RAPI client utilities.
"""
from ganeti import constants
from ganeti import cli
from ganeti.rapi import client
# Local constant to avoid importing ganeti.http
HTTP_NOT_FOUND = 404
class RapiJobPollCb(cli.JobPollCbBase):
def __init__(self, cl):
"""Initializes this class.
@param cl: RAPI client instance
"""
cli.JobPollCbBase.__init__(self)
self.cl = cl
def WaitForJobChangeOnce(self, job_id, fields,
prev_job_info, prev_log_serial):
"""Waits for changes on a job.
"""
try:
result = self.cl.WaitForJobChange(job_id, fields,
prev_job_info, prev_log_serial)
except client.GanetiApiError, err:
if err.code == HTTP_NOT_FOUND:
return None
raise
if result is None:
return constants.JOB_NOTCHANGED
return (result["job_info"], result["log_entries"])
def QueryJobs(self, job_ids, fields):
"""Returns the given fields for the selected job IDs.
@type job_ids: list of numbers
@param job_ids: Job IDs
@type fields: list of strings
@param fields: Fields
"""
if len(job_ids) != 1:
raise NotImplementedError("Only one job supported at this time")
try:
result = self.cl.GetJobStatus(job_ids[0])
except client.GanetiApiError, err:
if err.code == HTTP_NOT_FOUND:
return [None]
raise
return [[result[name] for name in fields], ]
def PollJob(rapi_client, job_id, reporter):
"""Function to poll for the result of a job.
@param rapi_client: RAPI client instance
@type job_id: number
@param job_id: Job ID
@type reporter: L{cli.JobPollReportCbBase}
@param reporter: PollJob reporter instance
"""
return cli.GenericPollJob(job_id, RapiJobPollCb(rapi_client), reporter)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment