зеркало из
1
0
Форкнуть 0
This commit is contained in:
Hugues Valois 2012-10-09 09:42:53 -07:00
Родитель 3e4404dea4
Коммит 4ddcdd054c
30 изменённых файлов: 4871 добавлений и 160 удалений

Просмотреть файл

@ -1,2 +1,6 @@
2012-??-?? Version 0.9.0
* Initial Release
2012-10-08 Version 0.6.0
* Added service management API
* Added ability to specify custom hosts
* Added proxy server support (HTTP CONNECT tunneling)
2012-06-XX Version 0.5.0
* Initial Release

Просмотреть файл

@ -21,6 +21,17 @@ Python Developer Center.
* Service Bus
* Queues: create, list and delete queues; create, list, and delete subscriptions; send, receive, unlock and delete messages
* Topics: create, list, and delete topics; create, list, and delete rules
* Service Management
* storage accounts: create, update, delete, list, regenerate keys
* affinity groups: create, update, delete, list, get properties
* locations: list
* hosted services: create, update, delete, list, get properties
* deployment: create, get, delete, swap, change configuration, update status, upgrade, rollback
* role instance: reboot, reimage
* discover addresses and ports for the endpoints of other role instances in your service
* get configuration settings and access local resources
* get role instance information for current role and other role instances
* query and set the status of the current role
# Getting Started
## Download Source Code
@ -193,6 +204,78 @@ sbs.send_topic_message('taskdiscussion', msg)
msg = sbs.receive_subscription_message('taskdiscussion', 'client1')
```
## Service Management
### Set-up certificates
You need to create two certificates, one for the server (a .cer file) and one for the client (a .pem file). To create the .pem file using [OpenSSL](http://www.openssl.org), execute this:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
To create the .cer certificate, execute this:
openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer
### List Available Locations
```Python
locations = sms.list_locations()
for location in locations:
print(location.name)
```
### Create a Storage Service
To create a storage service, you need a name for the service (between 3 and 24 lowercase characters and unique within Windows Azure), a label (up to 100 characters, automatically encoded to base-64), and either a location or an affinity group.
```Python
name = "mystorageservice"
desc = name
label = name
location = 'West US'
result = sms.create_storage_account(name, desc, label, location=location)
```
### Create a Cloud Service
A cloud service is also known as a hosted service (from earlier versions of Windows Azure). The **create_hosted_service** method allows you to create a new hosted service by providing a hosted service name (which must be unique in Windows Azure), a label (automatically encoded to base-64), and the location *or* the affinity group for your service.
```Python
name = "myhostedservice"
desc = name
label = name
location = 'West US'
result = sms.create_hosted_service(name, label, desc, location=location)
```
### Create a Deployment
To make a new deployment to Azure you must store the package file in a Windows Azure Blob Storage account under the same subscription as the hosted service to which the package is being uploaded. You can create a deployment package with the [Windows Azure PowerShell cmdlets](https://www.windowsazure.com/en-us/develop/php/how-to-guides/powershell-cmdlets/), or with the [cspack commandline tool](http://msdn.microsoft.com/en-us/library/windowsazure/gg432988.aspx).
```Python
service_name = "myhostedservice"
deployment_name = "v1"
slot = 'Production'
package_url = "URL_for_.cspkg_file"
configuration = base64.b64encode(open(file_path, 'rb').read('path_to_.cscfg_file'))
label = service_name
result = sms.create_deployment(service_name,
slot,
deployment_name,
package_url,
label,
configuration)
operation = sms.get_operation_status(result.request_id)
print('Operation status: ' + operation.status)
```
** For more examples please see the [Windows Azure Python Developer Center](http://www.windowsazure.com/en-us/develop/python) **
# Need Help?

Просмотреть файл

@ -20,6 +20,10 @@
<InterpreterArguments />
<InterpreterId>2af0f10d-7135-4994-9156-5d01c9c11b7e</InterpreterId>
<InterpreterVersion>2.7</InterpreterVersion>
<SccProjectName>SAK</SccProjectName>
<SccProvider>SAK</SccProvider>
<SccAuxPath>SAK</SccAuxPath>
<SccLocalPath>SAK</SccLocalPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DebugSymbols>true</DebugSymbols>
@ -34,6 +38,8 @@
<Compile Include="azure\http\httpclient.py" />
<Compile Include="azure\http\winhttp.py" />
<Compile Include="azure\http\__init__.py" />
<Compile Include="azure\servicemanagement\servicemanagementservice.py" />
<Compile Include="azure\servicemanagement\__init__.py" />
<Compile Include="azure\servicebus\servicebusservice.py" />
<Compile Include="azure\storage\blobservice.py" />
<Compile Include="azure\storage\queueservice.py" />
@ -44,10 +50,12 @@
<Compile Include="azure\servicebus\__init__.py" />
<Compile Include="azure\storage\storageclient.py" />
<Compile Include="azure\storage\__init__.py" />
<Compile Include="setup.py" />
</ItemGroup>
<ItemGroup>
<Folder Include="azure\" />
<Folder Include="azure\http" />
<Folder Include="azure\tests\" />
<Folder Include="azure\servicemanagement" />
<Folder Include="azure\servicebus\" />
<Folder Include="azure\storage" />
</ItemGroup>

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -12,6 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#--------------------------------------------------------------------------
import sys
import types
from datetime import datetime
from xml.dom import minidom
@ -28,6 +29,7 @@ BLOB_SERVICE_HOST_BASE = '.blob.core.windows.net'
QUEUE_SERVICE_HOST_BASE = '.queue.core.windows.net'
TABLE_SERVICE_HOST_BASE = '.table.core.windows.net'
SERVICE_BUS_HOST_BASE = '.servicebus.windows.net'
MANAGEMENT_HOST = 'management.core.windows.net'
#Development ServiceClient URLs
DEV_BLOB_HOST = '127.0.0.1:10000'
@ -58,6 +60,8 @@ _ERROR_ACCESS_POLICY = 'share_access_policy must be either SignedIdentifier or A
_ERROR_VALUE_SHOULD_NOT_BE_NULL = '%s should not be None.'
_ERROR_CANNOT_SERIALIZE_VALUE_TO_ENTITY = 'Cannot serialize the specified value (%s) to an entity. Please use an EntityProperty (which can specify custom types), int, str, bool, or datetime'
_USER_AGENT_STRING = 'pyazure'
METADATA_NS = 'http://schemas.microsoft.com/ado/2007/08/dataservices/metadata'
class WindowsAzureData(object):
@ -84,6 +88,9 @@ class WindowsAzureMissingResourceError(WindowsAzureError):
class Feed:
pass
class _Base64String(str):
pass
class HeaderDict(dict):
def __getitem__(self, index):
return super(HeaderDict, self).__getitem__(index.lower())
@ -172,6 +179,16 @@ _KNOWN_SERIALIZATION_XFORMS = {'include_apis':'IncludeAPIs',
'content_md5':'Content-MD5',
'last_modified': 'Last-Modified',
'cache_control': 'Cache-Control',
'account_admin_live_email_id': 'AccountAdminLiveEmailId',
'service_admin_live_email_id': 'ServiceAdminLiveEmailId',
'subscription_id': 'SubscriptionID',
'fqdn': 'FQDN',
'private_id': 'PrivateID',
'os_virtual_hard_disk': 'OSVirtualHardDisk',
'logical_disk_size_in_gb':'LogicalDiskSizeInGB',
'logical_size_in_gb':'LogicalSizeInGB',
'os':'OS',
'persistent_vm_downtime_info':'PersistentVMDowntimeInfo',
}
def _get_serialization_name(element_name):
@ -202,6 +219,18 @@ def _int_or_none(value):
return str(int(value))
def _bool_or_none(value):
if value is None:
return None
if isinstance(value, bool):
if value:
return 'true'
else:
return 'false'
return str(value)
def _convert_class_to_xml(source, xml_prefix = True):
if source is None:
return ''
@ -284,9 +313,28 @@ def _validate_not_none(param_name, param):
if param is None:
raise TypeError(_ERROR_VALUE_SHOULD_NOT_BE_NULL % (param_name))
def _fill_list_of(xmldoc, element_type):
xmlelements = _get_child_nodes(xmldoc, element_type.__name__)
return [_parse_response_body(xmlelement.toxml('utf-8'), element_type) for xmlelement in xmlelements]
def _fill_list_of(xmldoc, element_type, xml_element_name):
xmlelements = _get_child_nodes(xmldoc, xml_element_name)
return [_parse_response_body_from_xml_node(xmlelement, element_type) for xmlelement in xmlelements]
def _fill_scalar_list_of(xmldoc, element_type, parent_xml_element_name, xml_element_name):
'''Converts an xml fragment into a list of scalar types. The parent xml element contains a
flat list of xml elements which are converted into the specified scalar type and added to the list.
Example:
xmldoc=
<Endpoints>
<Endpoint>http://{storage-service-name}.blob.core.windows.net/</Endpoint>
<Endpoint>http://{storage-service-name}.queue.core.windows.net/</Endpoint>
<Endpoint>http://{storage-service-name}.table.core.windows.net/</Endpoint>
</Endpoints>
element_type=str
parent_xml_element_name='Endpoints'
xml_element_name='Endpoint'
'''
xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name)
if xmlelements:
xmlelements = _get_child_nodes(xmlelements[0], xml_element_name)
return [_get_node_value(xmlelement, element_type) for xmlelement in xmlelements]
def _fill_dict(xmldoc, element_name):
xmlelements = _get_child_nodes(xmldoc, element_name)
@ -297,6 +345,43 @@ def _fill_dict(xmldoc, element_name):
return_obj[child.nodeName] = child.firstChild.nodeValue
return return_obj
def _fill_dict_of(xmldoc, parent_xml_element_name, pair_xml_element_name, key_xml_element_name, value_xml_element_name):
'''Converts an xml fragment into a dictionary. The parent xml element contains a
list of xml elements where each element has a child element for the key, and another for the value.
Example:
xmldoc=
<ExtendedProperties>
<ExtendedProperty>
<Name>Ext1</Name>
<Value>Val1</Value>
</ExtendedProperty>
<ExtendedProperty>
<Name>Ext2</Name>
<Value>Val2</Value>
</ExtendedProperty>
</ExtendedProperties>
element_type=str
parent_xml_element_name='ExtendedProperties'
pair_xml_element_name='ExtendedProperty'
key_xml_element_name='Name'
value_xml_element_name='Value'
'''
return_obj = { }
xmlelements = _get_child_nodes(xmldoc, parent_xml_element_name)
if xmlelements:
xmlelements = _get_child_nodes(xmlelements[0], pair_xml_element_name)
for pair in xmlelements:
keys = _get_child_nodes(pair, key_xml_element_name)
values = _get_child_nodes(pair, value_xml_element_name)
if keys and values:
key = str(keys[0].firstChild.nodeValue)
value = str(values[0].firstChild.nodeValue)
return_obj[key] = value
return return_obj
def _fill_instance_child(xmldoc, element_name, return_type):
'''Converts a child of the current dom element to the specified type. The child name
'''
@ -312,7 +397,7 @@ def _fill_instance_child(xmldoc, element_name, return_type):
def _fill_instance_element(element, return_type):
"""Converts a DOM element into the specified object"""
return _parse_response_body(element.toxml('utf-8'), return_type)
return _parse_response_body_from_xml_node(element, return_type)
def _fill_data_minidom(xmldoc, element_name, data_member):
@ -332,6 +417,15 @@ def _fill_data_minidom(xmldoc, element_name, data_member):
else:
return type(data_member)(value)
def _get_node_value(xmlelement, data_type):
value = xmlelement.firstChild.nodeValue
if data_type is datetime:
return _to_datetime(value)
elif data_type is types.BooleanType:
return value.lower() != 'false'
else:
return data_type(value)
def _get_request_body(request_body):
'''Converts an object into a request body. If it's None
we'll return an empty string, if it's one of our objects it'll
@ -401,22 +495,42 @@ def _parse_response(response, return_type):
'''
parse the HTTPResponse's body and fill all the data into a class of return_type
'''
return _parse_response_body(response.body, return_type)
return _parse_response_body_from_xml_text(response.body, return_type)
def _fill_data_to_return_object(node, return_obj):
for name, value in vars(return_obj).iteritems():
members = dict(vars(return_obj))
for name, value in members.iteritems():
if isinstance(value, _list_of):
setattr(return_obj, name, _fill_list_of(node, value.list_type))
setattr(return_obj, name, _fill_list_of(node, value.list_type, value.xml_element_name))
elif isinstance(value, _scalar_list_of):
setattr(return_obj, name, _fill_scalar_list_of(node, value.list_type, _get_serialization_name(name), value.xml_element_name))
elif isinstance(value, _dict_of):
setattr(return_obj, name, _fill_dict_of(node, _get_serialization_name(name), value.pair_xml_element_name, value.key_xml_element_name, value.value_xml_element_name))
elif isinstance(value, WindowsAzureData):
setattr(return_obj, name, _fill_instance_child(node, name, value.__class__))
elif isinstance(value, dict):
setattr(return_obj, name, _fill_dict(node, _get_serialization_name(name)))
elif isinstance(value, _Base64String):
value = _fill_data_minidom(node, name, '')
if value is not None:
value = base64.b64decode(value)
#always set the attribute, so we don't end up returning an object with type _Base64String
setattr(return_obj, name, value)
else:
value = _fill_data_minidom(node, name, value)
if value is not None:
setattr(return_obj, name, value)
def _parse_response_body(respbody, return_type):
def _parse_response_body_from_xml_node(node, return_type):
'''
parse the xml and fill all the data into a class of return_type
'''
return_obj = return_type()
_fill_data_to_return_object(node, return_obj)
return return_obj
def _parse_response_body_from_xml_text(respbody, return_type):
'''
parse the xml and fill all the data into a class of return_type
'''
@ -427,11 +541,31 @@ def _parse_response_body(respbody, return_type):
return return_obj
class _dict_of(dict):
"""a dict which carries with it the xml element names for key,val.
Used for deserializaion and construction of the lists"""
def __init__(self, pair_xml_element_name, key_xml_element_name, value_xml_element_name):
self.pair_xml_element_name = pair_xml_element_name
self.key_xml_element_name = key_xml_element_name
self.value_xml_element_name = value_xml_element_name
class _list_of(list):
"""a list which carries with it the type that's expected to go in it.
Used for deserializaion and construction of the lists"""
def __init__(self, list_type):
def __init__(self, list_type, xml_element_name=None):
self.list_type = list_type
if xml_element_name is None:
self.xml_element_name = list_type.__name__
else:
self.xml_element_name = xml_element_name
class _scalar_list_of(list):
"""a list of scalar types which carries with it the type that's
expected to go in it along with its xml element name.
Used for deserializaion and construction of the lists"""
def __init__(self, list_type, xml_element_name):
self.list_type = list_type
self.xml_element_name = xml_element_name
def _update_request_uri_query_local_storage(request, use_local_storage):
''' create correct uri and query for the request '''
@ -447,16 +581,12 @@ def _update_request_uri_query(request):
appear after the existing parameters'''
if '?' in request.path:
pos = request.path.find('?')
query_string = request.path[pos+1:]
request.path = request.path[:pos]
request.path, _, query_string = request.path.partition('?')
if query_string:
query_params = query_string.split('&')
for query in query_params:
if '=' in query:
pos = query.find('=')
name = query[:pos]
value = query[pos+1:]
name, _, value = query.partition('=')
request.query.append((name, value))
request.path = urllib2.quote(request.path, '/()$=\',')
@ -530,23 +660,3 @@ def _parse_response_for_dict_filter(response, filter):
return return_dict
else:
return None
def _get_table_host(account_name, use_local_storage=False):
''' Gets service host base on the service type and whether it is using local storage. '''
if use_local_storage:
return DEV_TABLE_HOST
else:
return account_name + TABLE_SERVICE_HOST_BASE
def _get_queue_host(account_name, use_local_storage=False):
if use_local_storage:
return DEV_QUEUE_HOST
else:
return account_name + QUEUE_SERVICE_HOST_BASE
def _get_blob_host(account_name, use_local_storage=False):
if use_local_storage:
return DEV_BLOB_HOST
else:
return account_name + BLOB_SERVICE_HOST_BASE

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -26,6 +26,7 @@ import sys
from xml.dom import minidom
from azure.http import HTTPError, HTTPResponse
from azure import _USER_AGENT_STRING
class _HTTPClient:
'''
@ -53,6 +54,13 @@ class _HTTPClient:
self.issuer = issuer
self.x_ms_version = x_ms_version
self.protocol = protocol
self.proxy_host = None
self.proxy_port = None
def set_proxy(self, host, port):
'''Sets the proxy server host and port for the HTTP CONNECT Tunnelling.'''
self.proxy_host = host
self.proxy_port = port
def get_connection(self, request):
''' Create connection for the request. '''
@ -67,12 +75,17 @@ class _HTTPClient:
_connection = httplib.HTTPConnection(request.host)
else:
_connection = httplib.HTTPSConnection(request.host, cert_file=self.cert_file)
if self.proxy_host:
_connection.set_tunnel(self.proxy_host, self.proxy_port)
return _connection
def send_request_headers(self, connection, request_headers):
for name, value in request_headers:
if value:
connection.putheader(name, value)
connection.putheader('User-Agent', _USER_AGENT_STRING)
connection.endheaders()
def send_request_body(self, connection, request_body):

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -33,6 +33,8 @@ VT_I8 = 20
VT_UI8 = 21
VT_ARRAY = 8192
HTTPREQUEST_PROXYSETTING_PROXY = 2
HTTPREQUEST_PROXY_SETTING = c_long
HTTPREQUEST_SETCREDENTIALS_FLAGS = c_long
#------------------------------------------------------------------------------
@ -52,12 +54,13 @@ _SysAllocString.argtypes = [c_wchar_p]
_SysFreeString = _oleaut32.SysFreeString
_SysFreeString.argtypes = [c_void_p]
_SafeArrayDestroy = _oleaut32.SafeArrayDestroy
_SafeArrayDestroy.argtypes = [c_void_p]
_CoTaskMemAlloc = _ole32.CoTaskMemAlloc
_CoTaskMemAlloc.restype = c_void_p
_CoTaskMemAlloc.argtypes = [c_size_t]
_CoTaskMemFree = _ole32.CoTaskMemFree
_CoTaskMemFree.argtypes = [c_void_p]
#------------------------------------------------------------------------------
class BSTR(c_wchar_p):
@ -87,8 +90,7 @@ class _tagSAFEARRAY(Structure):
('rgsabound', _tagSAFEARRAYBOUND*1)]
def __del__(self):
_SafeArrayDestroy(self.pvdata)
pass
_CoTaskMemFree(self.pvdata)
class VARIANT(Structure):
'''
@ -250,6 +252,24 @@ class _WinHttpRequest(c_void_p):
_certificate = BSTR(certificate)
_WinHttpRequest._SetClientCertificate(self, _certificate)
def set_tunnel(self, host, port):
''' Sets up the host and the port for the HTTP CONNECT Tunnelling.'''
url = host
if port:
url = url + u':' + port
var_host = VARIANT()
var_host.vt = VT_BSTR
var_host.vdata.bstrval = BSTR(url)
var_empty = VARIANT()
var_empty.vt = VT_EMPTY
var_empty.vdata.llval = 0
_WinHttpRequest._SetProxy(self, HTTPREQUEST_PROXYSETTING_PROXY, var_host, var_empty)
_SysFreeString(var_host.vdata.bstrval)
def __del__(self):
if self.value is not None:
_WinHttpRequest._Release(self)
@ -288,6 +308,10 @@ class _HTTPConnection:
_CoInitialize(None)
_CoCreateInstance(byref(clsid), 0, 1, byref(iid), byref(self._httprequest))
def set_tunnel(self, host, port=None):
''' Sets up the host and the port for the HTTP CONNECT Tunnelling. '''
self._httprequest.set_tunnel(unicode(host), unicode(str(port)))
def putrequest(self, method, uri):
''' Connects to host and sends the request. '''
@ -338,7 +362,3 @@ class _HTTPConnection:
length = len(body)
return _Response(status, status_text, length, headers, body)

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -26,7 +26,8 @@ from azure import (WindowsAzureError, WindowsAzureData,
_create_entry, _get_entry_properties, xml_escape,
_get_child_nodes, WindowsAzureMissingResourceError,
WindowsAzureConflictError, _get_serialization_name,
_get_children_from_path, _get_first_child_node_value)
_get_children_from_path, _get_first_child_node_value,
_USER_AGENT_STRING)
import azure
#default rule name for subscription
@ -267,6 +268,7 @@ def _get_token(request, account_key, issuer):
connection = httplib.HTTPSConnection(host)
connection.putrequest('POST', '/WRAPv0.9')
connection.putheader('Content-Length', len(request_body))
connection.putheader('User-Agent', _USER_AGENT_STRING)
connection.endheaders()
connection.send(request_body)
resp = connection.getresponse()

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -36,7 +36,6 @@ from azure import (_validate_not_none, Feed,
_parse_response_for_dict, _parse_response_for_dict_prefix,
_parse_response_for_dict_filter,
_parse_enum_results_list, _update_request_uri_query_local_storage,
_get_table_host, _get_queue_host, _get_blob_host,
_parse_simple_list, SERVICE_BUS_HOST_BASE, xml_escape)
class ServiceBusService:
@ -52,7 +51,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + ''
request.body = _get_request_body(convert_queue_to_xml(queue))
request.path, request.query = _update_request_uri_query(request)
@ -78,7 +77,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -102,7 +101,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -116,7 +115,7 @@ class ServiceBusService:
'''
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/$Resources/Queues'
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -135,7 +134,7 @@ class ServiceBusService:
_validate_not_none('topic_name', topic_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + ''
request.body = _get_request_body(convert_topic_to_xml(topic))
request.path, request.query = _update_request_uri_query(request)
@ -162,7 +161,7 @@ class ServiceBusService:
_validate_not_none('topic_name', topic_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -186,7 +185,7 @@ class ServiceBusService:
_validate_not_none('topic_name', topic_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -200,7 +199,7 @@ class ServiceBusService:
'''
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/$Resources/Topics'
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -222,7 +221,7 @@ class ServiceBusService:
_validate_not_none('rule_name', rule_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/rules/' + str(rule_name) + ''
request.body = _get_request_body(convert_rule_to_xml(rule))
request.path, request.query = _update_request_uri_query(request)
@ -253,7 +252,7 @@ class ServiceBusService:
_validate_not_none('rule_name', rule_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/rules/' + str(rule_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -281,7 +280,7 @@ class ServiceBusService:
_validate_not_none('rule_name', rule_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/rules/' + str(rule_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -300,7 +299,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/rules/'
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -321,7 +320,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + ''
request.body = _get_request_body(convert_subscription_to_xml(subscription))
request.path, request.query = _update_request_uri_query(request)
@ -349,7 +348,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -375,7 +374,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -392,7 +391,7 @@ class ServiceBusService:
_validate_not_none('topic_name', topic_name)
request = HTTPRequest()
request.method = 'GET'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/'
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -413,7 +412,7 @@ class ServiceBusService:
_validate_not_none('topic_name', topic_name)
request = HTTPRequest()
request.method = 'POST'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/messages'
request.headers = message.add_headers(request)
request.body = _get_request_body(message.body)
@ -441,7 +440,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'POST'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/messages/head'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query(request)
@ -470,7 +469,7 @@ class ServiceBusService:
_validate_not_none('lock_token', lock_token)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/messages/' + str(sequence_number) + '/' + str(lock_token) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -490,7 +489,7 @@ class ServiceBusService:
_validate_not_none('subscription_name', subscription_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/messages/head'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query(request)
@ -518,7 +517,7 @@ class ServiceBusService:
_validate_not_none('lock_token', lock_token)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(topic_name) + '/subscriptions/' + str(subscription_name) + '/messages/' + str(sequence_number) + '/' + str(lock_token) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -537,7 +536,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'POST'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages'
request.headers = message.add_headers(request)
request.body = _get_request_body(message.body)
@ -562,7 +561,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'POST'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/head'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query(request)
@ -589,7 +588,7 @@ class ServiceBusService:
_validate_not_none('lock_token', lock_token)
request = HTTPRequest()
request.method = 'PUT'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/' + str(sequence_number) + '/' + str(lock_token) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -607,7 +606,7 @@ class ServiceBusService:
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/head'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query(request)
@ -633,7 +632,7 @@ class ServiceBusService:
_validate_not_none('lock_token', lock_token)
request = HTTPRequest()
request.method = 'DELETE'
request.host = self.service_namespace + SERVICE_BUS_HOST_BASE
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/' + str(sequence_number) + '/' + str(lock_token) + ''
request.path, request.query = _update_request_uri_query(request)
request.headers = _update_service_bus_header(request, self.account_key, self.issuer)
@ -652,11 +651,12 @@ class ServiceBusService:
else:
return self.read_delete_subscription_message(topic_name, subscription_name, timeout)
def __init__(self, service_namespace=None, account_key=None, issuer=None, x_ms_version='2011-06-01'):
def __init__(self, service_namespace=None, account_key=None, issuer=None, x_ms_version='2011-06-01', host_base=SERVICE_BUS_HOST_BASE):
self.requestid = None
self.service_namespace = service_namespace
self.account_key = account_key
self.issuer = issuer
self.issuer = issuer
self.host_base = host_base
#get service namespace, account key and issuer. If they are set when constructing, then use them.
#else find them from environment variables.
@ -693,6 +693,13 @@ class ServiceBusService:
res._filter = new_filter
return res
def set_proxy(self, host, port):
'''Sets the proxy server host and port for the HTTP CONNECT Tunnelling.'''
self._httpclient.set_proxy(host, port)
def _get_host(self):
return self.service_namespace + self.host_base
def _perform_request(self, request):
try:
resp = self._filter(request)

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -29,7 +29,6 @@ from azure import (_validate_not_none, Feed,
_parse_response_for_dict, _parse_response_for_dict_prefix,
_parse_response_for_dict_filter,
_parse_enum_results_list, _update_request_uri_query_local_storage,
_get_table_host, _get_queue_host, _get_blob_host,
_parse_simple_list, SERVICE_BUS_HOST_BASE, xml_escape)
class BlobService(_StorageClient):
@ -39,6 +38,9 @@ class BlobService(_StorageClient):
account_key: your storage account key, required for all operations.
'''
def __init__(self, account_name = None, account_key = None, protocol = 'http', host_base = BLOB_SERVICE_HOST_BASE, dev_host = DEV_BLOB_HOST):
return super(BlobService, self).__init__(account_name, account_key, protocol, host_base, dev_host)
def list_containers(self, prefix=None, marker=None, maxresults=None, include=None):
'''
The List Containers operation returns a list of the containers under the specified account.
@ -54,7 +56,7 @@ class BlobService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?comp=list'
request.query = [
('prefix', _str_or_none(prefix)),
@ -81,7 +83,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container'
request.headers = [
('x-ms-meta-name-values', x_ms_meta_name_values),
@ -107,7 +109,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_blob_header(request, self.account_name, self.account_key)
@ -123,7 +125,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container&comp=metadata'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_blob_header(request, self.account_name, self.account_key)
@ -140,7 +142,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container&comp=metadata'
request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -154,7 +156,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container&comp=acl'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_blob_header(request, self.account_name, self.account_key)
@ -172,7 +174,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container&comp=acl'
request.headers = [('x-ms-blob-public-access', _str_or_none(x_ms_blob_public_access))]
request.body = _get_request_body(_convert_class_to_xml(signed_identifiers))
@ -189,7 +191,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_blob_header(request, self.account_name, self.account_key)
@ -211,7 +213,7 @@ class BlobService(_StorageClient):
_validate_not_none('container_name', container_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '?restype=container&comp=list'
request.query = [
('prefix', _str_or_none(prefix)),
@ -238,7 +240,7 @@ class BlobService(_StorageClient):
_validate_not_none('storage_service_properties', storage_service_properties)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.query = [('timeout', _int_or_none(timeout))]
request.body = _get_request_body(_convert_class_to_xml(storage_service_properties))
@ -256,7 +258,7 @@ class BlobService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -275,7 +277,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'HEAD'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + ''
request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -299,7 +301,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=properties'
request.headers = [
('x-ms-blob-cache-control', _str_or_none(x_ms_blob_cache_control)),
@ -330,7 +332,7 @@ class BlobService(_StorageClient):
_validate_not_none('x_ms_blob_type', x_ms_blob_type)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + ''
request.headers = [
('x-ms-blob-type', _str_or_none(x_ms_blob_type)),
@ -365,7 +367,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + ''
request.headers = [
('x-ms-range', _str_or_none(x_ms_range)),
@ -390,7 +392,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=metadata'
request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))]
request.query = [('snapshot', _str_or_none(snapshot))]
@ -412,7 +414,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=metadata'
request.headers = [
('x-ms-meta-name-values', x_ms_meta_name_values),
@ -436,7 +438,7 @@ class BlobService(_StorageClient):
_validate_not_none('x_ms_lease_action', x_ms_lease_action)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=lease'
request.headers = [
('x-ms-lease-id', _str_or_none(x_ms_lease_id)),
@ -468,7 +470,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=snapshot'
request.headers = [
('x-ms-meta-name-values', x_ms_meta_name_values),
@ -515,7 +517,7 @@ class BlobService(_StorageClient):
_validate_not_none('x_ms_copy_source', x_ms_copy_source)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + ''
request.headers = [
('x-ms-copy-source', _str_or_none(x_ms_copy_source)),
@ -554,7 +556,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + ''
request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))]
request.query = [('snapshot', _str_or_none(snapshot))]
@ -580,7 +582,7 @@ class BlobService(_StorageClient):
_validate_not_none('blockid', blockid)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=block'
request.headers = [
('Content-MD5', _str_or_none(content_md5)),
@ -624,7 +626,7 @@ class BlobService(_StorageClient):
_validate_not_none('block_list', block_list)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=blocklist'
request.headers = [
('Content-MD5', _str_or_none(content_md5)),
@ -656,7 +658,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=blocklist'
request.headers = [('x-ms-lease-id', _str_or_none(x_ms_lease_id))]
request.query = [
@ -697,7 +699,7 @@ class BlobService(_StorageClient):
_validate_not_none('x_ms_page_write', x_ms_page_write)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=page'
request.headers = [
('x-ms-range', _str_or_none(x_ms_range)),
@ -736,7 +738,7 @@ class BlobService(_StorageClient):
_validate_not_none('blob_name', blob_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_blob_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(container_name) + '/' + str(blob_name) + '?comp=pagelist'
request.headers = [
('Range', _str_or_none(range)),

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -28,7 +28,6 @@ from azure import (_validate_not_none, Feed,
_parse_response_for_dict, _parse_response_for_dict_prefix,
_parse_response_for_dict_filter,
_parse_enum_results_list, _update_request_uri_query_local_storage,
_get_table_host, _get_queue_host, _get_blob_host,
_parse_simple_list, SERVICE_BUS_HOST_BASE, xml_escape)
class QueueService(_StorageClient):
@ -38,6 +37,9 @@ class QueueService(_StorageClient):
account_key: your storage account key, required for all operations.
'''
def __init__(self, account_name = None, account_key = None, protocol = 'http', host_base = QUEUE_SERVICE_HOST_BASE, dev_host = DEV_QUEUE_HOST):
return super(QueueService, self).__init__(account_name, account_key, protocol, host_base, dev_host)
def get_queue_service_properties(self, timeout=None):
'''
Gets the properties of a storage account's Queue Service, including Windows Azure
@ -48,7 +50,7 @@ class QueueService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.query = [('timeout', _int_or_none(timeout))]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -63,7 +65,7 @@ class QueueService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?comp=list'
request.query = [
('prefix', _str_or_none(prefix)),
@ -89,7 +91,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + ''
request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -119,7 +121,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + ''
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_queue_header(request, self.account_name, self.account_key)
@ -144,7 +146,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '?comp=metadata'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_queue_header(request, self.account_name, self.account_key)
@ -164,7 +166,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '?comp=metadata'
request.headers = [('x-ms-meta-name-values', x_ms_meta_name_values)]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -190,7 +192,7 @@ class QueueService(_StorageClient):
_validate_not_none('message_text', message_text)
request = HTTPRequest()
request.method = 'POST'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages'
request.query = [
('visibilitytimeout', _str_or_none(visibilitytimeout)),
@ -222,7 +224,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages'
request.query = [
('numofmessages', _str_or_none(numofmessages)),
@ -247,7 +249,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages?peekonly=true'
request.query = [('numofmessages', _str_or_none(numofmessages))]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -269,7 +271,7 @@ class QueueService(_StorageClient):
_validate_not_none('popreceipt', popreceipt)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/' + str(message_id) + ''
request.query = [('popreceipt', _str_or_none(popreceipt))]
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -285,7 +287,7 @@ class QueueService(_StorageClient):
_validate_not_none('queue_name', queue_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_queue_header(request, self.account_name, self.account_key)
@ -312,7 +314,7 @@ class QueueService(_StorageClient):
_validate_not_none('visibilitytimeout', visibilitytimeout)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(queue_name) + '/messages/' + str(message_id) + ''
request.query = [
('popreceipt', _str_or_none(popreceipt)),
@ -339,12 +341,10 @@ class QueueService(_StorageClient):
_validate_not_none('storage_service_properties', storage_service_properties)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_queue_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.query = [('timeout', _int_or_none(timeout))]
request.body = _get_request_body(_convert_class_to_xml(storage_service_properties))
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_queue_header(request, self.account_name, self.account_key)
response = self._perform_request(request)

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -38,7 +38,7 @@ class _StorageClient(object):
This is the base class for BlobManager, TableManager and QueueManager.
'''
def __init__(self, account_name=None, account_key=None, protocol='http'):
def __init__(self, account_name=None, account_key=None, protocol='http', host_base='', dev_host=''):
if account_name is not None:
self.account_name = account_name.encode('ascii', 'ignore')
else:
@ -50,6 +50,8 @@ class _StorageClient(object):
self.requestid = None
self.protocol = protocol
self.host_base = host_base
self.dev_host = dev_host
#the app is not run in azure emulator or use default development
#storage account and key if app is run in emulator.
@ -102,6 +104,16 @@ class _StorageClient(object):
res._filter = new_filter
return res
def set_proxy(self, host, port):
'''Sets the proxy server host and port for the HTTP CONNECT Tunnelling.'''
self._httpclient.set_proxy(host, port)
def _get_host(self):
if self.use_local_storage:
return self.dev_host
else:
return self.account_name + self.host_base
def _perform_request_worker(self, request):
return self._httpclient.perform_request(request)

Просмотреть файл

@ -1,5 +1,5 @@
#-------------------------------------------------------------------------
# Copyright 2011 Microsoft Corporation
# Copyright 2011-2012 Microsoft Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@ -32,7 +32,6 @@ from azure import (_validate_not_none, Feed,
_parse_response_for_dict, _parse_response_for_dict_prefix,
_parse_response_for_dict_filter,
_parse_enum_results_list, _update_request_uri_query_local_storage,
_get_table_host, _get_queue_host, _get_blob_host,
_parse_simple_list, SERVICE_BUS_HOST_BASE, xml_escape)
class TableService(_StorageClient):
@ -42,6 +41,9 @@ class TableService(_StorageClient):
account_key: your storage account key, required for all operations.
'''
def __init__(self, account_name = None, account_key = None, protocol = 'http', host_base = TABLE_SERVICE_HOST_BASE, dev_host = DEV_TABLE_HOST):
return super(TableService, self).__init__(account_name, account_key, protocol, host_base, dev_host)
def begin_batch(self):
if self._batchclient is None:
self._batchclient = _BatchClient(service_instance=self, account_key=self.account_key, account_name=self.account_name)
@ -64,7 +66,7 @@ class TableService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_table_header(request)
@ -81,7 +83,7 @@ class TableService(_StorageClient):
_validate_not_none('storage_service_properties', storage_service_properties)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/?restype=service&comp=properties'
request.body = _get_request_body(_convert_class_to_xml(storage_service_properties))
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -99,7 +101,7 @@ class TableService(_StorageClient):
'''
request = HTTPRequest()
request.method = 'GET'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
if table_name is not None:
uri_part_table_name = "('" + table_name + "')"
else:
@ -127,7 +129,7 @@ class TableService(_StorageClient):
_validate_not_none('table', table)
request = HTTPRequest()
request.method = 'POST'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/Tables'
request.body = _get_request_body(convert_table_to_xml(table))
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
@ -152,7 +154,7 @@ class TableService(_StorageClient):
_validate_not_none('table_name', table_name)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/Tables(\'' + str(table_name) + '\')'
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_table_header(request)
@ -181,7 +183,7 @@ class TableService(_StorageClient):
_validate_not_none('select', select)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')?$select=' + str(select) + ''
request.path, request.query = _update_request_uri_query_local_storage(request, self.use_local_storage)
request.headers = _update_storage_table_header(request)
@ -201,7 +203,7 @@ class TableService(_StorageClient):
_validate_not_none('table_name', table_name)
request = HTTPRequest()
request.method = 'GET'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '()'
request.query = [
('$filter', _str_or_none(filter)),
@ -228,7 +230,7 @@ class TableService(_StorageClient):
_validate_not_none('content_type', content_type)
request = HTTPRequest()
request.method = 'POST'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + ''
request.headers = [('Content-Type', _str_or_none(content_type))]
request.body = _get_request_body(convert_entity_to_xml(entity))
@ -255,7 +257,7 @@ class TableService(_StorageClient):
_validate_not_none('content_type', content_type)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')'
request.headers = [
('Content-Type', _str_or_none(content_type)),
@ -285,7 +287,7 @@ class TableService(_StorageClient):
_validate_not_none('content_type', content_type)
request = HTTPRequest()
request.method = 'MERGE'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')'
request.headers = [
('Content-Type', _str_or_none(content_type)),
@ -315,7 +317,7 @@ class TableService(_StorageClient):
_validate_not_none('if_match', if_match)
request = HTTPRequest()
request.method = 'DELETE'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')'
request.headers = [
('Content-Type', _str_or_none(content_type)),
@ -343,7 +345,7 @@ class TableService(_StorageClient):
_validate_not_none('content_type', content_type)
request = HTTPRequest()
request.method = 'PUT'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')'
request.headers = [('Content-Type', _str_or_none(content_type))]
request.body = _get_request_body(convert_entity_to_xml(entity))
@ -371,7 +373,7 @@ class TableService(_StorageClient):
_validate_not_none('content_type', content_type)
request = HTTPRequest()
request.method = 'MERGE'
request.host = _get_table_host(self.account_name, self.use_local_storage)
request.host = self._get_host()
request.path = '/' + str(table_name) + '(PartitionKey=\'' + str(partition_key) + '\',RowKey=\'' + str(row_key) + '\')'
request.headers = [('Content-Type', _str_or_none(content_type))]
request.body = _get_request_body(convert_entity_to_xml(entity))
@ -388,5 +390,3 @@ class TableService(_StorageClient):
self.account_key)
request.headers.append(('Authorization', auth))
return self._httpclient.perform_request(request)

Просмотреть файл

@ -16,11 +16,12 @@
from distutils.core import setup
setup(name='azure',
version='0.2.3',
version='0.6',
description='Windows Azure client APIs',
url='https://github.com/WindowsAzure/azure-sdk-for-python',
packages=['azure',
'azure.http',
'azure.servicebus',
'azure.storage']
'azure.storage',
'azure.servicemanagement']
)

Просмотреть файл

@ -6,7 +6,7 @@
<ProjectGuid>{c0742a2d-4862-40e4-8a28-036eecdbc614}</ProjectGuid>
<ProjectHome>
</ProjectHome>
<StartupFile>azuretest\test_servicebusservice.py</StartupFile>
<StartupFile>azuretest\doctest_blobservice.py</StartupFile>
<WorkingDirectory>.</WorkingDirectory>
<OutputPath>.</OutputPath>
<Name>azuretest</Name>
@ -21,7 +21,7 @@
<IsWindowsApplication>False</IsWindowsApplication>
<InterpreterId>9a7a9026-48c1-4688-9d5d-e5699d47d074</InterpreterId>
<InterpreterVersion>2.7</InterpreterVersion>
<SearchPath>C:\Users\a-huvalo\Documents\Visual Studio 2010\Projects\PTVS\Open_Source\Incubation\windowsazure\src\</SearchPath>
<SearchPath>..\src\;..\test\</SearchPath>
<SccProjectName>$/TCWCS/Python/Main/Open_Source/Incubation/windowsazure/test</SccProjectName>
<SccProvider>{4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}</SccProvider>
<SccAuxPath>http://tcvstf:8080/tfs/tc</SccAuxPath>
@ -37,6 +37,7 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="azuretest" />
<Folder Include="azuretest\data\" />
</ItemGroup>
<ItemGroup>
<Compile Include="azuretest\clean.py" />
@ -47,6 +48,7 @@
<Compile Include="azuretest\doctest_tableservice.py" />
<Compile Include="azuretest\test_blobservice.py" />
<Compile Include="azuretest\test_cloudstorageaccount.py" />
<Compile Include="azuretest\test_servicemanagementservice.py" />
<Compile Include="azuretest\test_queueservice.py" />
<Compile Include="azuretest\test_sharedaccesssignature.py" />
<Compile Include="azuretest\test_tableservice.py" />
@ -55,6 +57,8 @@
<Compile Include="azuretest\__init__.py" />
</ItemGroup>
<ItemGroup>
<Content Include="azuretest\data\test.vhd" />
<Content Include="azuretest\data\WindowsAzure1.cspkg" />
<Content Include="run.bash" />
<Content Include="run.bat" />
</ItemGroup>

Двоичные данные
test/azuretest/data/WindowsAzure1.cspkg Normal file

Двоичный файл не отображается.

Двоичные данные
test/azuretest/data/test.vhd Normal file

Двоичный файл не отображается.

Просмотреть файл

@ -24,25 +24,25 @@ True
How to Add an Entity to a Table
-------------------------------
>>> task = {'PartitionKey': 'tasksSeattle', 'RowKey': '1', 'description' : 'Take out the trash', 'priority' : 200}
>>> table_service.insert_entity('tasktable', task)
>>> entity = table_service.insert_entity('tasktable', task)
>>> task = Entity()
>>> task.PartitionKey = 'tasksSeattle'
>>> task.RowKey = '2'
>>> task.description = 'Wash the car'
>>> task.priority = 100
>>> table_service.insert_entity('tasktable', task)
>>> entity = table_service.insert_entity('tasktable', task)
How to Update an Entity
-----------------------
>>> task = {'description' : 'Take out the garbage', 'priority' : 250}
>>> table_service.update_entity('tasktable', 'tasksSeattle', '1', task)
>>> entity = table_service.update_entity('tasktable', 'tasksSeattle', '1', task)
>>> task = {'description' : 'Take out the garbage again', 'priority' : 250}
>>> table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '1', task)
>>> entity = table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '1', task)
>>> task = {'description' : 'Buy detergent', 'priority' : 300}
>>> table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '3', task)
>>> entity = table_service.insert_or_replace_entity('tasktable', 'tasksSeattle', '3', task)
How to Change a Group of Entities

Просмотреть файл

@ -29,6 +29,11 @@ class BlobServiceTest(AzureTestCase):
self.bc = BlobService(account_name=credentials.getStorageServicesName(),
account_key=credentials.getStorageServicesKey())
proxy_host = credentials.getProxyHost()
proxy_port = credentials.getProxyPort()
if proxy_host:
self.bc.set_proxy(proxy_host, proxy_port)
__uid = getUniqueTestRunID()
container_base_name = u'mytestcontainer%s' % (__uid)

Просмотреть файл

@ -29,6 +29,11 @@ class QueueServiceTest(AzureTestCase):
self.queue_client = QueueService(account_name=credentials.getStorageServicesName(),
account_key=credentials.getStorageServicesKey())
proxy_host = credentials.getProxyHost()
proxy_port = credentials.getProxyPort()
if proxy_host:
self.queue_client.set_proxy(proxy_host, proxy_port)
__uid = getUniqueTestRunID()
queue_base_name = u'%s' % (__uid)

Просмотреть файл

@ -26,6 +26,11 @@ class ServiceBusTest(AzureTestCase):
credentials.getServiceBusKey(),
'owner')
proxy_host = credentials.getProxyHost()
proxy_port = credentials.getProxyPort()
if proxy_host:
self.sbs.set_proxy(proxy_host, proxy_port)
__uid = getUniqueTestRunID()
queue_base_name = u'mytestqueue%s' % (__uid)

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -40,6 +40,11 @@ class StorageTest(AzureTestCase):
self.tc = TableService(account_name=credentials.getStorageServicesName(),
account_key=credentials.getStorageServicesKey())
proxy_host = credentials.getProxyHost()
proxy_port = credentials.getProxyPort()
if proxy_host:
self.tc.set_proxy(proxy_host, proxy_port)
__uid = getUniqueTestRunID()
table_base_name = u'testtable%s' % (__uid)
self.table_name = getUniqueNameBasedOnCurrentTime(table_base_name)

Просмотреть файл

@ -49,6 +49,12 @@ class Credentials(object):
with open(tmpName, "r") as f:
self.ns = json.load(f)
def getManagementCertFile(self):
return self.ns[u'managementcertfile']
def getSubscriptionId(self):
return self.ns[u'subscriptionid']
def getServiceBusKey(self):
return self.ns[u'servicebuskey']
@ -61,6 +67,15 @@ class Credentials(object):
def getStorageServicesName(self):
return self.ns[u'storageservicesname']
def getLinuxOSVHD(self):
return self.ns[u'linuxosvhd']
def getProxyHost(self):
return self.ns[u'proxyhost']
def getProxyPort(self):
return self.ns[u'proxyport']
credentials = Credentials()
def getUniqueTestRunID():