cluster verify: show correctly drained nodes
[ganeti-local] / lib / http / client.py
index 72836f1..2c62356 100644 (file)
@@ -65,8 +65,8 @@ class HttpClientRequest(object):
     @type ssl_params: HttpSslParams
     @param ssl_params: SSL key and certificate
     @type ssl_verify_peer: bool
-    @param ssl_verify_peer: Whether to compare our certificate with server's
-                            certificate
+    @param ssl_verify_peer: Whether to compare our certificate with
+        server's certificate
 
     """
     if post_data is not None:
@@ -167,8 +167,6 @@ class HttpClientRequestExecutor(http.HttpBase):
     http.HttpBase.__init__(self)
     self.request = req
 
-    self.poller = select.poll()
-
     try:
       # TODO: Implement connection caching/keep-alive
       self.sock = self._CreateSocket(req.ssl_params,
@@ -194,9 +192,9 @@ class HttpClientRequestExecutor(http.HttpBase):
       finally:
         # TODO: Keep-alive is not supported, always close connection
         force_close = True
-        http.ShutdownConnection(self.poller, self.sock,
-                                self.CLOSE_TIMEOUT, self.WRITE_TIMEOUT,
-                                response_msg_reader, force_close)
+        http.ShutdownConnection(self.sock, self.CLOSE_TIMEOUT,
+                                self.WRITE_TIMEOUT, response_msg_reader,
+                                force_close)
 
       self.sock.close()
       self.sock = None
@@ -246,8 +244,8 @@ class HttpClientRequestExecutor(http.HttpBase):
 
     if not connected:
       # Wait for connection
-      event = http.WaitForSocketCondition(self.poller, self.sock,
-                                          select.POLLOUT, self.CONNECT_TIMEOUT)
+      event = http.WaitForSocketCondition(self.sock, select.POLLOUT,
+                                          self.CONNECT_TIMEOUT)
       if event is None:
         raise http.HttpError("Timeout while connecting to server")
 
@@ -264,6 +262,14 @@ class HttpClientRequestExecutor(http.HttpBase):
     # keep-alive settings, see "man 7 tcp" for TCP_KEEPCNT, TCP_KEEPIDLE and
     # TCP_KEEPINTVL.
 
+    # Do the secret SSL handshake
+    if self.using_ssl:
+      self.sock.set_connect_state()
+      try:
+        http.Handshake(self.sock, self.WRITE_TIMEOUT)
+      except http.HttpSessionHandshakeUnexpectedEOF:
+        raise http.HttpError("Server closed connection during SSL handshake")
+
   def _SendRequest(self):
     """Sends request to server.
 
@@ -274,7 +280,8 @@ class HttpClientRequestExecutor(http.HttpBase):
     if self.request.headers:
       send_headers.update(self.request.headers)
 
-    send_headers[http.HTTP_HOST] = "%s:%s" % (self.request.host, self.request.port)
+    send_headers[http.HTTP_HOST] = "%s:%s" % (self.request.host,
+                                              self.request.port)
 
     # Response message
     msg = http.HttpMessage()
@@ -284,7 +291,8 @@ class HttpClientRequestExecutor(http.HttpBase):
     # TODO: For keep-alive, change to HTTP/1.1
     msg.start_line = \
       http.HttpClientToServerStartLine(method=self.request.method.upper(),
-                                       path=self.request.path, version=http.HTTP_1_0)
+                                       path=self.request.path,
+                                       version=http.HTTP_1_0)
     msg.headers = send_headers
     msg.body = self.request.post_data