@@ -88,49 +88,6 @@ class Meta:
8888 abstract = True
8989
9090
91- @python_2_unicode_compatible
92- class Cluster (UuidAuditedModel ):
93- """
94- Cluster used to run jobs
95- """
96-
97- CLUSTER_TYPES = (('mock' , 'Mock Cluster' ),
98- ('coreos' , 'CoreOS Cluster' ),
99- ('chaos' , 'Chaos Cluster' ))
100-
101- owner = models .ForeignKey (settings .AUTH_USER_MODEL )
102- id = models .CharField (max_length = 128 , unique = True )
103- type = models .CharField (max_length = 16 , choices = CLUSTER_TYPES , default = 'coreos' )
104-
105- domain = models .CharField (max_length = 128 , validators = [validate_domain ])
106- hosts = models .CharField (max_length = 256 , validators = [validate_comma_separated ])
107- auth = models .TextField ()
108- options = JSONField (default = {}, blank = True )
109-
110- def __str__ (self ):
111- return self .id
112-
113- def _get_scheduler (self , * args , ** kwargs ):
114- module_name = 'scheduler.' + self .type
115- mod = importlib .import_module (module_name )
116- return mod .SchedulerClient (self .id , self .hosts , self .auth ,
117- self .domain , self .options )
118-
119- _scheduler = property (_get_scheduler )
120-
121- def create (self ):
122- """
123- Initialize a cluster's router and log aggregator
124- """
125- return self ._scheduler .setUp ()
126-
127- def destroy (self ):
128- """
129- Destroy a cluster's router and log aggregator
130- """
131- return self ._scheduler .tearDown ()
132-
133-
13491@python_2_unicode_compatible
13592class App (UuidAuditedModel ):
13693 """
@@ -139,7 +96,6 @@ class App(UuidAuditedModel):
13996
14097 owner = models .ForeignKey (settings .AUTH_USER_MODEL )
14198 id = models .SlugField (max_length = 64 , unique = True )
142- cluster = models .ForeignKey ('Cluster' )
14399 structure = JSONField (default = {}, blank = True , validators = [validate_app_structure ])
144100
145101 class Meta :
@@ -148,9 +104,20 @@ class Meta:
148104 def __str__ (self ):
149105 return self .id
150106
107+ def _get_scheduler (self , * args , ** kwargs ):
108+ module_name = 'scheduler.' + settings .SCHEDULER_MODULE
109+ mod = importlib .import_module (module_name )
110+
111+ return mod .SchedulerClient (settings .SCHEDULER_TARGET ,
112+ settings .SCHEDULER_AUTH ,
113+ settings .SCHEDULER_OPTIONS ,
114+ settings .SSH_PRIVATE_KEY )
115+
116+ _scheduler = property (_get_scheduler )
117+
151118 @property
152119 def url (self ):
153- return self .id + '.' + self . cluster . domain
120+ return self .id + '.' + settings . DEIS_DOMAIN
154121
155122 def log (self , message ):
156123 """Logs a message to the application's log file.
@@ -341,6 +308,12 @@ def logs(self):
341308
342309 def run (self , user , command ):
343310 """Run a one-off command in an ephemeral app container."""
311+
312+ # FIXME: remove the need for SSH private keys by using
313+ # a scheduler that supports one-off admin tasks natively
314+ if not settings .SSH_PRIVATE_KEY :
315+ raise EnvironmentError ('Support for admin commands is not configured' )
316+
344317 # TODO: add support for interactive shell
345318 msg = "{} runs '{}'" .format (user .username , command )
346319 log_event (self , msg )
@@ -420,7 +393,7 @@ def _get_job_id(self):
420393 _job_id = property (_get_job_id )
421394
422395 def _get_scheduler (self ):
423- return self .app .cluster . _scheduler
396+ return self .app ._scheduler
424397
425398 _scheduler = property (_get_scheduler )
426399
0 commit comments