def _convert_etree_element_to_queue(entry_element): ''' Converts entry element to queue object. The format of xml response for queue: <QueueDescription xmlns=\"http://schemas.microsoft.com/netservices/2010/10/servicebus/connect\"> <MaxSizeInBytes>10000</MaxSizeInBytes> <DefaultMessageTimeToLive>PT5M</DefaultMessageTimeToLive> <LockDuration>PT2M</LockDuration> <RequiresGroupedReceives>False</RequiresGroupedReceives> <SupportsDuplicateDetection>False</SupportsDuplicateDetection> ... </QueueDescription> ''' queue = Queue() # get node for each attribute in Queue class, if nothing found then the # response is not valid xml for Queue. invalid_queue = True queue_element = entry_element.find('./atom:content/sb:QueueDescription', _etree_sb_feed_namespaces) if queue_element is not None: mappings = [ ('LockDuration', 'lock_duration', None), ('MaxSizeInMegabytes', 'max_size_in_megabytes', int), ('RequiresDuplicateDetection', 'requires_duplicate_detection', _parse_bool), ('RequiresSession', 'requires_session', _parse_bool), ('DefaultMessageTimeToLive', 'default_message_time_to_live', None), ('DeadLetteringOnMessageExpiration', 'dead_lettering_on_message_expiration', _parse_bool), ('DuplicateDetectionHistoryTimeWindow', 'duplicate_detection_history_time_window', None), ('EnableBatchedOperations', 'enable_batched_operations', _parse_bool), ('MaxDeliveryCount', 'max_delivery_count', int), ('MessageCount', 'message_count', int), ('SizeInBytes', 'size_in_bytes', int), ] for map in mappings: if _read_etree_element(queue_element, map[0], queue, map[1], map[2]): invalid_queue = False if invalid_queue: raise WindowsAzureError(_ERROR_QUEUE_NOT_FOUND) # extract id, updated and name value from feed entry and set them of queue. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True).items(): setattr(queue, name, value) return queue
def _convert_etree_element_to_rule(entry_element): ''' Converts entry element to rule object. The format of xml for rule: <entry xmlns='http://www.w3.org/2005/Atom'> <content type='application/xml'> <RuleDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> <Filter i:type="SqlFilterExpression"> <SqlExpression>MyProperty='XYZ'</SqlExpression> </Filter> <Action i:type="SqlFilterAction"> <SqlExpression>set MyProperty2 = 'ABC'</SqlExpression> </Action> </RuleDescription> </content> </entry> ''' rule = Rule() rule_element = entry_element.find('./atom:content/sb:RuleDescription', _etree_sb_feed_namespaces) if rule_element is not None: filter_element = rule_element.find('./sb:Filter', _etree_sb_feed_namespaces) if filter_element is not None: rule.filter_type = filter_element.attrib.get( _make_etree_ns_attr_name(_etree_sb_feed_namespaces['i'], 'type'), None) sql_exp_element = filter_element.find('./sb:SqlExpression', _etree_sb_feed_namespaces) if sql_exp_element is not None: rule.filter_expression = sql_exp_element.text action_element = rule_element.find('./sb:Action', _etree_sb_feed_namespaces) if action_element is not None: rule.action_type = action_element.attrib.get( _make_etree_ns_attr_name(_etree_sb_feed_namespaces['i'], 'type'), None) sql_exp_element = action_element.find('./sb:SqlExpression', _etree_sb_feed_namespaces) if sql_exp_element is not None: rule.action_expression = sql_exp_element.text # extract id, updated and name value from feed entry and set them of rule. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True, '/rules').items(): setattr(rule, name, value) return rule
def _convert_etree_element_to_table(entry_element): ''' Converts the xml element to table class. ''' table = Table() name_element = entry_element.find('./atom:content/m:properties/d:TableName', _etree_entity_feed_namespaces) if name_element is not None: table.name = name_element.text for name_element, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, False).items(): setattr(table, name_element, value) return table
def _convert_etree_element_to_topic(entry_element): '''Converts entry element to topic The xml format for topic: <entry xmlns='http://www.w3.org/2005/Atom'> <content type='application/xml'> <TopicDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> <MaxSizeInMegabytes>1024</MaxSizeInMegabytes> <RequiresDuplicateDetection>false</RequiresDuplicateDetection> <DuplicateDetectionHistoryTimeWindow>P7D</DuplicateDetectionHistoryTimeWindow> <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> </TopicDescription> </content> </entry> ''' topic = Topic() invalid_topic = True topic_element = entry_element.find('./atom:content/sb:TopicDescription', _etree_sb_feed_namespaces) if topic_element is not None: mappings = [ ('DefaultMessageTimeToLive', 'default_message_time_to_live', None), ('MaxSizeInMegabytes', 'max_size_in_megabytes', int), ('RequiresDuplicateDetection', 'requires_duplicate_detection', _parse_bool), ('DuplicateDetectionHistoryTimeWindow', 'duplicate_detection_history_time_window', None), ('EnableBatchedOperations', 'enable_batched_operations', _parse_bool), ('SizeInBytes', 'size_in_bytes', int), ] for map in mappings: if _read_etree_element(topic_element, map[0], topic, map[1], map[2]): invalid_topic = False if invalid_topic: raise WindowsAzureError(_ERROR_TOPIC_NOT_FOUND) # extract id, updated and name value from feed entry and set them of topic. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True).items(): setattr(topic, name, value) return topic
def _convert_etree_element_to_subscription(entry_element): '''Converts entry element to subscription The xml format for subscription: <entry xmlns='http://www.w3.org/2005/Atom'> <content type='application/xml'> <SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> <LockDuration>PT5M</LockDuration> <RequiresSession>false</RequiresSession> <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> <DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration> <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> </SubscriptionDescription> </content> </entry> ''' subscription = Subscription() subscription_element = entry_element.find( './atom:content/sb:SubscriptionDescription', _etree_sb_feed_namespaces) if subscription_element is not None: mappings = [ ('LockDuration', 'lock_duration', None), ('RequiresSession', 'requires_session', _parse_bool), ('DefaultMessageTimeToLive', 'default_message_time_to_live', None), ('DeadLetteringOnFilterEvaluationExceptions', 'dead_lettering_on_filter_evaluation_exceptions', _parse_bool), ('DeadLetteringOnMessageExpiration', 'dead_lettering_on_message_expiration', _parse_bool), ('EnableBatchedOperations', 'enable_batched_operations', _parse_bool), ('MaxDeliveryCount', 'max_delivery_count', int), ('MessageCount', 'message_count', int), ] for map in mappings: _read_etree_element(subscription_element, map[0], subscription, map[1], map[2]) for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True, '/subscriptions').items(): setattr(subscription, name, value) return subscription
def _convert_etree_element_to_subscription(entry_element): '''Converts entry element to subscription The xml format for subscription: <entry xmlns='http://www.w3.org/2005/Atom'> <content type='application/xml'> <SubscriptionDescription xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"> <LockDuration>PT5M</LockDuration> <RequiresSession>false</RequiresSession> <DefaultMessageTimeToLive>P10675199DT2H48M5.4775807S</DefaultMessageTimeToLive> <DeadLetteringOnMessageExpiration>false</DeadLetteringOnMessageExpiration> <DeadLetteringOnFilterEvaluationExceptions>true</DeadLetteringOnFilterEvaluationExceptions> </SubscriptionDescription> </content> </entry> ''' subscription = Subscription() subscription_element = entry_element.find('./atom:content/sb:SubscriptionDescription', _etree_sb_feed_namespaces) if subscription_element is not None: mappings = [ ('LockDuration', 'lock_duration', None), ('RequiresSession', 'requires_session', _parse_bool), ('DefaultMessageTimeToLive', 'default_message_time_to_live', None), ('DeadLetteringOnFilterEvaluationExceptions', 'dead_lettering_on_filter_evaluation_exceptions', _parse_bool), ('DeadLetteringOnMessageExpiration', 'dead_lettering_on_message_expiration', _parse_bool), ('EnableBatchedOperations', 'enable_batched_operations', _parse_bool), ('MaxDeliveryCount', 'max_delivery_count', int), ('MessageCount', 'message_count', int), ] for map in mappings: _read_etree_element(subscription_element, map[0], subscription, map[1], map[2]) for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True, '/subscriptions').items(): setattr(subscription, name, value) return subscription
def _convert_etree_element_to_entity(entry_element): ''' Convert xml response to entity. The format of entity: <entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> <title /> <updated>2008-09-18T23:46:19.3857256Z</updated> <author> <name /> </author> <id /> <content type="application/xml"> <m:properties> <d:Address>Mountain View</d:Address> <d:Age m:type="Edm.Int32">23</d:Age> <d:AmountDue m:type="Edm.Double">200.23</d:AmountDue> <d:BinaryData m:type="Edm.Binary" m:null="true" /> <d:CustomerCode m:type="Edm.Guid">c9da6455-213d-42c9-9a79-3e9149a57833</d:CustomerCode> <d:CustomerSince m:type="Edm.DateTime">2008-07-10T00:00:00</d:CustomerSince> <d:IsActive m:type="Edm.Boolean">true</d:IsActive> <d:NumOfOrders m:type="Edm.Int64">255</d:NumOfOrders> <d:PartitionKey>mypartitionkey</d:PartitionKey> <d:RowKey>myrowkey1</d:RowKey> <d:Timestamp m:type="Edm.DateTime">0001-01-01T00:00:00</d:Timestamp> </m:properties> </content> </entry> ''' entity = Entity() properties = entry_element.findall('./atom:content/m:properties', _etree_entity_feed_namespaces) for prop in properties: for p in prop: name = _get_etree_tag_name_without_ns(p.tag) value = p.text or '' mtype = p.attrib.get(_make_etree_ns_attr_name(_etree_entity_feed_namespaces['m'], 'type'), None) isnull = p.attrib.get(_make_etree_ns_attr_name(_etree_entity_feed_namespaces['m'], 'null'), None) # if not isnull and no type info, then it is a string and we just # need the str type to hold the property. if not isnull and not mtype: _set_entity_attr(entity, name, value) elif isnull == 'true': if mtype: property = EntityProperty(mtype, None) else: property = EntityProperty('Edm.String', None) else: # need an object to hold the property conv = _ENTITY_TO_PYTHON_CONVERSIONS.get(mtype) if conv is not None: property = conv(value) else: property = EntityProperty(mtype, value) _set_entity_attr(entity, name, property) # extract id, updated and name value from feed entry and set them of # rule. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True).items(): if name in ['etag']: _set_entity_attr(entity, name, value) return entity
def _convert_etree_element_to_event_hub(entry_element): hub = EventHub() invalid_event_hub = True # get node for each attribute in EventHub class, if nothing found then the # response is not valid xml for EventHub. hub_element = entry_element.find('./atom:content/sb:EventHubDescription', _etree_sb_feed_namespaces) if hub_element is not None: mappings = [ ('SizeInBytes', 'size_in_bytes', int), ('MessageRetentionInDays', 'message_retention_in_days', int), ('Status', 'status', None), ('UserMetadata', 'user_metadata', None), ('PartitionCount', 'partition_count', int), ('EntityAvailableStatus', 'entity_available_status', None), ] for map in mappings: if _read_etree_element(hub_element, map[0], hub, map[1], map[2]): invalid_event_hub = False ids = hub_element.find('./sb:PartitionIds', _etree_sb_feed_namespaces) if ids is not None: for id_node in ids.findall('./arrays:string', _etree_sb_feed_namespaces): value = _get_etree_text(id_node) if value: hub.partition_ids.append(value) rules_nodes = hub_element.find('./sb:AuthorizationRules', _etree_sb_feed_namespaces) if rules_nodes is not None: invalid_event_hub = False for rule_node in rules_nodes.findall('./sb:AuthorizationRule', _etree_sb_feed_namespaces): rule = AuthorizationRule() mappings = [ ('ClaimType', 'claim_type', None), ('ClaimValue', 'claim_value', None), ('ModifiedTime', 'modified_time', None), ('CreatedTime', 'created_time', None), ('KeyName', 'key_name', None), ('PrimaryKey', 'primary_key', None), ('SecondaryKey', 'secondary_key', None), ] for map in mappings: _read_etree_element(rule_node, map[0], rule, map[1], map[2]) rights_nodes = rule_node.find('./sb:Rights', _etree_sb_feed_namespaces) if rights_nodes is not None: for access_rights_node in rights_nodes.findall( './sb:AccessRights', _etree_sb_feed_namespaces): node_value = _get_etree_text(access_rights_node) if node_value: rule.rights.append(node_value) hub.authorization_rules.append(rule) if invalid_event_hub: raise WindowsAzureError(_ERROR_EVENT_HUB_NOT_FOUND) # extract id, updated and name value from feed entry and set them of queue. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True).items(): if name == 'name': value = value.partition('?')[0] setattr(hub, name, value) return hub
def _convert_etree_element_to_event_hub(entry_element): hub = EventHub() invalid_event_hub = True # get node for each attribute in EventHub class, if nothing found then the # response is not valid xml for EventHub. hub_element = entry_element.find('./atom:content/sb:EventHubDescription', _etree_sb_feed_namespaces) if hub_element is not None: mappings = [ ('SizeInBytes', 'size_in_bytes', int), ('MessageRetentionInDays', 'message_retention_in_days', int), ('Status', 'status', None), ('UserMetadata', 'user_metadata', None), ('PartitionCount', 'partition_count', int), ('EntityAvailableStatus', 'entity_available_status', None), ] for map in mappings: if _read_etree_element(hub_element, map[0], hub, map[1], map[2]): invalid_event_hub = False ids = hub_element.find('./sb:PartitionIds', _etree_sb_feed_namespaces) if ids is not None: for id_node in ids.findall('./arrays:string', _etree_sb_feed_namespaces): value = _get_etree_text(id_node) if value: hub.partition_ids.append(value) rules_nodes = hub_element.find('./sb:AuthorizationRules', _etree_sb_feed_namespaces) if rules_nodes is not None: invalid_event_hub = False for rule_node in rules_nodes.findall('./sb:AuthorizationRule', _etree_sb_feed_namespaces): rule = AuthorizationRule() mappings = [ ('ClaimType', 'claim_type', None), ('ClaimValue', 'claim_value', None), ('ModifiedTime', 'modified_time', None), ('CreatedTime', 'created_time', None), ('KeyName', 'key_name', None), ('PrimaryKey', 'primary_key', None), ('SecondaryKey', 'secondary_key', None), ] for map in mappings: _read_etree_element(rule_node, map[0], rule, map[1], map[2]) rights_nodes = rule_node.find('./sb:Rights', _etree_sb_feed_namespaces) if rights_nodes is not None: for access_rights_node in rights_nodes.findall('./sb:AccessRights', _etree_sb_feed_namespaces): node_value = _get_etree_text(access_rights_node) if node_value: rule.rights.append(node_value) hub.authorization_rules.append(rule) if invalid_event_hub: raise WindowsAzureError(_ERROR_EVENT_HUB_NOT_FOUND) # extract id, updated and name value from feed entry and set them of queue. for name, value in _ETreeXmlToObject.get_entry_properties_from_element( entry_element, True).items(): if name == 'name': value = value.partition('?')[0] setattr(hub, name, value) return hub