Permalink
Browse files

Merge branch 'master' into stats_page

  • Loading branch information...
2 parents 9b292b3 + 5771528 commit 3c0893a74065fee7039c6ddb6d10203e94183699 @StrausMG StrausMG committed May 22, 2017
Showing with 83 additions and 6 deletions.
  1. +1 −1 README.md
  2. +2 −1 bower.json
  3. +3 −0 etc/base_config.py
  4. +35 −0 everware/home_handler.py
  5. +9 −1 everware/spawner.py
  6. +13 −1 share/static/html/home.html
  7. +1 −0 share/static/html/page.html
  8. +19 −2 share/static/html/spawn.html
View
@@ -71,7 +71,7 @@ In order to deploy your own `everware` instance, you have to:
everware-server -f etc/local_config.py --debug --no-ssl
```
-Everware can also be deployed in a Docker container. See [Everware in Docker container](docker.md)
+Everware can also be deployed in a Docker container. See [Everware in Docker container](docs/docker.md)
## Development
View
@@ -7,6 +7,7 @@
"jquery": "components/jquery#~2.0",
"moment": "~2.7",
"requirejs": "~2.1",
- "material-design-lite": "^1.1.3"
+ "material-design-lite": "^1.1.3",
+ "clipboard": "^1.6.1"
}
}
View
@@ -14,6 +14,9 @@
c.Spawner.remove_containers = True
c.Spawner.tls_assert_hostname = False
c.Spawner.use_docker_client_env = True
+# give users an opportunity to restore any images via docker or not. Default: True
+# c.Spawner.share_user_images = False
+
# c.Authenticator.admin_users = {'anaderi', 'astiunov'}
# The docker containers need access to the Hub API, so the default
View
@@ -8,6 +8,7 @@
from . import __version__
from .github_agent import *
from .metrica import MetricaIdsMixin
+from datetime import datetime
@gen.coroutine
def is_repository_changed(user):
@@ -30,6 +31,32 @@ def is_repository_changed(user):
else:
return False
+@gen.coroutine
+def commit_container(request, spawner, log):
+ image_tag = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
+ image_name = 'everware_image/' + spawner.escaped_name + '/' + spawner.escaped_repo_url + '_' + spawner.container_id
+ host_with_protocol = request.protocol + '://' + request.host
+ url_with_image = url_concat(host_with_protocol + '/hub/spawn',
+ dict(repourl='docker:' + image_name + ':' + image_tag))
+
+ log.info('Will commit %s' % url_with_image)
+
+ commit = yield spawner.docker(
+ 'commit',
+ container=spawner.container_id,
+ repository=image_name,
+ tag=image_tag,
+ message='Commit from control panel',
+ author=spawner.escaped_name
+ )
+
+ output_data = dict()
+ if commit:
+ output_data['url_with_image'] = url_with_image
+ else:
+ output_data['message'] = 'Sorry, can not save container'
+
+ return output_data
class HomeHandler(BaseHandler):
"""Render the user's home page."""
@@ -43,7 +70,9 @@ def get(self):
do_fork = self.get_argument('do_fork', False)
do_push = self.get_argument('do_push', False)
+ do_commit_container = self.get_argument('do_commit_container', False)
notify_message = self.get_argument('message', '')
+ notify_url_to_image = self.get_argument('url_with_image', '')
if repourl:
self.redirect(url_concat(
url_path_join(self.hub.server.base_url, 'spawn'), all_arguments
@@ -58,6 +87,11 @@ def get(self):
branch_name = user.spawner.branch_name
commit_sha = user.spawner.commit_sha
repo_url = user.spawner.repo_url
+
+ if user.running and do_commit_container:
+ output_data = yield commit_container(self.request, user.spawner, self.log)
+ self.redirect(url_concat('/hub/home', output_data))
+
if user.running and getattr(user, 'login_service', '') == 'github':
if do_fork:
self.log.info('Will fork %s' % user.spawner.repo_url)
@@ -104,6 +138,7 @@ def get(self):
branch_name=branch_name,
commit_sha=commit_sha,
notify_message=notify_message,
+ notify_url_to_image=notify_url_to_image,
version=__version__,
g_analitics_id=g_id,
ya_metrica_id=ya_id
View
@@ -14,7 +14,8 @@
from traitlets import (
Integer,
Unicode,
- Int
+ Int,
+ Bool
)
from tornado import gen
from tornado.httpclient import HTTPError
@@ -251,12 +252,19 @@ def wait_up(self):
yield self.notify_about_fail(message)
raise e
+ share_user_images = Bool(default_value=True, config=True, help="If True, users will be able restore only own images")
@gen.coroutine
def build_image(self):
"""download the repo and build a docker image if needed"""
if self.form_repo_url.startswith('docker:'):
image_name = self.form_repo_url.replace('docker:', '')
+
+ if image_name.startswith('everware_image') and not self.user.admin and self.share_user_images:
+ images_user = image_name.split('/')[1]
+ if self.escaped_name != images_user:
+ raise Exception('Access denied. Image %s is not yours.' % image_name)
+
image = yield self.get_image(image_name)
if image is None:
raise Exception('Image %s doesn\'t exist' % image_name)
@@ -21,6 +21,7 @@
{% else %}
<p>You don't have a repository with the same name. Do you want to <a id="push" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--colored small-button" href="/hub/home?do_fork=1">fork</a> it?</p>
{% endif %}
+ <p>Also you can <a id="commit-container" class="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--colored small-button" href="/hub/home?do_commit_container=1">save container</a> to easily restore your work later.</p>
{% endif %}
</div>
</div>
@@ -70,12 +71,23 @@
>
{{notify_message}}
</div>
+ {% if notify_url_to_image %}
+ <div class="mdl-textfield mdl-js-textfield mdl-textfield--floating-label" style="width: 700px">
+ <input class="mdl-textfield__input" type="text" id="notify-url" value="{{notify_url_to_image}}" readonly>
+ <label class="mdl-textfield__label" for="notify-url">Your link to restore state</label>
+ </div>
+ <button class="mdl-button mdl-js-button mdl-button--icon notify-url--button" data-clipboard-target="#notify-url" title="Copy to clipboard">
+ <i class="material-icons">content_copy</i>
+ </button>
+ {% endif %}
</div>
{% endblock %}
{% block script %}
<script type="text/javascript">
- require(["home"]);
+ require(["home", "clipboard"], function (home, Clipboard) {
+ new Clipboard('.notify-url--button');
+ });
</script>
{% endblock %}
@@ -56,6 +56,7 @@ <h4 class="modal-title" id="{{key}}-label">{{title}}</h4>
jquery: '../components/jquery/jquery.min',
bootstrap: '../components/bootstrap/js/bootstrap.min',
moment: "../components/moment/moment",
+ clipboard: "../components/clipboard/dist/clipboard.min",
},
shim: {
bootstrap: {
@@ -23,8 +23,18 @@
Paste the link to the git repository you want to try out. If you
need some inspiration try one of the following repositories:
<ul>
- <li><a href="https://github.com/everware/everware-dimuon-example">https://github.com/everware/everware-dimuon-example</a></li>
- <li><a href="https://github.com/betatim/everware-demo">https://github.com/betatim/everware-demo</a></li>
+ <li>
+ <a id="clipboard-example-1" href="https://github.com/everware/everware-dimuon-example">https://github.com/everware/everware-dimuon-example</a>
+ <button class="mdl-button mdl-js-button mdl-button--icon clipboard-example--button" data-text-source="clipboard-example-1" title="Copy to form">
+ <i class="material-icons">content_copy</i>
+ </button>
+ </li>
+ <li>
+ <a id="clipboard-example-2" href="https://github.com/betatim/everware-demo">https://github.com/betatim/everware-demo</a>
+ <button class="mdl-button mdl-js-button mdl-button--icon clipboard-example--button" data-text-source="clipboard-example-2" title="Copy to form">
+ <i class="material-icons">content_copy</i>
+ </button>
+ </li>
</ul>
Read the documentation
to <a href="https://github.com/everware/everware/wiki/Being-everware-compatible">learn
@@ -49,6 +59,13 @@
return false;
}
});
+
+ $('.clipboard-example--button').click(function (e) {
+ var input = $('#repository_input');
+ var linkId = $(e.currentTarget).attr('data-text-source');
+ var href = $('#' + linkId).attr('href');
+ input.val(href).parent().addClass('is-focused');
+ });
});
</script>
{% endblock %}

0 comments on commit 3c0893a

Please sign in to comment.