def test_get_queue_client_by_uri(self): account = self.setup_account() url = "https://" + account.name + ".queue.core.windows.net/testcc" queue_service, queue_name = StorageUtilities.get_queue_client_by_uri( url, self.session) self.assertIsNotNone(queue_service) self.assertEqual(queue_name, "testcc")
def test_get_queue_client_expired_token(self): """ Exception handler should deal with a bad token by clearing cache and retrying. So if we provide a bad token followed by a real one in our mock, we expect it to end up getting the real token. """ real_token = StorageUtilities.get_storage_token(self.session) with patch('c7n_azure.storage_utils.QueueService.create_queue' ) as create_mock: with patch( 'c7n_azure.storage_utils.StorageUtilities.get_storage_token' ) as token_mock: error = AzureHttpError('', 403) error.error_code = 'AuthenticationFailed' # Two side effects: one with a bad token and an error, # and one with a good token and no error create_mock.side_effect = [error, None] token_mock.side_effect = [TokenCredential('fake'), real_token] url = "https://fake.queue.core.windows.net/testcc" queue_service, queue_name = \ StorageUtilities.get_queue_client_by_uri(url, self.session) # We end up with the real token (after a retry) self.assertEqual(real_token, queue_service.authentication)
def test_notify_though_storage_queue(self): account = self.setup_account() # Create queue, make sure it is empty queue_url = "https://" + account.name + ".queue.core.windows.net/testnotify" queue, name = StorageUtilities.get_queue_client_by_uri( queue_url, self.session) queue.clear_messages(name) p = self.load_policy({ 'name': 'test-notify-for-keyvault', 'resource': 'azure.keyvault', 'actions': [{ 'type': 'notify', 'template': 'default', 'priority_header': '2', 'subject': 'testing notify action', 'to': ['*****@*****.**'], 'transport': { 'type': 'asq', 'queue': queue_url } }] }) resources = p.run() self.assertEqual(len(resources), 1) # Pull messages, should be 1 messages = StorageUtilities.get_queue_messages(queue, name) self.assertEqual(len(messages), 1)
def test_notify_though_storage_queue(self): account = self.setup_account() # Create queue, make sure it is empty queue_url = "https://" + account.name + ".queue.core.windows.net/testnotify" queue, name = StorageUtilities.get_queue_client_by_uri(queue_url, self.session) queue.clear_messages(name) p = self.load_policy({ 'name': 'test-notify-for-keyvault', 'resource': 'azure.keyvault', 'actions': [ {'type': 'notify', 'template': 'default', 'priority_header': '2', 'subject': 'testing notify action', 'to': ['*****@*****.**'], 'transport': {'type': 'asq', 'queue': queue_url} } ] }) resources = p.run() self.assertEqual(len(resources), 1) # Pull messages, should be 1 messages = StorageUtilities.get_queue_messages(queue, name) self.assertEqual(len(messages), 1)
def run(self, parallel=False): if parallel: self.logger.info( "Parallel processing with Azure Queue is not yet implemented.") self.logger.info("Downloading messages from the Azure Storage queue.") queue_settings = StorageUtilities.get_queue_client_by_uri( self.receive_queue) queue_messages = StorageUtilities.get_queue_messages( *queue_settings, num_messages=self.batch_size) while len(queue_messages) > 0: for queue_message in queue_messages: self.logger.debug("Message id: %s received" % queue_message.id) if (self.process_azure_queue_message(queue_message) or queue_message.dequeue_count > self.max_message_retry): # If message handled successfully or max retry hit, delete StorageUtilities.delete_queue_message( *queue_settings, message=queue_message) queue_messages = StorageUtilities.get_queue_messages( *queue_settings, num_messages=self.batch_size) self.logger.info( 'No messages left on the azure storage queue, exiting c7n_mailer.')
def test_get_queue_client_by_uri_china_cloud(self, mock_create): url = CHINA_STORAGE_ACCOUNT + "/queuename" queue_service, queue_name =\ StorageUtilities.get_queue_client_by_uri(url, Session(cloud_endpoints=AZURE_CHINA_CLOUD)) self.assertIsNotNone(queue_service) self.assertEqual(queue_name, "queuename") self.assertTrue( CHINA_STORAGE_ENDPOINT in queue_service.primary_endpoint) self.assertTrue(mock_create.called_once())
def send_to_azure_queue(self, queue_uri, message, session): try: queue_service, queue_name = StorageUtilities.get_queue_client_by_uri( queue_uri, session) return StorageUtilities.put_queue_message(queue_service, queue_name, self.pack(message)).id except AzureHttpError as e: if e.status_code == 403: self.log.error( "Access Error - Storage Queue Data Contributor Role is required " "to enqueue messages to the Azure Queue Storage.") else: self.log.error("Error putting message to the queue.\n" + str(e))
def test_cycle_queue_message_by_uri(self): account = self.setup_account() url = "https://" + account.name + ".queue.core.windows.net/testcyclemessage" queue_settings = StorageUtilities.get_queue_client_by_uri(url, self.session) StorageUtilities.put_queue_message(*queue_settings, content=u"hello queue") # Pull messages, should be 1 messages = StorageUtilities.get_queue_messages(*queue_settings) self.assertEqual(len(messages), 1) # Read message and delete it from queue for message in messages: self.assertEqual(message.content, u"hello queue") StorageUtilities.delete_queue_message(*queue_settings, message=message) # Pull messages again, should be empty messages = StorageUtilities.get_queue_messages(*queue_settings) self.assertEqual(len(messages), 0)
def run(self, parallel=False): if parallel: self.logger.info("Parallel processing with Azure Queue is not yet implemented.") self.logger.info("Downloading messages from the Azure Storage queue.") queue_settings = StorageUtilities.get_queue_client_by_uri(self.receive_queue, self.session) queue_messages = StorageUtilities.get_queue_messages( *queue_settings, num_messages=self.batch_size) while len(queue_messages) > 0: for queue_message in queue_messages: self.logger.debug("Message id: %s received" % queue_message.id) if (self.process_azure_queue_message(queue_message) or queue_message.dequeue_count > self.max_message_retry): # If message handled successfully or max retry hit, delete StorageUtilities.delete_queue_message(*queue_settings, message=queue_message) queue_messages = StorageUtilities.get_queue_messages( *queue_settings, num_messages=self.batch_size) self.logger.info('No messages left on the azure storage queue, exiting c7n_mailer.')
def test_get_queue_client_by_uri(self): account = self.setup_account() url = "https://" + account.name + ".queue.core.windows.net/testcc" queue_service, queue_name = StorageUtilities.get_queue_client_by_uri(url, self.session) self.assertIsNotNone(queue_service) self.assertEqual(queue_name, "testcc")
def send_to_azure_queue(self, queue_uri, message, session): queue_service, queue_name = StorageUtilities.get_queue_client_by_uri( queue_uri, session) return StorageUtilities.put_queue_message(queue_service, queue_name, self.pack(message)).id
def send_to_azure_queue(self, queue_uri, message, session): queue_service, queue_name = StorageUtilities.get_queue_client_by_uri(queue_uri, session) return StorageUtilities.put_queue_message(queue_service, queue_name, self.pack(message)).id