99from __future__ import unicode_literals
1010import importlib
1111import json
12+ import os
13+ import yaml
1214
15+ from celery .canvas import group
1316from django .conf import settings
1417from django .db import models
1518from django .db .models .signals import post_save
1922from rest_framework .authtoken .models import Token
2023
2124from 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
2929scale_signal = Signal (providing_args = ['formation' , 'user' ])
3030release_signal = Signal (providing_args = ['formation' , 'user' ])
3131
32+
3233def 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):
700709def 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-
0 commit comments