Merge branch 'master' into bing

This commit is contained in:
Joseph Schorr 2015-04-08 15:23:36 -04:00
commit 19e25ac340
6 changed files with 42 additions and 23 deletions

View file

@ -1,6 +1,9 @@
import redis import redis
import json import json
import threading import threading
import logging
logger = logging.getLogger(__name__)
class UserEventBuilder(object): class UserEventBuilder(object):
""" """
@ -68,8 +71,9 @@ class UserEvent(object):
def conduct(): def conduct():
try: try:
self.publish_event_data_sync(event_id, data_obj) self.publish_event_data_sync(event_id, data_obj)
except Exception as e: logger.debug('Published user event %s: %s', event_id, data_obj)
print e except Exception:
logger.exception('Could not publish user event')
thread = threading.Thread(target=conduct) thread = threading.Thread(target=conduct)
thread.start() thread.start()

View file

@ -15,6 +15,7 @@ from auth.permissions import SuperUserPermission
from auth.auth_context import get_authenticated_user from auth.auth_context import get_authenticated_user
from data.database import User from data.database import User
from util.config.configutil import add_enterprise_config_defaults from util.config.configutil import add_enterprise_config_defaults
from util.config.provider import CannotWriteConfigException
from util.config.validator import validate_service_for_config, SSL_FILENAMES from util.config.validator import validate_service_for_config, SSL_FILENAMES
from data.runmigration import run_alembic_migration from data.runmigration import run_alembic_migration

View file

@ -4,6 +4,7 @@ import json
from flask import make_response from flask import make_response
from app import app from app import app
from util.useremails import CannotSendEmailException from util.useremails import CannotSendEmailException
from util.config.provider import CannotWriteConfigException
from data import model from data import model
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -17,3 +18,11 @@ def handle_dme(ex):
def handle_emailexception(ex): def handle_emailexception(ex):
message = 'Could not send email. Please contact an administrator and report this problem.' message = 'Could not send email. Please contact an administrator and report this problem.'
return make_response(json.dumps({'message': message}), 400) return make_response(json.dumps({'message': message}), 400)
@app.errorhandler(CannotWriteConfigException)
def handle_configexception(ex):
message = ('Configuration could not be written to the mounted volume. \n' +
'Please make sure the mounted volume is not read-only and restart ' +
'the setup process. \n\nIssue: %s' % ex)
return make_response(json.dumps({'message': message}), 400)

View file

@ -114,13 +114,11 @@ def create_user():
# Mark that the user was logged in. # Mark that the user was logged in.
event = userevents.get_event(username) event = userevents.get_event(username)
event.publish_event_data('docker-cli', {'action': 'login'}) event.publish_event_data('docker-cli', {'action': 'login'})
return success return success
else: else:
# Mark that the login failed. # Mark that the login failed.
event = userevents.get_event(username) event = userevents.get_event(username)
event.publish_event_data('docker-cli', {'action': 'loginfailure'}) event.publish_event_data('docker-cli', {'action': 'loginfailure'})
abort(400, error_message, issue='login-failure') abort(400, error_message, issue='login-failure')
elif not features.USER_CREATION: elif not features.USER_CREATION:
@ -231,6 +229,16 @@ def create_repository(namespace, repository):
repo = model.create_repository(namespace, repository, repo = model.create_repository(namespace, repository,
get_authenticated_user()) get_authenticated_user())
if get_authenticated_user():
user_event_data = {
'action': 'push_start',
'repository': repository,
'namespace': namespace
}
event = userevents.get_event(get_authenticated_user().username)
event.publish_event_data('docker-cli', user_event_data)
return make_response('Created', 201) return make_response('Created', 201)
@ -248,20 +256,6 @@ def update_images(namespace, repository):
# Make sure the repo actually exists. # Make sure the repo actually exists.
abort(404, message='Unknown repository', issue='unknown-repo') abort(404, message='Unknown repository', issue='unknown-repo')
if get_authenticated_user():
logger.debug('Publishing push event')
username = get_authenticated_user().username
# Mark that the user has pushed the repo.
user_data = {
'action': 'pushed_repo',
'repository': repository,
'namespace': namespace
}
event = userevents.get_event(username)
event.publish_event_data('docker-cli', user_data)
logger.debug('GCing repository') logger.debug('GCing repository')
model.garbage_collect_repository(namespace, repository) model.garbage_collect_repository(namespace, repository)
@ -272,6 +266,7 @@ def update_images(namespace, repository):
event_data = { event_data = {
'updated_tags': updated_tags, 'updated_tags': updated_tags,
} }
track_and_log('push_repo', repo) track_and_log('push_repo', repo)
spawn_notification(repo, 'repo_push', event_data) spawn_notification(repo, 'repo_push', event_data)
return make_response('Updated', 204) return make_response('Updated', 204)

View file

@ -63,7 +63,7 @@
'templateUrl': '/static/tutorial/push-image.html', 'templateUrl': '/static/tutorial/push-image.html',
'signal': AngularTourSignals.serverEvent('/realtime/user/subscribe?events=docker-cli', 'signal': AngularTourSignals.serverEvent('/realtime/user/subscribe?events=docker-cli',
function(message, tourScope) { function(message, tourScope) {
var pushing = message['data']['action'] == 'push_repo'; var pushing = message['data']['action'] == 'push_start';
if (pushing) { if (pushing) {
tourScope.repoName = message['data']['repository']; tourScope.repoName = message['data']['repository'];
} }
@ -77,7 +77,7 @@
'templateUrl': '/static/tutorial/pushing.html', 'templateUrl': '/static/tutorial/pushing.html',
'signal': AngularTourSignals.serverEvent('/realtime/user/subscribe?events=docker-cli', 'signal': AngularTourSignals.serverEvent('/realtime/user/subscribe?events=docker-cli',
function(message, tourScope) { function(message, tourScope) {
return message['data']['action'] == 'pushed_repo'; return message['data']['action'] == 'push_repo';
}), }),
'waitMessage': "Waiting for repository push to complete" 'waitMessage': "Waiting for repository push to complete"
}, },

View file

@ -6,6 +6,10 @@ from StringIO import StringIO
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class CannotWriteConfigException(Exception):
""" Exception raised when the config cannot be written. """
pass
def _import_yaml(config_obj, config_file): def _import_yaml(config_obj, config_file):
with open(config_file) as f: with open(config_file) as f:
c = yaml.safe_load(f) c = yaml.safe_load(f)
@ -24,8 +28,11 @@ def _import_yaml(config_obj, config_file):
def _export_yaml(config_obj, config_file): def _export_yaml(config_obj, config_file):
with open(config_file, 'w') as f: try:
f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True)) with open(config_file, 'w') as f:
f.write(yaml.safe_dump(config_obj, encoding='utf-8', allow_unicode=True))
except IOError as ioe:
raise CannotWriteConfigException(str(ioe))
class BaseProvider(object): class BaseProvider(object):
@ -116,7 +123,10 @@ class FileConfigProvider(BaseProvider):
return open(os.path.join(self.config_volume, filename), mode) return open(os.path.join(self.config_volume, filename), mode)
def save_volume_file(self, filename, flask_file): def save_volume_file(self, filename, flask_file):
flask_file.save(os.path.join(self.config_volume, filename)) try:
flask_file.save(os.path.join(self.config_volume, filename))
except IOError as ioe:
raise CannotWriteConfigException(str(ioe))
def requires_restart(self, app_config): def requires_restart(self, app_config):
file_config = self.get_yaml() file_config = self.get_yaml()