LSSTApplications  11.0-13-gbb96280,12.1+18,12.1+7,12.1-1-g14f38d3+72,12.1-1-g16c0db7+5,12.1-1-g5961e7a+84,12.1-1-ge22e12b+23,12.1-11-g06625e2+4,12.1-11-g0d7f63b+4,12.1-19-gd507bfc,12.1-2-g7dda0ab+38,12.1-2-gc0bc6ab+81,12.1-21-g6ffe579+2,12.1-21-gbdb6c2a+4,12.1-24-g941c398+5,12.1-3-g57f6835+7,12.1-3-gf0736f3,12.1-37-g3ddd237,12.1-4-gf46015e+5,12.1-5-g06c326c+20,12.1-5-g648ee80+3,12.1-5-gc2189d7+4,12.1-6-ga608fc0+1,12.1-7-g3349e2a+5,12.1-7-gfd75620+9,12.1-9-g577b946+5,12.1-9-gc4df26a+10
LSSTDataManagementBasePackage
ServiceHandler.py
Go to the documentation of this file.
1 #
2 # LSST Data Management System
3 # Copyright 2008, 2009, 2010 LSST Corporation.
4 #
5 # This product includes software developed by the
6 # LSST Project (http://www.lsst.org/).
7 #
8 # This program is free software: you can redistribute it and/or modify
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the LSST License Statement and
19 # the GNU General Public License along with this program. If not,
20 # see <http://www.lsstcorp.org/LegalNotices/>.
21 #
22 
23 from __future__ import with_statement
24 from __future__ import print_function
25 from __future__ import absolute_import
26 from builtins import object
27 
28 from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
29 from SocketServer import ThreadingMixIn
30 import threading
31 import json
32 import socket
33 
34 class ServiceHandler(BaseHTTPRequestHandler):
35 
36  version = "v1"
37  production = "/api/%s/production" % version
38 
39  def setParent(self, parent, runid):
40  """Set the parent object and runid of this handler
41 
42  Parameters
43  ----------
44  parent: object
45  The parent object that will deal with requests from this handler
46  runid: `str`
47  The runid of the production
48  """
49  self.parent = parent
50  self.runid = runid
51 
52  def do_DELETE(self):
53  """handle a HTTP DELETE request
54  """
55  # check to be sure that we handle this type of request
56  # produce an error if we don't see what we expect to see
57  if self.path == self.production:
58  s = self.rfile.read(int(self.headers['Content-length']))
59  # check for payload validity
60  # produce an error if we don't see what we expect to see
61  try:
62  data = json.loads(s)
63  level = data['level']
64  runid = data['runid']
65  if runid != self.runid:
66  raise ValueException("invalid runid received")
67  self.send_response(204)
68  self.end_headers()
69  self.parent.stopProduction(level)
70  except Exception as error:
71  self.send_response(422)
72  self.end_headers()
73  self.writeError("Unprocessable entity", "Error in syntax of message")
74  return
75  self.send_response(400)
76  self.writeError("Bad Request", "Request is unsupported")
77  self.end_headers()
78 
79  def writeError(self, status, message):
80  """emit an error message as a response to remote client
81 
82  Parameters
83  ----------
84  status : `str`
85  type of error
86  message : `str`
87  explanation of error
88  """
89  err = { "status": status, "message": message }
90  message = json.dumps(err)
91  self.wfile.write(message)