Skip to content

Commit 868ebe1

Browse files
committed
fix(controller): resource status and binding
1 parent 2e965c5 commit 868ebe1

3 files changed

Lines changed: 46 additions & 54 deletions

File tree

rootfs/api/management/commands/measure_resources.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def handle(self, *args, **options):
1919
task_id = uuid.uuid4().hex
2020
logger.info(f"pushing {task_id} resources to workflow_manager when {timezone.now()}")
2121
resource_list = []
22-
for resource in Resource.objects.all():
22+
for resource in Resource.objects.filter(status="Ready"):
2323
resource_list.extend(resource.to_measurements(timestamp))
2424
if len(resource_list) % 1000 == 0:
2525
send_measurements.delay(resource_list)

rootfs/api/models/resource.py

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -194,53 +194,9 @@ def message(self):
194194
return ""
195195

196196
def retrieve(self, *args, **kwargs):
197-
update_flag = False
198-
if self.status != "Ready":
199-
try:
200-
resp_i = self._scheduler.svcat.get_instance(
201-
self.app.id, self.name).json()
202-
self.status = resp_i.get('status', {}).\
203-
get('lastConditionState')
204-
self.options = resp_i.get('spec', {}).get('parameters', {})
205-
update_flag = True
206-
except KubeException as e:
207-
logger.info("retrieve instance info error: {}".format(e))
208-
if self.binding != "Ready":
209-
try:
210-
# We raise an exception when a resource doesn't exist
211-
resp_b = self._scheduler.svcat.get_binding(
212-
self.app.id, self.name).json()
213-
self.binding = resp_b.get('status', {}).\
214-
get('lastConditionState')
215-
update_flag = True
216-
secret_name = resp_b.get('spec', {}).get('secretName')
217-
if secret_name:
218-
resp_s = self._scheduler.secret.get(
219-
self.app.id, secret_name).json()
220-
self.data = resp_s.get('data', {})
221-
update_flag = True
222-
except KubeException as e:
223-
logger.info("retrieve binding info error: {}".format(e))
224-
if update_flag is True:
197+
if self._retrieve_status() or self._retrieve_binding():
225198
self.save()
226-
return self.status == "Ready"
227-
228-
def detach_resource(self, *args, **kwargs):
229-
if self.binding != "Ready":
230-
try:
231-
resp_b = self._scheduler.svcat.get_binding(
232-
self.app.id, self.name).json()
233-
secret_name = resp_b.get('spec', {}).get('secretName')
234-
if secret_name:
235-
self._scheduler.secret.delete(self.app.id, secret_name)
236-
self._scheduler.svcat.delete_binding(
237-
self.app.id, self.name)
238-
except KubeException as e:
239-
logger.info("delete binding info error: {}".format(e))
240-
self.binding = None
241-
242-
if (self.status != "Ready") or (not self.binding):
243-
self.delete()
199+
return self.status == self.binding == "Ready"
244200

245201
def to_measurements(self, timestamp: float):
246202
return [{
@@ -252,3 +208,40 @@ def to_measurements(self, timestamp: float):
252208
"usage": 1,
253209
"timestamp": int(timestamp)
254210
}]
211+
212+
def _retrieve_status(self):
213+
changed = False
214+
try:
215+
response = self._scheduler.svcat.get_instance(
216+
self.app.id, self.name).json()
217+
status = response.get('status', {}).get('lastConditionState')
218+
options = response.get('spec', {}).get('parameters', {})
219+
if self.status != status:
220+
self.status = status
221+
changed = True
222+
if self.options != options:
223+
self.options = options
224+
changed = True
225+
except KubeException as e:
226+
logger.info("retrieve instance info error: {}".format(e))
227+
return changed
228+
229+
def _retrieve_binding(self):
230+
changed = False
231+
try:
232+
# We raise an exception when a resource doesn't exist
233+
response = self._scheduler.svcat.get_binding(self.app.id, self.name).json()
234+
binding = response.get('status', {}).get('lastConditionState')
235+
secret_name = response.get('spec', {}).get('secretName')
236+
if self.binding != binding:
237+
self.binding = binding
238+
changed = True
239+
if secret_name:
240+
response = self._scheduler.secret.get(self.app.id, secret_name).json()
241+
data = response.get('data', {})
242+
if self.data != data:
243+
self.data = data
244+
changed = True
245+
except KubeException as e:
246+
logger.info("retrieve binding info error: {}".format(e))
247+
return changed

rootfs/api/tasks.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ def retrieve_resource(resource):
2525
retrieve_resource.apply_async(args=(resource, ), countdown=30)
2626
elif t < 3600 * 12:
2727
retrieve_resource.apply_async(args=(resource, ), countdown=1800)
28-
else:
29-
resource.detach_resource()
3028
except (Exception, Resource.DoesNotExist) as e:
3129
signals.got_request_exception.send(sender=task_id)
3230
if isinstance(e, Resource.DoesNotExist):
@@ -110,21 +108,22 @@ def mount_app(app, user, volume):
110108

111109

112110
@shared_task(
113-
retry_kwargs={'max_retries': None}
111+
retry_kwargs={'max_retries': 3}
114112
)
115113
def downstream_model_owner(app, old_owner, new_owner):
116114
task_id = uuid.uuid4().hex
117115
signals.request_started.send(sender=task_id)
118116
try:
119117
for downstream_model in [
120-
models.appsettings.AppSettings, models.build.Build, models.certificate.Certificate,
121-
models.config.Config, models.domain.Domain, models.key.Key, models.release.Release,
122-
models.resource.Resource, models.tls.TLS, models.service.Service,
123-
models.volume.Volume, models.gateway.Gateway, models.gateway.Route]:
118+
models.appsettings.AppSettings, models.build.Build, models.config.Config,
119+
models.domain.Domain, models.release.Release, models.resource.Resource,
120+
models.tls.TLS, models.service.Service, models.volume.Volume,
121+
models.gateway.Gateway, models.gateway.Route]:
124122
downstream_model.objects.filter(owner=old_owner, app=app).update(owner=new_owner)
125123
app.owner = new_owner
126124
app.save()
127125
except Exception as e:
128126
signals.got_request_exception.send(sender=task_id)
127+
raise e
129128
else:
130129
signals.request_finished.send(sender=task_id)

0 commit comments

Comments
 (0)