Skip to content
This repository was archived by the owner on Nov 9, 2021. It is now read-only.

Commit 0b96479

Browse files
committed
Enhance ApplicationStatus based on presence of volumes
- ApplicationStatus inherits from enum.IntEnum to allow more comparison of statuses - Added function to get an application's volumes - When checking application status use volume presence to indicate previously-started apps. - My Applications View: Include previously started but not-running applcations. - Application template: Include a case for never started applications.
1 parent d33a0d2 commit 0b96479

File tree

4 files changed

+48
-16
lines changed

4 files changed

+48
-16
lines changed

puffin/core/applications.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,12 @@ def __hash__(self):
7575
return hash(self.application_id)
7676

7777

78-
class ApplicationStatus(enum.Enum):
79-
DELETED = 0
80-
CREATED = 10
78+
class ApplicationStatus(enum.IntEnum):
79+
ERROR = -1
80+
NEVER_STARTED = 0
81+
DELETED = 10
8182
UPDATING = 20
82-
ERROR = 90
83+
CREATED = 30
8384

8485

8586
class ApplicationSettings:
@@ -229,3 +230,9 @@ def update_application_settings(application_settings):
229230
elif application_settings.application_settings_id:
230231
db.session.delete(application_settings)
231232
db.session.commit()
233+
234+
def get_application_volume_names(user, application):
235+
application_name = get_application_name(user, application)
236+
compose_volumes = application.volumes
237+
application_volumes = ['{}_{}'.format(application_name, volume) for volume in compose_volumes]
238+
return application_volumes

puffin/core/docker.py

+33-11
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def get_client():
3535
return client
3636

3737
def create_application(client, user, application, async=True):
38-
if get_application_status(client, user, application) != applications.ApplicationStatus.DELETED:
38+
if get_application_status(client, user, application) > applications.ApplicationStatus.DELETED:
3939
raise RuntimeError("Application already installed or updating, user: {}, application: {}".format(user.login, application.application_id))
4040
name = applications.get_application_name(user, application)
4141

@@ -79,35 +79,43 @@ def run_service(user, application, service, *arguments, **environment):
7979

8080
def get_application_status(client, user, application):
8181
container = get_main_container(client, user, application)
82-
return _get_application_status(user, application, container)
82+
volumes = get_application_volumes(client, user, application)
83+
return _get_application_status(user, application, container, volumes)
8384

8485
def get_application_statuses(client, user):
8586
apps = applications.get_applications()
8687
application_statuses = []
8788
container_name = applications.get_application_name(user, None) + ".*_main_1"
8889
containers = get_containers(client, container_name)
89-
for container in containers:
90+
91+
def _app_id(container):
9092
user_application_id = _get_user_application_id(container)
9193
if not user_application_id:
92-
continue
93-
login, application_id = user_application_id
94+
return None
95+
_, application_id = user_application_id
96+
return application_id
9497

95-
application = apps.get(application_id)
96-
if not application:
98+
app_id_to_container = {_app_id(container): container for container in containers}
99+
for app_id, application in apps.items():
100+
if not app_id or app_id[0] == '_':
97101
continue
98-
99-
status = _get_application_status(user, application, container)
102+
container = app_id_to_container.get(app_id)
103+
volumes = get_application_volumes(client, user, application)
104+
status = _get_application_status(user, application, container, volumes)
100105
application_statuses.append((application, status))
106+
101107
return application_statuses
102108

103-
def _get_application_status(user, application, container):
109+
def _get_application_status(user, application, container, volumes=None):
104110
name = applications.get_application_name(user, application)
105111
if queue.task_exists(name):
106112
return applications.ApplicationStatus.UPDATING
107113
if container:
108114
return applications.ApplicationStatus.CREATED
109-
else:
115+
if volumes and any(vol is not None for vol in volumes.values()):
110116
return applications.ApplicationStatus.DELETED
117+
else:
118+
return applications.ApplicationStatus.NEVER_STARTED
111119

112120
def get_all_running_applications():
113121
apps = applications.get_applications()
@@ -167,6 +175,20 @@ def get_main_container(client, user, application):
167175
else:
168176
return None
169177

178+
def get_volumes(client, name=""):
179+
return {volume.name: volume for volume in client.volumes.list(filters={"name": name})}
180+
181+
def get_application_volumes(client, user, application):
182+
application_volume_names = applications.get_application_volume_names(user, application)
183+
184+
application_name = applications.get_application_name(user, application)
185+
docker_volumes = get_volumes(client, application_name)
186+
application_volumes = {
187+
application_volume: docker_volumes.get(application_volume)
188+
for application_volume in application_volume_names
189+
}
190+
return application_volumes
191+
170192
def wait_until_up(url, timeout=APPLICATION_CREATE_TIMEOUT):
171193
start_time = time.time()
172194
while True:

puffin/gui/view.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def application_status(application_id):
9595
def apps():
9696
client = docker.get_client()
9797
app_statuses = docker.get_application_statuses(client, current_user)
98-
apps = [a[0] for a in app_statuses if a[1] == applications.ApplicationStatus.CREATED]
98+
apps = [a[0] for a in app_statuses if a[1] != applications.ApplicationStatus.NEVER_STARTED]
9999
return flask.render_template('applications.html', applications=apps)
100100

101101
@app.route('/media/<path:path>')

puffin/templates/application.html

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ <h1>{{ application.name }}</h1>
5454
<button type="submit" name="start" value="Start" class="btn btn-success"><span class="glyphicon glyphicon-play"></span> Run</button>
5555
<a class="btn btn-info" role="button" href="{{ url_for("application_settings", application_id=application.application_id) }}"><span class="glyphicon glyphicon-cog"></span> Settings</a>
5656
<a class="btn btn-warning" role="button" href="{{ url_for("application_backup", application_id=application.application_id) }}"><span class="glyphicon glyphicon-hdd"></span> Backup</a>
57+
{% elif application_status == ApplicationStatus.NEVER_STARTED %}
58+
<button type="submit" name="start" value="Start" class="btn btn-success"><span class="glyphicon glyphicon-play"></span> Run</button>
59+
<a class="btn btn-info" role="button" href="{{ url_for("application_settings", application_id=application.application_id) }}"><span class="glyphicon glyphicon-cog"></span> Settings</a>
5760
{% elif application_status == ApplicationStatus.UPDATING %}
5861
<button type="button" class="btn btn-warning blinking"><span class="glyphicon glyphicon-refresh"></span> Updating</button>
5962
<script>

0 commit comments

Comments
 (0)