1919from django .dispatch import receiver
2020from django .dispatch .dispatcher import Signal
2121from django .utils .encoding import python_2_unicode_compatible
22+ import etcd
2223from guardian .shortcuts import get_users_with_perms
2324from json_field .fields import JSONField # @UnusedImport
2425
2526from api import fields , tasks
2627from provider import import_provider_module
27- from utils import dict_diff
28+ from utils import dict_diff , fingerprint
2829
2930
3031logger = logging .getLogger (__name__ )
@@ -907,16 +908,6 @@ def _publish_to_cm(**kwargs):
907908 kwargs ['instance' ].publish ()
908909
909910
910- def _publish_user_to_cm (** kwargs ):
911- if kwargs .get ('update_fields' ) == frozenset (['last_login' ]):
912- return
913- kwargs ['instance' ].publish ()
914-
915-
916- def _purge_user_from_cm (** kwargs ):
917- kwargs ['instance' ].purge ()
918-
919-
920911def _log_build_created (** kwargs ):
921912 if kwargs .get ('created' ):
922913 build = kwargs ['instance' ]
@@ -934,13 +925,41 @@ def _log_config_updated(**kwargs):
934925 log_event (config .app , "Config {} updated" .format (config ))
935926
936927
928+ def _etcd_publish_key (** kwargs ):
929+ key = kwargs ['instance' ]
930+ _etcd_client .write ('/deis/builder/users/{}/{}' .format (
931+ key .owner .username , fingerprint (key .public )), key .public )
932+
933+
934+ def _etcd_purge_key (** kwargs ):
935+ key = kwargs ['instance' ]
936+ _etcd_client .delete ('/deis/builder/users/{}/{}' .format (
937+ key .owner .username , fingerprint (key .public )))
938+
939+
940+ def _etcd_purge_user (** kwargs ):
941+ username = kwargs ['instance' ].username
942+ _etcd_client .delete ('/deis/builder/users/{}' .format (username ), dir = True , recursive = True )
943+
944+
937945# Connect Django model signals
938946# Sync database updates with the configuration management backend
939947post_save .connect (_publish_to_cm , sender = App , dispatch_uid = 'api.models' )
940948post_save .connect (_publish_to_cm , sender = Formation , dispatch_uid = 'api.models' )
941- post_save .connect (_publish_user_to_cm , sender = User , dispatch_uid = 'api.models' )
942- post_delete .connect (_purge_user_from_cm , sender = User , dispatch_uid = 'api.models' )
943949# Log significant app-related events
944950post_save .connect (_log_build_created , sender = Build , dispatch_uid = 'api.models' )
945951post_save .connect (_log_release_created , sender = Release , dispatch_uid = 'api.models' )
946952post_save .connect (_log_config_updated , sender = Config , dispatch_uid = 'api.models' )
953+
954+ # wire up etcd publishing if we can connect
955+ try :
956+ _etcd_client = etcd .Client (host = settings .ETCD_HOST , port = int (settings .ETCD_PORT ))
957+ _etcd_client .get ('/deis' )
958+ except etcd .EtcdException :
959+ logger .log (logging .WARNING , 'Cannot synchronize with etcd cluster' )
960+ _etcd_client = None
961+
962+ if _etcd_client :
963+ post_save .connect (_etcd_publish_key , sender = Key , dispatch_uid = 'api.models' )
964+ post_delete .connect (_etcd_purge_key , sender = Key , dispatch_uid = 'api.models' )
965+ post_delete .connect (_etcd_purge_user , sender = User , dispatch_uid = 'api.models' )
0 commit comments