Skip to content

Commit 0187064

Browse files
author
Gabriel Monroy
committed
merging layout changes with current master re #34
2 parents c672ec4 + 2a14dc7 commit 0187064

44 files changed

Lines changed: 516 additions & 904 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coveragerc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[run]
2+
omit =
3+
*/venv/*
4+
*/virtualenv/*
5+
ignore_errors = True

.gitignore

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,11 @@ nosetests.xml
3939

4040
# Deis' config file
4141
deis/local_settings.py
42+
43+
# Misc.
44+
.DS_Store
45+
htmlcov/
46+
.ruby-version
4247
venv/
4348
.vagrant
44-
.ruby-version
45-
.DS_Store
4649

.travis.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ before_install:
1919

2020
install:
2121
- "pip install -r requirements.txt --use-mirrors"
22+
- "pip install coveralls --use-mirrors"
2223

2324
before_script:
2425
- "psql -c 'create database deis_testing;' -U postgres"
@@ -34,7 +35,11 @@ before_script:
3435
'PORT': '',
3536
}
3637
}
37-
SECRET_KEY = ')9$y9(@_r!+ai=ub)wsp2!!vs4i67x7ke9!jaljgf1_@rw421='
38+
SECRET_KEY = ')9$y9(@_r!+ai=ub)wsp2!!vsfaker7ke9!jaljgf1_@rw421='
3839
EOF
3940
40-
script: "make test"
41+
script:
42+
- coverage run manage.py test api celerytasks web
43+
44+
after_success:
45+
- coveralls

Makefile

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ all:
33

44
db:
55
python manage.py syncdb --noinput
6+
python manage.py migrate
67

78
test:
8-
python manage.py test api web
9+
python manage.py test api celerytasks web
910

10-
task:
11-
python manage.py test celerytasks
11+
coverage:
12+
coverage run manage.py test api celerytasks web
13+
coverage html
1214

13-
pep8:
14-
pep8 api celerytasks deis web
15-
16-
pyflakes:
17-
pyflakes api celerytasks deis web
15+
flake8:
16+
flake8

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,4 @@ Your PaaS. Your Rules.
66

77
Current status:
88
[![Build Status](https://travis-ci.org/opdemand/deis.png)](https://travis-ci.org/opdemand/deis)
9+
[![Coverage Status](https://coveralls.io/repos/opdemand/deis/badge.png?branch=master)](https://coveralls.io/r/opdemand/deis?branch=master)

api/fields.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ class ParamsField(JSONField):
8888
A text field that accepts a JSON object, used for storing provider
8989
API Parameters.
9090
"""
91+
pass
92+
9193

9294
class CloudInitField(YAMLField):
9395
"""
@@ -107,7 +109,7 @@ class NodeStatusField(JSONField):
107109

108110
try:
109111
from south.modelsinspector import add_introspection_rules
110-
# Tell the South schema migration tool to handle a UuidField.
112+
# Tell the South schema migration tool to handle our custom fields.
111113
add_introspection_rules([], [r'^api\.fields\.UuidField'])
112114
add_introspection_rules([], [r'^api\.fields\.EnvVarsField'])
113115
add_introspection_rules([], [r'^api\.fields\.DataBagField'])

api/migrations/0001_initial.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# -*- coding: utf-8 -*-
2+
3+
# flake8: noqa
4+
25
import datetime
36
from south.db import db
47
from south.v2 import SchemaMigration
@@ -459,4 +462,4 @@ def backwards(self, orm):
459462
}
460463
}
461464

462-
complete_apps = ['api']
465+
complete_apps = ['api']

api/migrations/0002_auto__del_field_flavor_ssh_username__del_field_flavor_ssh_private_key_.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
# -*- coding: utf-8 -*-
2+
3+
# flake8: noqa
4+
25
import datetime
36
from south.db import db
47
from south.v2 import SchemaMigration
@@ -248,4 +251,4 @@ def backwards(self, orm):
248251
}
249252
}
250253

251-
complete_apps = ['api']
254+
complete_apps = ['api']

api/models.py

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
from __future__ import unicode_literals
1010
import importlib
1111
import json
12+
import os
13+
import yaml
1214

15+
from celery.canvas import group
1316
from django.conf import settings
1417
from django.db import models
1518
from django.db.models.signals import post_save
@@ -19,18 +22,16 @@
1922
from rest_framework.authtoken.models import Token
2023

2124
from api import fields
22-
from celerytasks import chef, controller
23-
from celery.canvas import group
24-
import yaml
25-
import os.path
25+
from celerytasks import controller
2626

2727

2828
# define custom signals
2929
scale_signal = Signal(providing_args=['formation', 'user'])
3030
release_signal = Signal(providing_args=['formation', 'user'])
3131

32+
3233
def import_tasks(provider_type):
33-
"Return Celery tasks for a given provider type"
34+
"""Return Celery tasks for a given provider type"""
3435
try:
3536
tasks = importlib.import_module('celerytasks.'+provider_type)
3637
except ImportError as e:
@@ -199,15 +200,16 @@ def publish(self, **kwargs):
199200
'ssh_keys': {},
200201
'admins': [],
201202
'formations': {}
202-
}
203+
}
203204
# add all ssh keys on the system
204205
for key in Key.objects.all():
205-
key_id = '{0}_{1}'.format(key.owner.username, key.id)
206+
key_id = "{0}_{1}".format(key.owner.username, key.id)
206207
databag['ssh_keys'][key_id] = key.public
207208
# TODO: add sharing-based key lookup, for now just owner's keys
208209
for formation in formations:
209210
keys = databag['formations'][formation.id] = []
210-
owner_keys = [ '{0}_{1}'.format(k.owner.username, k.id) for k in formation.owner.key_set.all() ]
211+
owner_keys = ["{0}_{1}".format(
212+
k.owner.username, k.id) for k in formation.owner.key_set.all()]
211213
keys.extend(owner_keys)
212214
# call a celery task to update gitosis
213215
if settings.CHEF_ENABLED:
@@ -243,7 +245,7 @@ class Formation(UuidAuditedModel):
243245
id = models.SlugField(max_length=64)
244246
layers = fields.JSONField(default='{}', blank=True)
245247
containers = fields.JSONField(default='{}', blank=True)
246-
248+
247249
class Meta:
248250
unique_together = (('owner', 'id'),)
249251

@@ -325,7 +327,7 @@ def balance(self, **kwargs):
325327
if containers_balanced:
326328
self.converge(databag)
327329
return databag
328-
330+
329331
def _balance_containers(self, **kwargs):
330332
runtime_nodes = self.node_set.filter(layer__id='runtime').order_by('created')
331333
if len(runtime_nodes) < 2:
@@ -359,7 +361,7 @@ def _balance_containers(self, **kwargs):
359361
type=container_type,
360362
num=container_num,
361363
node=n_under)
362-
container_num +=1
364+
container_num += 1
363365
# delete the oldest container from the most over-utilized node
364366
c = n_over.container_set.filter(type=container_type).order_by('created')[0]
365367
c.delete()
@@ -369,10 +371,16 @@ def _balance_containers(self, **kwargs):
369371
n_map.setdefault(ct, []).append(n)
370372
changed = True
371373
return changed
372-
374+
373375
def __str__(self):
374376
return self.id
375-
377+
378+
def prepare_provider(self, *args, **kwargs):
379+
tasks = import_tasks(self.flavor.provider.type)
380+
args = (self.id, self.flavor.provider.creds.copy(),
381+
self.flavor.params.copy())
382+
return tasks.prepare_formation.subtask(args)
383+
376384
def calculate(self):
377385
"Return a Chef data bag item for this formation"
378386
release = self.release_set.all().order_by('-created')[0]
@@ -388,7 +396,7 @@ def calculate(self):
388396
d['release']['build']['procfile'] = release.build.procfile
389397
# calculate proxy
390398
d['proxy'] = {}
391-
d['proxy']['algorithm'] = 'round_robin'
399+
d['proxy']['algorithm'] = 'round_robin'
392400
d['proxy']['port'] = 80
393401
d['proxy']['backends'] = []
394402
# calculate container formation
@@ -397,7 +405,8 @@ def calculate(self):
397405
# all container types get an exposed port starting at 5001
398406
port = 5000 + c.num
399407
d['containers'].setdefault(c.type, {})
400-
d['containers'][c.type].update({ c.num: "{0}:{1}".format(c.node.id, port) })
408+
d['containers'][c.type].update(
409+
{c.num: "{0}:{1}".format(c.node.id, port)})
401410
# only proxy to 'web' containers
402411
if c.type == 'web':
403412
d['proxy']['backends'].append("{0}:{1}".format(c.node.fqdn, port))
@@ -628,7 +637,7 @@ class Config(UuidAuditedModel):
628637
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
629638
formation = models.ForeignKey('Formation')
630639
version = models.PositiveIntegerField(default=1)
631-
640+
632641
values = fields.EnvVarsField(default='{}', blank=True)
633642

634643
class Meta:
@@ -649,7 +658,7 @@ class Build(UuidAuditedModel):
649658
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
650659
formation = models.ForeignKey('Formation')
651660
version = models.PositiveIntegerField(default=1)
652-
661+
653662
sha = models.CharField('SHA', max_length=255, blank=True)
654663
output = models.TextField(blank=True)
655664

@@ -678,7 +687,7 @@ class Release(UuidAuditedModel):
678687
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
679688
formation = models.ForeignKey('Formation')
680689
version = models.PositiveIntegerField(default=1)
681-
690+
682691
config = models.ForeignKey('Config')
683692
image = models.CharField(max_length=256, default='ubuntu')
684693
# build only required for heroku-style apps
@@ -689,7 +698,7 @@ class Meta:
689698

690699
def __str__(self):
691700
return '{0}-v{1}'.format(self.formation.id, self.version)
692-
701+
693702
def rollback(self):
694703
# create a rollback log entry
695704
# call run
@@ -700,7 +709,7 @@ def rollback(self):
700709
def new_release(sender, **kwargs):
701710
formation, user = kwargs['formation'], kwargs['user']
702711
last_release = Release.objects.filter(
703-
formation=formation).order_by('-created')[0]
712+
formation=formation).order_by('-created')[0]
704713
image = kwargs.get('image', last_release.image)
705714
config = kwargs.get('config', last_release.config)
706715
build = kwargs.get('build', last_release.build)
@@ -776,4 +785,3 @@ def create_auth_token(sender, instance=None, created=False, **kwargs):
776785
if created:
777786
# pylint: disable=E1101
778787
Token.objects.create(user=instance)
779-

api/serializers.py

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@
55

66
from __future__ import unicode_literals
77

8+
from django.contrib.auth.models import User
89
from rest_framework import serializers
910

1011
from api import models, utils
1112

12-
from django.contrib.auth.models import User
13-
14-
1513

1614
class UserSerializer(serializers.ModelSerializer):
1715

@@ -20,8 +18,8 @@ class UserSerializer(serializers.ModelSerializer):
2018
class Meta:
2119
"""Metadata options for a UserSerializer."""
2220
model = User
23-
read_only_fields = ('is_superuser', 'is_staff', 'groups', 'user_permissions',
24-
'last_login', 'date_joined')
21+
read_only_fields = ('is_superuser', 'is_staff', 'groups',
22+
'user_permissions', 'last_login', 'date_joined')
2523

2624
@property
2725
def data(self):
@@ -63,7 +61,7 @@ class FlavorSerializer(serializers.ModelSerializer):
6361

6462
owner = serializers.Field(source='owner.username')
6563
provider = serializers.SlugRelatedField(slug_field='id')
66-
64+
6765
class Meta:
6866
"""Metadata options for a FlavorSerializer."""
6967
model = models.Flavor
@@ -76,9 +74,9 @@ class ConfigSerializer(serializers.ModelSerializer):
7674

7775
owner = serializers.Field(source='owner.username')
7876
formation = serializers.SlugRelatedField(slug_field='id')
79-
values = serializers.ModelField(model_field=models.Config()._meta.get_field('values'),
80-
required=False)
81-
77+
values = serializers.ModelField(
78+
model_field=models.Config()._meta.get_field('values'), required=False)
79+
8280
class Meta:
8381
"""Metadata options for a ConfigSerializer."""
8482
model = models.Config
@@ -91,7 +89,7 @@ class BuildSerializer(serializers.ModelSerializer):
9189

9290
owner = serializers.Field(source='owner.username')
9391
formation = serializers.SlugRelatedField(slug_field='id')
94-
92+
9593
class Meta:
9694
"""Metadata options for a BuildSerializer."""
9795
model = models.Build
@@ -106,7 +104,7 @@ class ReleaseSerializer(serializers.ModelSerializer):
106104
formation = serializers.SlugRelatedField(slug_field='id')
107105
config = serializers.SlugRelatedField(slug_field='uuid')
108106
build = serializers.SlugRelatedField(slug_field='uuid', required=False)
109-
107+
110108
class Meta:
111109
"""Metadata options for a ReleaseSerializer."""
112110
model = models.Release
@@ -119,7 +117,7 @@ class FormationSerializer(serializers.ModelSerializer):
119117

120118
owner = serializers.Field(source='owner.username')
121119
id = serializers.SlugField(default=utils.generate_app_name)
122-
120+
123121
class Meta:
124122
"""Metadata options for a FormationSerializer."""
125123
model = models.Formation
@@ -156,7 +154,7 @@ class NodeSerializer(serializers.ModelSerializer):
156154
owner = serializers.Field(source='owner.username')
157155
formation = serializers.SlugRelatedField(slug_field='id')
158156
layer = serializers.SlugRelatedField(slug_field='id')
159-
157+
160158
class Meta:
161159
"""Metadata options for a NodeSerializer."""
162160
model = models.Node
@@ -170,7 +168,7 @@ class ContainerSerializer(serializers.ModelSerializer):
170168
owner = serializers.Field(source='owner.username')
171169
formation = serializers.SlugRelatedField(slug_field='id')
172170
node = serializers.SlugRelatedField(slug_field='uuid')
173-
171+
174172
class Meta:
175173
"""Metadata options for a ContainerSerializer."""
176174
model = models.Container

0 commit comments

Comments
 (0)