def __get_available_storage_account_and_container(self, hackathon_id): """ Get available storage account and container :param hackathon_id: the id of hackathon :type hackathon_id: integer :return: if there is available storage account and container, then return (True, storage account name, container name). Otherwise, return (False, None, None) :rtype: 3-element tuple: (bool, str|unicode, str|unicode) """ container_name = self.util.safe_get_config('dockerhostserver.azure.container', 'dockerhostprivatecontainer') sms = self.__get_sms_object(hackathon_id) if sms is None: self.log.error('Something wrong with Azure account of Hackathon:%d' % hackathon_id) return False, None, None storage_accounts = sms.list_storage_accounts() # check storage account one by one, return True once find a qualified one for storage in storage_accounts.storage_services: try: storage_response = sms.get_storage_account_keys(storage.service_name) except Exception as e: self.log.error('Encounter an error when checking storage_account:%s ' % storage.service_name) self.log.error(e) continue blob_service = BlobService(account_name=storage.service_name, account_key=storage_response.storage_service_keys.primary, host_base=self.util.safe_get_config('dockerhostserver.storage.host_base', '.blob.core.chinacloudapi.cn')) try: blob_service.get_container_metadata(container_name) return True, storage.service_name, container_name except Exception as e: if e.message != AzureApiExceptionMessage.CONTAINER_NOT_FOUND: self.log.error('Encounter an error when checking container:%s ' % container_name) self.log.error(e) continue try: blob_service.create_container(container_name=container_name, x_ms_blob_public_access='container') return True, storage.service_name, container_name except Exception as e: self.log.error('Encounter an error when creating container:%s ' % container_name) self.log.error(e) return False, None, None