def _register_database(self, app): database_connector = DatabaseConnector.get_connector(app) if database_connector: try: database_connector.create_database() except DatabaseError as exc: raise DatabaseConnectorError(exc.exception_value())
def _register_database(self, app): database_connector = DatabaseConnector.get_connector(app) if database_connector: try: database_connector.create_database() except DatabaseError as exc: raise Abort(str(exc))
def _start_docker_image(self, app, hostdn, password, args): docker = self._get_docker(app) if not docker: return self.log('Verifying Docker registry manifest for app image %s' % docker.image) docker.verify() if args.pull_image: docker.pull() self.log('Initializing app image') hostname = explode_dn(hostdn, 1)[0] set_vars = (args.set_vars or {}).copy() after_image_configuration = {} for setting in app.get_settings(): if setting.should_go_into_image_configuration(app): if setting.name not in set_vars: set_vars[setting.name] = setting.get_initial_value(app) else: try: after_image_configuration[setting.name] = set_vars.pop( setting.name) except KeyError: after_image_configuration[ setting.name] = setting.get_initial_value(app) set_vars['docker/host/name'] = '%s.%s' % (ucr_get('hostname'), ucr_get('domainname')) set_vars['ldap/hostdn'] = hostdn if app.docker_env_ldap_user: set_vars[app.docker_env_ldap_user] = hostdn set_vars['server/role'] = app.docker_server_role set_vars['update/warning/releasenotes'] = 'no' ucr_keys_list = list(ucr_keys()) for var in [ 'nameserver.*', 'repository/online/server', 'repository/app_center/server', 'update/secure_apt', 'appcenter/index/verify', 'ldap/base', 'ldap/server.*', 'ldap/master.*', 'locale.*', 'domainname' ]: for key in ucr_keys_list: if re.match(var, key): set_vars[key] = ucr_get(key) if ucr_is_true('appcenter/docker/container/proxy/settings', default=True): if ucr_get('proxy/http'): set_vars['proxy/http'] = ucr_get('proxy/http') set_vars['http_proxy'] = ucr_get('proxy/http') if ucr_get('proxy/https'): set_vars['proxy/https'] = ucr_get('proxy/https') set_vars['https_proxy'] = ucr_get('proxy/https') if ucr_get('proxy/no_proxy'): set_vars['proxy/no_proxy'] = ucr_get('proxy/no_proxy') set_vars['no_proxy'] = ucr_get('proxy/no_proxy') set_vars['updater/identify'] = 'Docker App' database_connector = DatabaseConnector.get_connector(app) database_password_file = None if database_connector: try: database_password = database_connector.get_db_password() database_password_file = database_connector.get_db_password_file( ) if database_password: set_vars[ app. docker_env_database_host] = database_connector.get_db_host( ) db_port = database_connector.get_db_port() if db_port: set_vars[app.docker_env_database_port] = db_port set_vars[ app. docker_env_database_name] = database_connector.get_db_name( ) set_vars[ app. docker_env_database_user] = database_connector.get_db_user( ) if app.docker_env_database_password_file: set_vars[ app. docker_env_database_password_file] = database_password_file else: set_vars[ app. docker_env_database_password] = database_password autostart_variable = database_connector.get_autostart_variable( ) if autostart_variable: set_vars[autostart_variable] = 'no' except DatabaseError as exc: raise DatabaseConnectorError(str(exc)) container = docker.create(hostname, set_vars) self.log('Preconfiguring container %s' % container) autostart = 'yes' if not Start.call(app=app): raise DockerCouldNotStartContainer(str(Status.get_status(app))) time.sleep(3) if not docker.is_running(): dlogs = docker.dockerd_logs() clogs = docker.logs() inspect = docker.inspect_container() msg = """ The container for {app} could not be started! docker logs {container}: {clogs} dockerd logs: {dlogs} docker inspect: {state} {graphdriver}""".format(app=app, container=docker.container, clogs=clogs, dlogs=dlogs, state=inspect.get('State'), graphdriver=inspect.get('GraphDriver')) raise AppCenterErrorContainerStart(msg) # copy password files if os.path.isfile(app.secret_on_host): # we can not use docker-cp here, as we support read-only containers too :-( f_name = docker.path('/etc/machine.secret') f_dir = os.path.dirname(f_name) # if the container start takes a little longer the f_dir may not exist yet # so wait max 60s for i in xrange(0, 12): if os.path.isdir(f_dir): break time.sleep(5) try: with open(f_name, 'w+b') as f: os.chmod(f_name, 0o600) f.write(password) except Exception as exc: raise DockerCouldNotStartContainer( 'Could not copy machine.secret to container: %s (%s)' % (str(exc), docker.logs())) if database_password_file: docker.cp_to_container(database_password_file, database_password_file) # update timezone in container logfile_logger = get_logfile_logger('docker.base') docker.execute('rm', '-f', '/etc/timezone', '/etc/localtime', _logger=logfile_logger) docker.cp_to_container('/etc/timezone', '/etc/timezone', _logger=logfile_logger) docker.cp_to_container('/etc/localtime', '/etc/localtime', _logger=logfile_logger) # configure app after_image_configuration.update(set_vars) configure = get_action('configure') configure.call(app=app, autostart=autostart, run_script='no', set_vars=after_image_configuration)
def _start_docker_image(self, app, hostdn, password, args): docker = self._get_docker(app) if not docker: return self.log('Verifying Docker registry manifest for app image %s' % docker.image) docker.verify() if args.pull_image: self.log('Downloading app image %s' % docker.image) if not docker.pull(): raise DockerImagePullFailed(docker.image) self.log('Initializing app image') hostname = explode_dn(hostdn, 1)[0] set_vars = (args.set_vars or {}).copy() after_image_configuration = {} for setting in app.get_settings(): if setting.should_go_into_image_configuration(app): if setting.name not in set_vars: set_vars[setting.name] = setting.get_initial_value() else: try: after_image_configuration[setting.name] = set_vars.pop( setting.name) except KeyError: pass set_vars['docker/host/name'] = '%s.%s' % (ucr_get('hostname'), ucr_get('domainname')) set_vars['ldap/hostdn'] = hostdn if app.docker_env_ldap_user: set_vars[app.docker_env_ldap_user] = hostdn set_vars['server/role'] = app.docker_server_role set_vars['update/warning/releasenotes'] = 'no' ucr_keys_list = list(ucr_keys()) for var in [ 'nameserver.*', 'repository/online/server', 'repository/app_center/server', 'update/secure_apt', 'appcenter/index/verify', 'ldap/master.*', 'locale.*', 'domainname' ]: for key in ucr_keys_list: if re.match(var, key): set_vars[key] = ucr_get(key) if ucr_is_true('appcenter/docker/container/proxy/settings', default=True): if ucr_get('proxy/http'): set_vars['proxy/http'] = ucr_get('proxy/http') set_vars['http_proxy'] = ucr_get('proxy/http') if ucr_get('proxy/https'): set_vars['proxy/https'] = ucr_get('proxy/https') set_vars['https_proxy'] = ucr_get('proxy/https') if ucr_get('proxy/no_proxy'): set_vars['proxy/no_proxy'] = ucr_get('proxy/no_proxy') set_vars['no_proxy'] = ucr_get('proxy/no_proxy') set_vars['updater/identify'] = 'Docker App' database_connector = DatabaseConnector.get_connector(app) database_password_file = None if database_connector: try: database_password = database_connector.get_db_password() database_password_file = database_connector.get_db_password_file( ) if database_password: set_vars[ app. docker_env_database_host] = database_connector.get_db_host( ) db_port = database_connector.get_db_port() if db_port: set_vars[app.docker_env_database_port] = db_port set_vars[ app. docker_env_database_name] = database_connector.get_db_name( ) set_vars[ app. docker_env_database_user] = database_connector.get_db_user( ) if app.docker_env_database_password_file: set_vars[ app. docker_env_database_password_file] = database_password_file else: set_vars[ app. docker_env_database_password] = database_password autostart_variable = database_connector.get_autostart_variable( ) if autostart_variable: set_vars[autostart_variable] = 'no' except DatabaseError as exc: raise DatabaseConnectorError(str(exc)) container = docker.create(hostname, set_vars) self.log('Preconfiguring container %s' % container) autostart = 'yes' if not Start.call(app=app): raise DockerCouldNotStartContainer() time.sleep(3) if not docker.is_running(): dlogs = docker.dockerd_logs() clogs = docker.logs() inspect = docker.inspect_container() msg = """ The container for {app} could not be started! docker logs {container}: {clogs} dockerd logs: {dlogs} docker inspect: {state} {graphdriver}""".format(app=app, container=docker.container, clogs='\n'.join(clogs), dlogs='\n'.join(dlogs), state=inspect.get('State'), graphdriver=inspect.get('GraphDriver')) raise AppCenterErrorContainerStart(msg) if password: with open(docker.path('/etc/machine.secret'), 'w+b') as f: f.write(password) docker.cp_to_container('/etc/timezone', '/etc/timezone') docker.cp_to_container('/etc/localtime', '/etc/localtime') if database_password_file: docker.cp_to_container(database_password_file, database_password_file) after_image_configuration.update(set_vars) configure = get_action('configure') configure.call(app=app, autostart=autostart, run_script='no', set_vars=after_image_configuration)