Skip to content
Snippets Groups Projects
Commit 45184c42 authored by Neal Clark's avatar Neal Clark
Browse files

add azure storage support

parent 65ec5240
No related branches found
No related tags found
No related merge requests found
......@@ -18,4 +18,4 @@ RUN pip3 --no-cache-dir install .
RUN chown -R 1337:1337 /opt/grafana-backup-tool
USER 1337
CMD sh -c 'if [ "$RESTORE" = true ]; then if [ ! -z "$AWS_S3_BUCKET_NAME" ]; then grafana-backup restore $ARCHIVE_FILE; else grafana-backup restore _OUTPUT_/$ARCHIVE_FILE; fi else grafana-backup save; fi'
CMD sh -c 'if [ "$RESTORE" = true ]; then if [ ! -z "$AWS_S3_BUCKET_NAME" ] || [ ! -z "$AZURE_STORAGE_CONTAINER_NAME" ]; then grafana-backup restore $ARCHIVE_FILE; else grafana-backup restore _OUTPUT_/$ARCHIVE_FILE; fi else grafana-backup save; fi'
from azure.storage.blob import BlobServiceClient, BlobClient
import io
def main(args, settings):
arg_archive_file = args.get('<archive_file>', None)
azure_storage_container_name = settings.get('AZURE_STORAGE_CONTAINER_NAME')
azure_storage_connection_string = settings.get('AZURE_STORAGE_CONNECTION_STRING')
try:
blob_service_client = BlobServiceClient.from_connection_string(azure_storage_connection_string)
container_client = blob_service_client.get_blob_client(container=azure_storage_container_name, blob=arg_archive_file)
azure_storage_bytes = container_client.download_blob().readall()
azure_storage_data = io.BytesIO(azure_storage_bytes)
print("Download from Azure Storage was successful")
except Exception as e:
print(str(e))
return False
return azure_storage_data
from azure.storage.blob import BlobServiceClient, BlobClient
def main(args, settings):
azure_storage_container_name = settings.get('AZURE_STORAGE_CONTAINER_NAME')
azure_storage_connection_string = settings.get('AZURE_STORAGE_CONNECTION_STRING')
backup_dir = settings.get('BACKUP_DIR')
timestamp = settings.get('TIMESTAMP')
azure_file_name = '{0}.tar.gz'.format(timestamp)
archive_file = '{0}/{1}'.format(backup_dir, azure_file_name)
try:
blob_service_client = BlobServiceClient.from_connection_string(azure_storage_connection_string)
container_client = blob_service_client.get_blob_client(container=azure_storage_container_name, blob=azure_file_name)
with open(archive_file, 'rb') as data:
container_client.upload_blob(data)
print("Upload to Azure Storage was successful")
except FileNotFoundError:
print("The file was not found")
return False
except Exception as e:
print(str(e))
return False
return True
......@@ -32,6 +32,8 @@ def main(config_path):
aws_access_key_id = config.get('aws', {}).get('access_key_id', '')
aws_secret_access_key = config.get('aws', {}).get('secret_access_key', '')
aws_endpoint_url = config.get('aws', {}).get('endpoint_url', None)
azure_storage_container_name = config.get('azure', {}).get('container_name', '')
azure_storage_connection_string = config.get('azure', {}).get('connection_string', '')
admin_account = config.get('grafana', {}).get('admin_account', '')
admin_password = config.get('grafana', {}).get('admin_password', '')
......@@ -47,6 +49,9 @@ def main(config_path):
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY', aws_secret_access_key)
AWS_ENDPOINT_URL = os.getenv('AWS_ENDPOINT_URL', aws_endpoint_url)
AZURE_STORAGE_CONTAINER_NAME = os.getenv('AZURE_STORAGE_CONTAINER_NAME', azure_storage_container_name)
AZURE_STORAGE_CONNECTION_STRING = os.getenv('AZURE_STORAGE_CONNECTION_STRING', azure_storage_connection_string)
ADMIN_ACCOUNT = os.getenv('GRAFANA_ADMIN_ACCOUNT', admin_account)
ADMIN_PASSWORD = os.getenv('GRAFANA_ADMIN_PASSWORD', admin_password)
GRAFANA_BASIC_AUTH = os.getenv('GRAFANA_BASIC_AUTH', None)
......@@ -120,5 +125,7 @@ def main(config_path):
config_dict['AWS_ACCESS_KEY_ID'] = AWS_ACCESS_KEY_ID
config_dict['AWS_SECRET_ACCESS_KEY'] = AWS_SECRET_ACCESS_KEY
config_dict['AWS_ENDPOINT_URL'] = AWS_ENDPOINT_URL
config_dict['AZURE_STORAGE_CONTAINER_NAME'] = AZURE_STORAGE_CONTAINER_NAME
config_dict['AZURE_STORAGE_CONNECTION_STRING'] = AZURE_STORAGE_CONNECTION_STRING
return config_dict
......@@ -6,6 +6,7 @@ from grafana_backup.create_dashboard import main as create_dashboard
from grafana_backup.create_alert_channel import main as create_alert_channel
from grafana_backup.create_user import main as create_user
from grafana_backup.s3_download import main as s3_download
from grafana_backup.azure_storage_download import main as azure_storage_download
from glob import glob
import sys, tarfile, tempfile, os, shutil, fnmatch, collections
......@@ -13,6 +14,7 @@ import sys, tarfile, tempfile, os, shutil, fnmatch, collections
def main(args, settings):
arg_archive_file = args.get('<archive_file>', None)
aws_s3_bucket_name = settings.get('AWS_S3_BUCKET_NAME')
azure_storage_container_name = settings.get('AZURE_STORAGE_CONTAINER_NAME')
(status, json_resp, uid_support, paging_support) = api_checks(settings)
......@@ -29,6 +31,13 @@ def main(args, settings):
except Exception as e:
print(str(e))
sys.exit(1)
elif azure_storage_container_name:
azure_storage_data = azure_storage_download(args, settings)
try:
tar = tarfile.open(fileobj=azure_storage_data, mode='r:gz')
except Exception as e:
print(str(e))
sys.exit(1)
else:
try:
tarfile.is_tarfile(name=arg_archive_file)
......
......@@ -7,6 +7,7 @@ from grafana_backup.archive import main as archive
from grafana_backup.s3_upload import main as s3_upload
from grafana_backup.save_orgs import main as save_orgs
from grafana_backup.save_users import main as save_users
from grafana_backup.azure_storage_upload import main as azure_storage_upload
import sys
......@@ -43,10 +44,15 @@ def main(args, settings):
backup_functions[backup_function](args, settings)
aws_s3_bucket_name = settings.get('AWS_S3_BUCKET_NAME')
azure_storage_container_name = settings.get('AZURE_STORAGE_CONTAINER_NAME')
if not arg_no_archive:
archive(args, settings)
if aws_s3_bucket_name:
print('Upload archives to S3:')
s3_upload(args, settings)
if azure_storage_container_name:
print('Upload archives to Azure Storage:')
azure_storage_upload(args, settings)
\ No newline at end of file
......@@ -7,7 +7,8 @@ version = PKG_VERSION
requires = [
'requests',
'docopt',
'boto3'
'boto3',
'azure-storage-blob'
]
setup(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment