Revision 20b509de

b/Makefile.am
126 126
	lib/rapi/__init__.py \
127 127
	lib/rapi/baserlib.py \
128 128
	lib/rapi/client.py \
129
	lib/rapi/client_utils.py \
129 130
	lib/rapi/connector.py \
130 131
	lib/rapi/rlib2.py
131 132

  
b/lib/rapi/client_utils.py
1
#
2
#
3

  
4
# Copyright (C) 2010 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

  
21

  
22
"""RAPI client utilities.
23

  
24
"""
25

  
26
from ganeti import constants
27
from ganeti import cli
28

  
29
from ganeti.rapi import client
30

  
31
# Local constant to avoid importing ganeti.http
32
HTTP_NOT_FOUND = 404
33

  
34

  
35
class RapiJobPollCb(cli.JobPollCbBase):
36
  def __init__(self, cl):
37
    """Initializes this class.
38

  
39
    @param cl: RAPI client instance
40

  
41
    """
42
    cli.JobPollCbBase.__init__(self)
43

  
44
    self.cl = cl
45

  
46
  def WaitForJobChangeOnce(self, job_id, fields,
47
                           prev_job_info, prev_log_serial):
48
    """Waits for changes on a job.
49

  
50
    """
51
    try:
52
      result = self.cl.WaitForJobChange(job_id, fields,
53
                                        prev_job_info, prev_log_serial)
54
    except client.GanetiApiError, err:
55
      if err.code == HTTP_NOT_FOUND:
56
        return None
57

  
58
      raise
59

  
60
    if result is None:
61
      return constants.JOB_NOTCHANGED
62

  
63
    return (result["job_info"], result["log_entries"])
64

  
65
  def QueryJobs(self, job_ids, fields):
66
    """Returns the given fields for the selected job IDs.
67

  
68
    @type job_ids: list of numbers
69
    @param job_ids: Job IDs
70
    @type fields: list of strings
71
    @param fields: Fields
72

  
73
    """
74
    if len(job_ids) != 1:
75
      raise NotImplementedError("Only one job supported at this time")
76

  
77
    try:
78
      result = self.cl.GetJobStatus(job_ids[0])
79
    except client.GanetiApiError, err:
80
      if err.code == HTTP_NOT_FOUND:
81
        return [None]
82

  
83
      raise
84

  
85
    return [[result[name] for name in fields], ]
86

  
87

  
88
def PollJob(rapi_client, job_id, reporter):
89
  """Function to poll for the result of a job.
90

  
91
  @param rapi_client: RAPI client instance
92
  @type job_id: number
93
  @param job_id: Job ID
94
  @type reporter: L{cli.JobPollReportCbBase}
95
  @param reporter: PollJob reporter instance
96

  
97
  """
98
  return cli.GenericPollJob(job_id, RapiJobPollCb(rapi_client), reporter)

Also available in: Unified diff