You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@libcloud.apache.org by to...@apache.org on 2014/08/20 18:20:57 UTC
[1/3] git commit: Add new base paused node state.
Repository: libcloud
Updated Branches:
refs/heads/trunk 3a8d7ff5f -> a03e9f31d
Add new base paused node state.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/298f5db6
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/298f5db6
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/298f5db6
Branch: refs/heads/trunk
Commit: 298f5db6ef42d22338d60fc3582cc31cdd7c4114
Parents: 3a8d7ff
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Aug 20 16:49:40 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed Aug 20 16:49:40 2014 +0200
----------------------------------------------------------------------
libcloud/compute/types.py | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/298f5db6/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index e296172..fbe9317 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -189,6 +189,7 @@ class NodeState(object):
:cvar SUSPENDED: Node is suspended.
:cvar ERROR: Node is an error state. Usually no operations can be performed
on the node once it ends up in the error state.
+ :cvar PAUSED: Node is paused.
:cvar UNKNOWN: Node state is unknown.
"""
RUNNING = 0
@@ -199,6 +200,7 @@ class NodeState(object):
STOPPED = 5
SUSPENDED = 6
ERROR = 7
+ PAUSED = 8
class Architecture(object):
[2/3] git commit: Update Node.__repr__ to display a friendly name for
the state attribute.
Posted by to...@apache.org.
Update Node.__repr__ to display a friendly name for the state attribute.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/5544e75e
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/5544e75e
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/5544e75e
Branch: refs/heads/trunk
Commit: 5544e75ef2f9fce5d92fba7d04582699f69ba986
Parents: 298f5db
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Aug 20 17:02:07 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed Aug 20 17:05:43 2014 +0200
----------------------------------------------------------------------
libcloud/compute/base.py | 4 +++-
libcloud/compute/types.py | 14 ++++++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/5544e75e/libcloud/compute/base.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/base.py b/libcloud/compute/base.py
index a585128..c043706 100644
--- a/libcloud/compute/base.py
+++ b/libcloud/compute/base.py
@@ -251,9 +251,11 @@ class Node(UuidMixin):
return self.driver.destroy_node(self)
def __repr__(self):
+ state = NodeState.tostring(self.state)
+
return (('<Node: uuid=%s, name=%s, state=%s, public_ips=%s, '
'private_ips=%s, provider=%s ...>')
- % (self.uuid, self.name, self.state, self.public_ips,
+ % (self.uuid, self.name, state, self.public_ips,
self.private_ips, self.driver.name))
http://git-wip-us.apache.org/repos/asf/libcloud/blob/5544e75e/libcloud/compute/types.py
----------------------------------------------------------------------
diff --git a/libcloud/compute/types.py b/libcloud/compute/types.py
index fbe9317..c7c7616 100644
--- a/libcloud/compute/types.py
+++ b/libcloud/compute/types.py
@@ -202,6 +202,20 @@ class NodeState(object):
ERROR = 7
PAUSED = 8
+ @classmethod
+ def tostring(cls, value):
+ values = cls.__dict__
+ values = dict([(key, string) for key, string in values.items() if
+ not key.startswith('__')])
+
+ for item_key, item_value in values.items():
+ if value == item_value:
+ return item_key
+
+ @classmethod
+ def fromstring(cls, value):
+ return getattr(cls, value.upper(), None)
+
class Architecture(object):
"""
[3/3] git commit: Update HTTP proxy code so it supports basic auth
authentication.
Posted by to...@apache.org.
Update HTTP proxy code so it supports basic auth authentication.
Project: http://git-wip-us.apache.org/repos/asf/libcloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/libcloud/commit/a03e9f31
Tree: http://git-wip-us.apache.org/repos/asf/libcloud/tree/a03e9f31
Diff: http://git-wip-us.apache.org/repos/asf/libcloud/diff/a03e9f31
Branch: refs/heads/trunk
Commit: a03e9f31d3f3a11a6fb6c0a3bdd81a40dd4c9169
Parents: 5544e75
Author: Tomaz Muraus <to...@apache.org>
Authored: Wed Aug 20 17:45:29 2014 +0200
Committer: Tomaz Muraus <to...@apache.org>
Committed: Wed Aug 20 18:18:22 2014 +0200
----------------------------------------------------------------------
.../examples/http_proxy/constructor_argument.py | 5 +-
.../http_proxy/set_http_proxy_method.py | 6 +--
docs/other/using-http-proxy.rst | 10 +++-
libcloud/httplib_ssl.py | 49 ++++++++++++++++++--
libcloud/test/test_connection.py | 10 ++++
5 files changed, 70 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/libcloud/blob/a03e9f31/docs/examples/http_proxy/constructor_argument.py
----------------------------------------------------------------------
diff --git a/docs/examples/http_proxy/constructor_argument.py b/docs/examples/http_proxy/constructor_argument.py
index ae54945..3542beb 100644
--- a/docs/examples/http_proxy/constructor_argument.py
+++ b/docs/examples/http_proxy/constructor_argument.py
@@ -1,6 +1,7 @@
from libcloud.compute.drivers.dreamhost import DreamhostConnection
-PROXY_URL = 'http://<proxy hostname>:<proxy port>'
+PROXY_URL_NO_AUTH = 'http://<proxy hostname>:<proxy port>'
+PROXY_URL_BASIC_AUTH = 'http://<user>:<pass>@<proxy hostname>:<proxy port>'
conn = DreamhostConnection(host='dreamhost.com', port=443,
- timeout=None, proxy_url=PROXY_URL)
+ timeout=None, proxy_url=PROXY_URL_NO_AUTH)
http://git-wip-us.apache.org/repos/asf/libcloud/blob/a03e9f31/docs/examples/http_proxy/set_http_proxy_method.py
----------------------------------------------------------------------
diff --git a/docs/examples/http_proxy/set_http_proxy_method.py b/docs/examples/http_proxy/set_http_proxy_method.py
index cb9b84a..b9d5bdf 100644
--- a/docs/examples/http_proxy/set_http_proxy_method.py
+++ b/docs/examples/http_proxy/set_http_proxy_method.py
@@ -3,10 +3,10 @@ from pprint import pprint
from libcloud.compute.types import Provider
from libcloud.compute.providers import get_driver
-PROXY_URL = 'http://<proxy hostname>:<proxy port>'
+PROXY_URL_NO_AUTH = 'http://<proxy hostname>:<proxy port>'
+PROXY_URL_BASIC_AUTH = 'http://<user>:<pass>@<proxy hostname>:<proxy port>'
cls = get_driver(Provider.RACKSPACE)
driver = cls('username', 'api key', region='ord')
-driver.connection.set_http_proxy(proxy_url=PROXY_URL)
-
+driver.connection.set_http_proxy(proxy_url=PROXY_URL_NO_AUTH)
pprint(driver.list_nodes())
http://git-wip-us.apache.org/repos/asf/libcloud/blob/a03e9f31/docs/other/using-http-proxy.rst
----------------------------------------------------------------------
diff --git a/docs/other/using-http-proxy.rst b/docs/other/using-http-proxy.rst
index 8c12dc5..4231bea 100644
--- a/docs/other/using-http-proxy.rst
+++ b/docs/other/using-http-proxy.rst
@@ -23,8 +23,8 @@ bellow:
Known limitations
-----------------
-* HTTP proxies which require authentication are not supported
* Python 2.6 is not supported
+* Only HTTP basic authentication proxy authorization method is supported
Examples
--------
@@ -35,10 +35,18 @@ with Libcloud.
1. Using http_proxy environment variable
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Without authentication:
+
.. sourcecode:: python
http_proxy=http://<proxy hostname>:<proxy port> python my_script.py
+With basic auth authentication:
+
+.. sourcecode:: python
+
+ http_proxy=http://<username>:<password>@<proxy hostname>:<proxy port> python my_script.py
+
2. Passing http_proxy argument to the connection class
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://git-wip-us.apache.org/repos/asf/libcloud/blob/a03e9f31/libcloud/httplib_ssl.py
----------------------------------------------------------------------
diff --git a/libcloud/httplib_ssl.py b/libcloud/httplib_ssl.py
index 3783f48..d74ad40 100644
--- a/libcloud/httplib_ssl.py
+++ b/libcloud/httplib_ssl.py
@@ -21,11 +21,14 @@ import re
import socket
import sys
import ssl
+import base64
import warnings
import libcloud.security
+from libcloud.utils.py3 import b
from libcloud.utils.py3 import httplib
from libcloud.utils.py3 import urlparse
+from libcloud.utils.py3 import urlunquote
__all__ = [
'LibcloudBaseConnection',
@@ -46,23 +49,37 @@ class LibcloudBaseConnection(object):
proxy_scheme = None
proxy_host = None
proxy_port = None
+
+ proxy_username = None
+ proxy_password = None
+
http_proxy_used = False
def set_http_proxy(self, proxy_url):
"""
Set a HTTP proxy which will be used with this connection.
- :param proxy_url: Proxy URL (e.g. http://hostname:3128)
+ :param proxy_url: Proxy URL (e.g. http://<hostname>:<port> without
+ authentication and
+ http://<username>:<password>@<hostname>:<port> for
+ basic auth authentication information.
:type proxy_url: ``str``
"""
if sys.version_info[:2] == (2, 6):
raise Exception('HTTP proxy support requires Python 2.7 or higher')
- scheme, host, port = self._parse_proxy_url(proxy_url=proxy_url)
+ result = self._parse_proxy_url(proxy_url=proxy_url)
+ scheme = result[0]
+ host = result[1]
+ port = result[2]
+ username = result[3]
+ password = result[4]
self.proxy_scheme = scheme
self.proxy_host = host
self.proxy_port = port
+ self.proxy_username = username
+ self.proxy_password = password
self.http_proxy_used = True
self._setup_http_proxy()
@@ -88,7 +105,22 @@ class LibcloudBaseConnection(object):
proxy_scheme = parsed.scheme
proxy_host, proxy_port = parsed.hostname, parsed.port
- return (proxy_scheme, proxy_host, proxy_port)
+ netloc = parsed.netloc
+
+ if '@' in netloc:
+ username_password = netloc.split('@', 1)[0]
+ split = username_password.split(':', 1)
+
+ if len(split) == 0:
+ raise ValueError('URL is in an invalid format')
+
+ proxy_username, proxy_password = split[0], split[1]
+ else:
+ proxy_username = None
+ proxy_password = None
+
+ return (proxy_scheme, proxy_host, proxy_port, proxy_username,
+ proxy_password)
def _setup_http_proxy(self):
"""
@@ -97,7 +129,16 @@ class LibcloudBaseConnection(object):
:param proxy_url: Proxy URL (e.g. http://<host>:3128)
:type proxy_url: ``str``
"""
- self.set_tunnel(host=self.host, port=self.port)
+ headers = {}
+
+ if self.proxy_username and self.proxy_password:
+ # Include authentication header
+ user_pass = '%s:%s' % (self.proxy_username, self.proxy_password)
+ encoded = base64.encodestring(b(urlunquote(user_pass))).strip()
+ auth_header = 'Basic %s' % (encoded.decode('utf-8'))
+ headers['Proxy-Authorization'] = auth_header
+
+ self.set_tunnel(host=self.host, port=self.port, headers=headers)
self._set_hostport(host=self.proxy_host, port=self.proxy_port)
def _activate_http_proxy(self, sock):
http://git-wip-us.apache.org/repos/asf/libcloud/blob/a03e9f31/libcloud/test/test_connection.py
----------------------------------------------------------------------
diff --git a/libcloud/test/test_connection.py b/libcloud/test/test_connection.py
index 75d63fd..aabbd1d 100644
--- a/libcloud/test/test_connection.py
+++ b/libcloud/test/test_connection.py
@@ -40,6 +40,16 @@ class BaseConnectionClassTestCase(unittest.TestCase):
self.assertEqual(result[0], 'http')
self.assertEqual(result[1], '127.0.0.1')
self.assertEqual(result[2], 3128)
+ self.assertEqual(result[3], None)
+ self.assertEqual(result[4], None)
+
+ proxy_url = 'http://user1:pass1@127.0.0.1:3128'
+ result = conn._parse_proxy_url(proxy_url=proxy_url)
+ self.assertEqual(result[0], 'http')
+ self.assertEqual(result[1], '127.0.0.1')
+ self.assertEqual(result[2], 3128)
+ self.assertEqual(result[3], 'user1')
+ self.assertEqual(result[4], 'pass1')
proxy_url = 'https://127.0.0.1:3128'
expected_msg = 'Only http proxies are supported'