Added service management API
This commit is contained in:
Родитель
3e4404dea4
Коммит
4ddcdd054c
|
@ -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
|
||||
|
|
83
README.md
83
README.md
|
@ -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>
|
||||
|
|
Двоичный файл не отображается.
Двоичный файл не отображается.
|
@ -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():
|
||||
|
|
Загрузка…
Ссылка в новой задаче