Fix dockerfile being able to pass in params
Change config directory to local config_app one
This commit is contained in:
parent
acf242f241
commit
13293ecdea
14 changed files with 45 additions and 30 deletions
|
@ -138,4 +138,5 @@ RUN ./scripts/detect-config.sh
|
||||||
|
|
||||||
EXPOSE 443 8443 80
|
EXPOSE 443 8443 80
|
||||||
|
|
||||||
CMD ./quay-entrypoint.sh
|
ENTRYPOINT [ "/bin/bash", "./quay-entrypoint.sh"]
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
app: PYTHONPATH="../" gunicorn -c conf/gunicorn_local.py config_application:application
|
app: PYTHONPATH="../" gunicorn -c conf/gunicorn_local.py config_application:application
|
||||||
# webpack: npm run watch-config-app
|
webpack: npm run watch-config-app
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,8 @@ import re
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
|
|
||||||
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
# Note: this currently points to the directory above, since we're in the quay config_app dir. When extracting, revert
|
||||||
|
ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
CONF_DIR = os.getenv("QUAYCONF", os.path.join(ROOT_DIR, "conf/"))
|
CONF_DIR = os.getenv("QUAYCONF", os.path.join(ROOT_DIR, "conf/"))
|
||||||
STATIC_DIR = os.path.join(ROOT_DIR, 'static/')
|
STATIC_DIR = os.path.join(ROOT_DIR, 'static/')
|
||||||
STATIC_LDN_DIR = os.path.join(STATIC_DIR, 'ldn/')
|
STATIC_LDN_DIR = os.path.join(STATIC_DIR, 'ldn/')
|
||||||
|
@ -11,9 +12,6 @@ STATIC_FONTS_DIR = os.path.join(STATIC_DIR, 'fonts/')
|
||||||
TEMPLATE_DIR = os.path.join(ROOT_DIR, 'templates/')
|
TEMPLATE_DIR = os.path.join(ROOT_DIR, 'templates/')
|
||||||
|
|
||||||
|
|
||||||
# TODO(config): Remove this external folder dependency
|
|
||||||
EXTERNAL_REPO_REQUIRE_PATH = os.path.dirname(ROOT_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
def _get_version_number_changelog():
|
def _get_version_number_changelog():
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from _init_config import CONF_DIR
|
from _init_config import ROOT_DIR
|
||||||
from config_app.config_util.config import get_config_provider
|
from config_app.config_util.config import get_config_provider
|
||||||
|
from util.ipresolver import NoopIPResolver
|
||||||
|
|
||||||
|
|
||||||
from util.config.superusermanager import SuperUserManager
|
from util.config.superusermanager import SuperUserManager
|
||||||
|
@ -11,7 +12,8 @@ app = Flask(__name__)
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
OVERRIDE_CONFIG_DIRECTORY = os.path.join(CONF_DIR, 'stack/')
|
# OVERRIDE_CONFIG_DIRECTORY = os.path.join(ROOT_DIR, 'stack/')
|
||||||
|
OVERRIDE_CONFIG_DIRECTORY = os.path.join(ROOT_DIR, 'config_app/conf/stack')
|
||||||
|
|
||||||
|
|
||||||
is_testing = 'TEST' in os.environ
|
is_testing = 'TEST' in os.environ
|
||||||
|
@ -33,3 +35,4 @@ else:
|
||||||
# Load the override config via the provider.
|
# Load the override config via the provider.
|
||||||
config_provider.update_app_config(app.config)
|
config_provider.update_app_config(app.config)
|
||||||
superusers = SuperUserManager(app)
|
superusers = SuperUserManager(app)
|
||||||
|
ip_resolver = NoopIPResolver()
|
|
@ -10,7 +10,7 @@ from config_app.config_util.workers import get_worker_count
|
||||||
|
|
||||||
|
|
||||||
logconfig = logfile_path(debug=True)
|
logconfig = logfile_path(debug=True)
|
||||||
bind = '127.0.0.1:5000'
|
bind = '0.0.0.0:5000'
|
||||||
workers = get_worker_count('local', 2, minimum=2, maximum=8)
|
workers = get_worker_count('local', 2, minimum=2, maximum=8)
|
||||||
worker_class = 'gevent'
|
worker_class = 'gevent'
|
||||||
daemon = False
|
daemon = False
|
||||||
|
|
|
@ -3,7 +3,7 @@ from uuid import uuid4
|
||||||
import os.path
|
import os.path
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from _init_config import ROOT_DIR, CONF_DIR, EXTERNAL_REPO_REQUIRE_PATH
|
from _init_config import ROOT_DIR, CONF_DIR
|
||||||
|
|
||||||
|
|
||||||
def build_requests_session():
|
def build_requests_session():
|
||||||
|
@ -48,7 +48,7 @@ class ImmutableConfig(object):
|
||||||
# Status tag config
|
# Status tag config
|
||||||
STATUS_TAGS = {}
|
STATUS_TAGS = {}
|
||||||
for tag_name in ['building', 'failed', 'none', 'ready', 'cancelled']:
|
for tag_name in ['building', 'failed', 'none', 'ready', 'cancelled']:
|
||||||
tag_path = os.path.join(EXTERNAL_REPO_REQUIRE_PATH, 'buildstatus', tag_name + '.svg')
|
tag_path = os.path.join(ROOT_DIR, 'buildstatus', tag_name + '.svg')
|
||||||
with open(tag_path) as tag_svg:
|
with open(tag_path) as tag_svg:
|
||||||
STATUS_TAGS[tag_name] = tag_svg.read()
|
STATUS_TAGS[tag_name] = tag_svg.read()
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ from flask import abort, request
|
||||||
|
|
||||||
from config_app.config_endpoints.api.suconfig_models_pre_oci import pre_oci_model as model
|
from config_app.config_endpoints.api.suconfig_models_pre_oci import pre_oci_model as model
|
||||||
from config_app.config_endpoints.api import resource, ApiResource, verify_not_prod, nickname, validate_json_request
|
from config_app.config_endpoints.api import resource, ApiResource, verify_not_prod, nickname, validate_json_request
|
||||||
from config_app.c_app import app, config_provider, superusers, OVERRIDE_CONFIG_DIRECTORY
|
from config_app.c_app import app, config_provider, superusers, OVERRIDE_CONFIG_DIRECTORY, ip_resolver
|
||||||
|
|
||||||
from auth.auth_context import get_authenticated_user
|
from auth.auth_context import get_authenticated_user
|
||||||
from data.users import get_federated_service_name, get_users_handler
|
from data.users import get_federated_service_name, get_users_handler
|
||||||
|
@ -15,8 +15,7 @@ from data.database import configure
|
||||||
from data.runmigration import run_alembic_migration
|
from data.runmigration import run_alembic_migration
|
||||||
from util.config.configutil import add_enterprise_config_defaults
|
from util.config.configutil import add_enterprise_config_defaults
|
||||||
from util.config.database import sync_database_with_config
|
from util.config.database import sync_database_with_config
|
||||||
# TODO(config) re-add this import when we get the app extracted from validators
|
from util.config.validator import validate_service_for_config, ValidatorContext
|
||||||
# from util.config.validator import validate_service_for_config
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -64,9 +63,6 @@ class SuperUserConfig(ApiResource):
|
||||||
def get(self):
|
def get(self):
|
||||||
""" Returns the currently defined configuration, if any. """
|
""" Returns the currently defined configuration, if any. """
|
||||||
config_object = config_provider.get_config()
|
config_object = config_provider.get_config()
|
||||||
logger.debug(config_object)
|
|
||||||
logger.debug(config_provider)
|
|
||||||
# Todo: do we even need this endpoint? Since we'll be loading the config in browser
|
|
||||||
return {
|
return {
|
||||||
'config': config_object
|
'config': config_object
|
||||||
}
|
}
|
||||||
|
@ -350,6 +346,10 @@ class SuperUserConfigValidate(ApiResource):
|
||||||
# if not config_provider.config_exists() or SuperUserPermission().can():
|
# if not config_provider.config_exists() or SuperUserPermission().can():
|
||||||
if not config_provider.config_exists():
|
if not config_provider.config_exists():
|
||||||
config = request.get_json()['config']
|
config = request.get_json()['config']
|
||||||
return validate_service_for_config(service, config, request.get_json().get('password', ''))
|
validator_context = ValidatorContext.from_app(app, config, request.get_json().get('password', ''),
|
||||||
|
ip_resolver=ip_resolver,
|
||||||
|
config_provider=config_provider)
|
||||||
|
return validate_service_for_config(service, validator_context)
|
||||||
|
|
||||||
|
|
||||||
abort(403)
|
abort(403)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import os
|
import os
|
||||||
from _init_config import CONF_DIR
|
from config_app._init_config import CONF_DIR
|
||||||
|
|
||||||
|
|
||||||
def logfile_path(jsonfmt=False, debug=False):
|
def logfile_path(jsonfmt=False, debug=False):
|
||||||
|
|
11
config_app/init/service/gunicorn_web/run
Executable file
11
config_app/init/service/gunicorn_web/run
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#! /bin/bash
|
||||||
|
|
||||||
|
echo 'Starting gunicon'
|
||||||
|
|
||||||
|
QUAYPATH=${QUAYPATH:-"."}
|
||||||
|
QUAYCONF=${QUAYCONF:-"$QUAYPATH/conf"}
|
||||||
|
|
||||||
|
cd ${QUAYDIR:-"/"}
|
||||||
|
PYTHONPATH=$QUAYPATH venv/bin/gunicorn -c $QUAYDIR/config_app/conf/gunicorn_local.py config_application:application
|
||||||
|
|
||||||
|
echo 'Gunicorn exited'
|
|
@ -324,8 +324,5 @@ angular.module('quay-config').factory('ApiService', ['Restangular', '$q', 'UtilS
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// todo: remove hacks
|
|
||||||
apiService.scRegistryStatus = () => new Promise(() => { hello: true });
|
|
||||||
|
|
||||||
return apiService;
|
return apiService;
|
||||||
}]);
|
}]);
|
||||||
|
|
|
@ -196,6 +196,7 @@ const templateUrl = require('./setup.html');
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.isStep = function(step) {
|
$scope.isStep = function(step) {
|
||||||
|
console.log('current step is', step);
|
||||||
for (var i = 1; i < arguments.length; ++i) {
|
for (var i = 1; i < arguments.length; ++i) {
|
||||||
if (arguments[i] == step) {
|
if (arguments[i] == step) {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
MODE="$1"
|
MODE="$1"
|
||||||
|
|
||||||
display_usage() {
|
display_usage() {
|
||||||
echo "This script takes one arguments."
|
echo "This script takes one argument."
|
||||||
echo -e "\nUsage: ${0} <interactive|batch|both>\n"
|
echo -e "\nUsage: ${0} <config|interactive|batch|both>\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
if [[ "${MODE}" = "help" ]]
|
if [[ "${MODE}" = "help" ]]
|
||||||
|
@ -32,6 +32,10 @@ EOF
|
||||||
venv/bin/python -m displayversion
|
venv/bin/python -m displayversion
|
||||||
|
|
||||||
case "$MODE" in
|
case "$MODE" in
|
||||||
|
"config")
|
||||||
|
echo "Entering config mode, only copying config-app entrypoints"
|
||||||
|
cp -r ${QUAYDIR}/config_app/init/service/* /etc/service
|
||||||
|
;;
|
||||||
"interactive")
|
"interactive")
|
||||||
echo "Copying $MODE files"
|
echo "Copying $MODE files"
|
||||||
cp -r ${QUAYCONF}/init/service/interactive/* /etc/service
|
cp -r ${QUAYCONF}/init/service/interactive/* /etc/service
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from boot import setup_jwt_proxy
|
# from boot import setup_jwt_proxy
|
||||||
from util.secscan.api import SecurityScannerAPI
|
from util.secscan.api import SecurityScannerAPI
|
||||||
from util.config.validators import BaseValidator, ConfigValidationException
|
from util.config.validators import BaseValidator, ConfigValidationException
|
||||||
|
|
||||||
|
@ -23,9 +23,9 @@ class SecurityScannerValidator(BaseValidator):
|
||||||
|
|
||||||
api = SecurityScannerAPI(config, None, server_hostname, client=client, skip_validation=True, uri_creator=uri_creator)
|
api = SecurityScannerAPI(config, None, server_hostname, client=client, skip_validation=True, uri_creator=uri_creator)
|
||||||
|
|
||||||
if not is_testing:
|
# if not is_testing:
|
||||||
# Generate a temporary Quay key to use for signing the outgoing requests.
|
# Generate a temporary Quay key to use for signing the outgoing requests.
|
||||||
setup_jwt_proxy()
|
# setup_jwt_proxy()
|
||||||
|
|
||||||
# We have to wait for JWT proxy to restart with the newly generated key.
|
# We have to wait for JWT proxy to restart with the newly generated key.
|
||||||
max_tries = 5
|
max_tries = 5
|
||||||
|
|
|
@ -3,7 +3,7 @@ import logging
|
||||||
from hashlib import sha1
|
from hashlib import sha1
|
||||||
|
|
||||||
from util.config.validators import BaseValidator, ConfigValidationException
|
from util.config.validators import BaseValidator, ConfigValidationException
|
||||||
from util.registry.torrent import jwt_from_infohash
|
# from util.registry.torrent import jwt_from_infohash
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -31,8 +31,8 @@ class BittorrentValidator(BaseValidator):
|
||||||
'port': 80,
|
'port': 80,
|
||||||
}
|
}
|
||||||
|
|
||||||
encoded_jwt = jwt_from_infohash(params['info_hash'])
|
# encoded_jwt = jwt_from_infohash(params['info_hash'])
|
||||||
params['jwt'] = encoded_jwt
|
# params['jwt'] = encoded_jwt
|
||||||
|
|
||||||
resp = client.get(announce_url, timeout=5, params=params)
|
resp = client.get(announce_url, timeout=5, params=params)
|
||||||
logger.debug('Got tracker response: %s: %s', resp.status_code, resp.text)
|
logger.debug('Got tracker response: %s: %s', resp.status_code, resp.text)
|
||||||
|
|
Reference in a new issue