import os import tarfile from flask import request, make_response, send_file from data.database import configure from util.config.validator import EXTRA_CA_DIRECTORY from config_app.c_app import app, config_provider from config_app.config_endpoints.api import resource, ApiResource, nickname @resource('/v1/configapp/tarconfig') class TarConfigLoader(ApiResource): """ Resource for dealing with configuration as a tarball, including loading and generating functions """ @nickname('scGetConfigTarball') def get(self): config_path = config_provider.config_volume # remove the initial trailing / from the prefix path, and add the last dir one tar_dir_prefix = config_path[1:] + '/' def tarinfo_filter(tarinfo): # remove leading directory info tarinfo.name = tarinfo.name.replace(tar_dir_prefix, '') # ignore any directory that isn't the specified extra ca one: if tarinfo.isdir() and not tarinfo.name == EXTRA_CA_DIRECTORY: return None return tarinfo # Remove the tar if it already exists so we don't write on top of existing tarball if os.path.isfile('quay-config.tar.gz'): os.remove('quay-config.tar.gz') tar = tarfile.open('quay-config.tar.gz', mode="w|gz") for name in os.listdir(config_path): tar.add(os.path.join(config_path, name), filter=tarinfo_filter) tar.close() return send_file('quay-config.tar.gz', mimetype='application/gzip') @nickname('scUploadTarballConfig') def put(self): """ Loads tarball config into the config provider """ input_stream = request.stream with tarfile.open(mode="r|gz", fileobj=input_stream) as tar_stream: # TODO: find a way to remove the contents of the directory on shutdown? tar_stream.extractall(config_provider.config_volume) # now try to connect to the db provided in their config combined = dict(**app.config) combined.update(config_provider.get_config()) configure(combined) return make_response('OK')