|
15 | 15 | from django.conf import settings |
16 | 16 | from django.contrib.auth.models import User |
17 | 17 | from django.db import models |
| 18 | +from django.db.models.signals import post_save, post_delete |
18 | 19 | from django.dispatch import receiver |
19 | 20 | from django.dispatch.dispatcher import Signal |
20 | 21 | from django.utils.encoding import python_2_unicode_compatible |
@@ -435,22 +436,21 @@ def calculate(self): |
435 | 436 | """Calculate and update the application databag""" |
436 | 437 | d = {} |
437 | 438 | d['id'] = self.id |
438 | | - release = self.release_set.all().order_by('-created')[0] |
439 | 439 | d['release'] = {} |
440 | | - d['release']['version'] = release.version |
441 | | - d['release']['config'] = release.config.values |
442 | | - d['release']['image'] = release.image |
443 | | - d['release']['build'] = {} |
444 | | - if release.build: |
445 | | - d['release']['build']['url'] = release.build.url |
446 | | - d['release']['build']['procfile'] = release.build.procfile |
447 | | - # add collaborators TODO: add sharing |
| 440 | + releases = self.release_set.all().order_by('-created') |
| 441 | + if releases: |
| 442 | + release = releases[0] |
| 443 | + d['release']['version'] = release.version |
| 444 | + d['release']['config'] = release.config.values |
| 445 | + d['release']['image'] = release.image |
| 446 | + d['release']['build'] = {} |
| 447 | + if release.build: |
| 448 | + d['release']['build']['url'] = release.build.url |
| 449 | + d['release']['build']['procfile'] = release.build.procfile |
| 450 | + # TODO: add proper sharing and access controls |
448 | 451 | d['users'] = {} |
449 | 452 | for u in (self.owner.username,): |
450 | 453 | d['users'][u] = 'admin' |
451 | | -# # call a celery task to update the data bag |
452 | | -# if settings.CHEF_ENABLED: |
453 | | -# controller.update_application.delay(self.id, d).wait() # @UndefinedVariable |
454 | 454 | return d |
455 | 455 |
|
456 | 456 |
|
@@ -663,9 +663,8 @@ def push(cls, push): |
663 | 663 | # recalculate the formation databag including the new |
664 | 664 | # build and release |
665 | 665 | databag = formation.calculate() |
666 | | - # if enabled, force-converge all of the chef nodes |
667 | | - if settings.CONVERGE_ON_PUSH is True: |
668 | | - formation.converge(databag) |
| 666 | + # force-converge all of the chef nodes |
| 667 | + formation.converge(databag) |
669 | 668 | # return the databag object so the git-receive hook |
670 | 669 | # can tell the user about proxy URLs, etc. |
671 | 670 | return databag |
@@ -731,5 +730,57 @@ def new_release(sender, **kwargs): |
731 | 730 | return release |
732 | 731 |
|
733 | 732 |
|
| 733 | +def calculate(self): |
| 734 | + """ |
| 735 | + Calculate configuration management representation |
| 736 | + for this user account |
| 737 | + """ |
| 738 | + data = {'id': self.username, 'ssh_keys': {}} |
| 739 | + for k in self.key_set.all(): |
| 740 | + data['ssh_keys'][k.id] = k.public |
| 741 | + return data |
| 742 | + |
| 743 | +# attach to built-in django user |
| 744 | +User.calculate = calculate |
| 745 | + |
| 746 | +# define update/delete callbacks for synchronizing |
| 747 | +# models with the configuration management backend |
| 748 | + |
| 749 | + |
| 750 | +def update_user(sender, **kwargs): |
| 751 | + user = kwargs['instance'] |
| 752 | + tasks.publish_user.delay(user.username, user.calculate()).wait() |
| 753 | + |
| 754 | + |
| 755 | +def update_key(sender, **kwargs): |
| 756 | + user = kwargs['instance'].owner |
| 757 | + tasks.publish_user.delay(user.username, user.calculate()).wait() |
| 758 | + |
| 759 | + |
| 760 | +def update_app(sender, **kwargs): |
| 761 | + tasks.publish_app.delay(kwargs['instance'].id).wait() |
| 762 | + |
| 763 | + |
| 764 | +def delete_app(sender, **kwargs): |
| 765 | + tasks.purge_app.delay(kwargs['instance'].id).wait() |
| 766 | + |
| 767 | + |
| 768 | +def update_formation(sender, **kwargs): |
| 769 | + tasks.publish_formation.delay(kwargs['instance'].id).wait() |
| 770 | + |
| 771 | + |
| 772 | +def delete_formation(sender, **kwargs): |
| 773 | + tasks.purge_formation.delay(kwargs['instance'].id).wait() |
| 774 | + |
| 775 | +# use django signals to synchronize database updates with |
| 776 | +# the configuration management backend |
| 777 | +post_save.connect(update_user, sender=User) |
| 778 | +post_save.connect(update_key, sender=Key) |
| 779 | +post_delete.connect(update_key, sender=Key) |
| 780 | +post_save.connect(update_app, sender=App) |
| 781 | +post_delete.connect(delete_app, sender=App) |
| 782 | +post_save.connect(update_formation, sender=Formation) |
| 783 | +post_delete.connect(delete_formation, sender=Formation) |
| 784 | + |
734 | 785 | # import tasks after models are defined |
735 | 786 | from api import tasks |
0 commit comments