Skip to content

Commit bd47d28

Browse files
committed
fix(app): property object is not iterable
1 parent 8b95388 commit bd47d28

14 files changed

Lines changed: 115 additions & 115 deletions

File tree

rootfs/api/models/app.py

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ def save(self, *args, **kwargs):
9696
self.release_set.latest()
9797
except Release.DoesNotExist:
9898
try:
99-
if self._scheduler.ns.get(self.id).status_code == 200:
99+
if self.scheduler().ns.get(self.id).status_code == 200:
100100
# Namespace already exists
101101
err = "{} already exists as a namespace in this kuberenetes setup".format(self.id) # noqa
102102
self.log(err, logging.INFO)
@@ -151,10 +151,10 @@ def create(self, *args, **kwargs): # noqa
151151
self.log('creating Namespace {} and services'.format(namespace), level=logging.DEBUG)
152152
# Create essential resources
153153
try:
154-
self._scheduler.ns.get(namespace)
154+
self.scheduler().ns.get(namespace)
155155
except KubeException:
156156
try:
157-
self._scheduler.ns.create(namespace)
157+
self.scheduler().ns.create(namespace)
158158
except KubeException as e:
159159
raise ServiceUnavailable('Could not create the Namespace in Kubernetes') from e
160160

@@ -163,21 +163,21 @@ def create(self, *args, **kwargs): # noqa
163163
self.log('creating Quota {} for namespace {}'.format(quota_name, namespace),
164164
level=logging.DEBUG)
165165
try:
166-
self._scheduler.quota.get(namespace, quota_name)
166+
self.scheduler().quota.get(namespace, quota_name)
167167
except KubeException:
168-
self._scheduler.quota.create(namespace, quota_name, spec=quota_spec)
168+
self.scheduler().quota.create(namespace, quota_name, spec=quota_spec)
169169
if settings.KUBERNETES_NAMESPACE_DEFAULT_LIMIT_RANGES_SPEC != '':
170170
limits_spec = json.loads(settings.KUBERNETES_NAMESPACE_DEFAULT_LIMIT_RANGES_SPEC)
171171
self.log('creating LimitRanges {} for namespace {}'.format(limits_name, namespace),
172172
level=logging.DEBUG)
173173
try:
174-
self._scheduler.limits.get(namespace, limits_name)
174+
self.scheduler().limits.get(namespace, limits_name)
175175
except KubeException:
176-
self._scheduler.limits.create(namespace, limits_name, spec=limits_spec)
176+
self.scheduler().limits.create(namespace, limits_name, spec=limits_spec)
177177
except KubeException as e:
178178
# Blow it all away only if something horrible happens
179179
try:
180-
self._scheduler.ns.delete(namespace)
180+
self.scheduler().ns.delete(namespace)
181181
except KubeException as e:
182182
# Just feed into the item below
183183
raise ServiceUnavailable('Could not delete the Namespace in Kubernetes') from e
@@ -197,15 +197,15 @@ def delete(self, *args, **kwargs):
197197
self.log("deleting environment")
198198
try:
199199
# check if namespace exists
200-
self._scheduler.ns.get(self.id)
200+
self.scheduler().ns.get(self.id)
201201

202202
try:
203-
self._scheduler.ns.delete(self.id)
203+
self.scheduler().ns.delete(self.id)
204204

205205
# wait 30 seconds for termination
206206
for _ in range(30):
207207
try:
208-
self._scheduler.ns.get(self.id)
208+
self.scheduler().ns.get(self.id)
209209
except KubeHTTPException as e:
210210
# only break out on a 404
211211
if e.response.status_code == 404:
@@ -240,7 +240,7 @@ def restart(self, **kwargs): # noqa
240240
try:
241241
tasks = [
242242
functools.partial(
243-
self._scheduler.deployment.restart,
243+
self.scheduler().deployment.restart,
244244
self.id,
245245
deployment
246246
) for deployment in deployments
@@ -332,7 +332,7 @@ def deploy(self, release, force_deploy=False, rollback_on_failure=True): # noqa
332332
# gather all proc types to be deployed
333333
tasks = [
334334
functools.partial(
335-
self._scheduler.deploy,
335+
self.scheduler().deploy,
336336
namespace=self.id,
337337
name=self._get_job_id(scale_type, release.canary),
338338
image=release.image,
@@ -403,12 +403,12 @@ def cleanup_old(self):
403403
names.append(self._get_job_id(scale_type, True))
404404
names.append(self._get_job_id(scale_type, False))
405405
labels = {'heritage': 'drycc'}
406-
deployments = self._scheduler.deployments.get(self.id, labels=labels).json()["items"]
406+
deployments = self.scheduler().deployments.get(self.id, labels=labels).json()["items"]
407407
if deployments is not None:
408408
for deployment in deployments:
409409
name = deployment['metadata']['name']
410410
if name not in names:
411-
self._scheduler.deployments.delete(self.id, name, True)
411+
self.scheduler().deployments.delete(self.id, name, True)
412412
self.log(f"cleanup old kubernetes deployments for {self.id}")
413413

414414
@backoff.on_exception(backoff.expo, ServiceUnavailable, max_tries=3)
@@ -464,7 +464,7 @@ def pod_name(size=5, chars=string.ascii_lowercase + string.digits):
464464
self.log("{} on {} runs '{}'".format(user.username, name, command))
465465

466466
try:
467-
exit_code, output = self._scheduler.run(
467+
exit_code, output = self.scheduler().run(
468468
self.id,
469469
name,
470470
release.image,
@@ -485,9 +485,9 @@ def list_pods(self, *args, **kwargs):
485485

486486
# in case a singular pod is requested
487487
if 'name' in kwargs:
488-
pods = [self._scheduler.pod.get(self.id, kwargs['name']).json()]
488+
pods = [self.scheduler().pod.get(self.id, kwargs['name']).json()]
489489
else:
490-
pods = self._scheduler.pod.get(self.id, labels=labels).json()['items']
490+
pods = self.scheduler().pod.get(self.id, labels=labels).json()['items']
491491
if not pods:
492492
pods = []
493493

@@ -498,14 +498,14 @@ def list_pods(self, *args, **kwargs):
498498
if labels['type'] == 'run':
499499
continue
500500

501-
state = str(self._scheduler.pod.state(p))
501+
state = str(self.scheduler().pod.state(p))
502502

503503
# follows kubelete convention - these are hidden unless show-all is set
504504
if state in ['down', 'crashed']:
505505
continue
506506

507507
# hide pod if it is passed the graceful termination period
508-
if self._scheduler.pod.deleted(p):
508+
if self.scheduler().pod.deleted(p):
509509
continue
510510

511511
item = {}
@@ -544,16 +544,16 @@ def autoscale(self, proc_type, autoscale):
544544

545545
try:
546546
# get the target for autoscaler, in this case Deployment
547-
self._scheduler.hpa.get(self.id, name)
547+
self.scheduler().hpa.get(self.id, name)
548548
if autoscale is None:
549-
self._scheduler.hpa.delete(self.id, name)
549+
self.scheduler().hpa.delete(self.id, name)
550550
else:
551-
self._scheduler.hpa.update(
551+
self.scheduler().hpa.update(
552552
self.id, name, proc_type, target, **autoscale
553553
)
554554
except KubeHTTPException as e:
555555
if e.response.status_code == 404:
556-
self._scheduler.hpa.create(
556+
self.scheduler().hpa.create(
557557
self.id, name, proc_type, target, **autoscale
558558
)
559559
else:
@@ -571,16 +571,16 @@ def image_pull_secret(self, namespace, registry, image):
571571
elif create:
572572
data = {'.dockerconfigjson': docker_config}
573573
try:
574-
self._scheduler.secret.get(namespace, name)
574+
self.scheduler().secret.get(namespace, name)
575575
except KubeHTTPException:
576-
self._scheduler.secret.create(
576+
self.scheduler().secret.create(
577577
namespace,
578578
name,
579579
data,
580580
secret_type='kubernetes.io/dockerconfigjson'
581581
)
582582
else:
583-
self._scheduler.secret.update(
583+
self.scheduler().secret.update(
584584
namespace,
585585
name,
586586
data,
@@ -611,11 +611,11 @@ def set_application_config(self, release):
611611

612612
secret_name = "{}-{}-env".format(self.id, version)
613613
try:
614-
self._scheduler.secret.get(self.id, secret_name)
614+
self.scheduler().secret.get(self.id, secret_name)
615615
except KubeHTTPException:
616-
self._scheduler.secret.create(self.id, secret_name, secrets_env, labels=labels)
616+
self.scheduler().secret.create(self.id, secret_name, secrets_env, labels=labels)
617617
else:
618-
self._scheduler.secret.update(self.id, secret_name, secrets_env, labels=labels)
618+
self.scheduler().secret.update(self.id, secret_name, secrets_env, labels=labels)
619619

620620
def to_measurements(self, timestamp: float):
621621
measurements = []
@@ -710,14 +710,14 @@ def _mount(self, user, volume, release, app_settings, structure=None):
710710
volume for volume in volumes if scale_type in volume.path.keys()]
711711
data = self._gather_app_settings(
712712
release, app_settings, scale_type, replicas, volumes=scale_type_volumes)
713-
deployment = self._scheduler.deployment.get(
713+
deployment = self.scheduler().deployment.get(
714714
self.id, self._get_job_id(scale_type, release.canary)).json()
715715
spec_annotations = deployment['spec']['template']['metadata'].get(
716716
'annotations', {})
717717
# gather volume proc types to be deployed
718718
tasks.append(
719719
functools.partial(
720-
self._scheduler.deployment.patch,
720+
self.scheduler().deployment.patch,
721721
namespace=self.id,
722722
name=self._get_job_id(scale_type, release.canary),
723723
image=release.image,
@@ -793,7 +793,7 @@ def _scale_pods(self, scale_types, release, app_settings):
793793
# gather all proc types to be deployed
794794
tasks.append(
795795
functools.partial(
796-
self._scheduler.scale,
796+
self.scheduler().scale,
797797
namespace=self.id,
798798
name=self._get_job_id(scale_type, release.canary),
799799
image=release.image,
@@ -935,7 +935,7 @@ def _check_deployment_in_progress(self, deploys, release, force_deploy=False):
935935
for scale_type, kwargs in deploys.items():
936936
name = self._get_job_id(scale_type, release.canary)
937937
# Is there an existing deployment in progress?
938-
in_progress, deploy_okay = self._scheduler.deployment.in_progress(
938+
in_progress, deploy_okay = self.scheduler().deployment.in_progress(
939939
self.id, name, kwargs.get("deploy_timeout"), kwargs.get("deploy_batches"),
940940
kwargs.get("replicas"), kwargs.get("tags")
941941
)
@@ -1013,7 +1013,7 @@ def _get_private_registry_config(self, image, registry=None):
10131013
username = registry.get('username')
10141014
password = registry.get('password')
10151015
elif settings.REGISTRY_LOCATION == 'off-cluster':
1016-
secret = self._scheduler.secret.get(
1016+
secret = self.scheduler().secret.get(
10171017
settings.WORKFLOW_NAMESPACE, 'registry-secret').json()
10181018
username = secret['data']['username']
10191019
password = secret['data']['password']

rootfs/api/models/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ class Meta:
1919
"""Mark :class:`AuditedModel` as abstract."""
2020
abstract = True
2121

22-
@property
23-
def _scheduler(self):
22+
@classmethod
23+
def scheduler(cls):
2424
mod = importlib.import_module(settings.SCHEDULER_MODULE)
2525
return mod.SchedulerClient(settings.SCHEDULER_URL, settings.K8S_API_VERIFY_TLS)
2626

rootfs/api/models/certificate.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,14 +204,14 @@ def attach_in_kubernetes(self, domain):
204204
'tls.key': self.key
205205
}
206206

207-
secret = self._scheduler.secret.get(namespace, name).json()['data']
207+
secret = self.scheduler().secret.get(namespace, name).json()['data']
208208
except KubeException:
209-
self._scheduler.secret.create(namespace, name, data)
209+
self.scheduler().secret.create(namespace, name, data)
210210
else:
211211
# update cert secret to the TLS Ingress format if required
212212
if secret != data:
213213
try:
214-
self._scheduler.secret.update(namespace, name, data)
214+
self.scheduler().secret.update(namespace, name, data)
215215
except KubeException as e:
216216
msg = 'There was a problem updating the certificate secret ' \
217217
'{} for {}'.format(name, namespace)
@@ -230,7 +230,7 @@ def detach(self, *args, **kwargs):
230230
if len(self.domains) == 0:
231231
try:
232232
# We raise an exception when a secret doesn't exist
233-
self._scheduler.secret.get(namespace, name)
234-
self._scheduler.secret.delete(namespace, name)
233+
self.scheduler().secret.get(namespace, name)
234+
self.scheduler().secret.delete(namespace, name)
235235
except KubeException as e:
236236
raise ServiceUnavailable("Could not delete certificate secret {} for application {}".format(name, namespace)) from e # noqa

rootfs/api/models/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ def set_tags(self, previous_config):
180180
return
181181

182182
# Get all nodes with label selectors
183-
nodes = self._scheduler.node.get(labels=self.tags).json()
183+
nodes = self.scheduler().node.get(labels=self.tags).json()
184184
if nodes['items']:
185185
return
186186

rootfs/api/models/gateway.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def listeners(self):
9090

9191
@property
9292
def addresses(self):
93-
data = self._scheduler.gateways.get(self.app.id, self.name, ignore_exception=True)
93+
data = self.scheduler().gateways.get(self.app.id, self.name, ignore_exception=True)
9494
if data.status_code != 200:
9595
return []
9696
addresses = data.json()["status"].get("addresses", [])
@@ -99,20 +99,20 @@ def addresses(self):
9999
def refresh_to_k8s(self):
100100
try:
101101
try:
102-
data = self._scheduler.gateways.get(self.app.id, self.name).json()
102+
data = self.scheduler().gateways.get(self.app.id, self.name).json()
103103
if len(self.listeners) > 0:
104-
self._scheduler.gateways.patch(self.app.id, self.name, **{
104+
self.scheduler().gateways.patch(self.app.id, self.name, **{
105105
"listeners": self.listeners,
106106
"gateway_class": settings.GATEWAY_CLASS,
107107
"version": data["metadata"]["resourceVersion"],
108108
})
109109
else:
110110
logger.debug("delete k8s resource when listeners are empty")
111-
self._scheduler.gateways.delete(
111+
self.scheduler().gateways.delete(
112112
self.app.id, self.name, ignore_exception=True)
113113
except KubeException:
114114
if len(self.listeners) > 0:
115-
self._scheduler.gateways.create(self.app.id, self.name, **{
115+
self.scheduler().gateways.create(self.app.id, self.name, **{
116116
"listeners": self.listeners,
117117
"gateway_class": settings.GATEWAY_CLASS,
118118
})
@@ -127,7 +127,7 @@ def save(self, *args, **kwargs):
127127

128128
def delete(self, *args, **kwargs):
129129
try:
130-
self._scheduler.gateways.delete(self.app.id, self.name, ignore_exception=False)
130+
self.scheduler().gateways.delete(self.app.id, self.name, ignore_exception=False)
131131
except KubeException:
132132
logger.log(
133133
msg='Kubernetes gateway cannot be deleted: {}'.format(self.name),
@@ -221,13 +221,13 @@ def refresh_to_k8s(self):
221221
self._https_enforced_to_k8s(http_parent_refs)
222222
elif self.kind == "HTTPRoute":
223223
parent_refs.extend(http_parent_refs)
224-
self._scheduler.httproute.delete(self.app.id, self._https_redirect_name)
224+
self.scheduler().httproute.delete(self.app.id, self._https_redirect_name)
225225
else:
226226
parent_refs.extend(http_parent_refs)
227227
self._refresh_to_k8s(self.current_rules, parent_refs)
228228
else:
229-
self._scheduler.httproute.delete(self.app.id, self.name)
230-
self._scheduler.httproute.delete(self.app.id, self._https_redirect_name)
229+
self.scheduler().httproute.delete(self.app.id, self.name)
230+
self.scheduler().httproute.delete(self.app.id, self._https_redirect_name)
231231

232232
def attach(self, gateway_name, port):
233233
ok, msg = self._check_parent(gateway_name, port)
@@ -257,7 +257,7 @@ def save(self, *args, **kwargs):
257257

258258
def delete(self, *args, **kwargs):
259259
try:
260-
k8s_route = getattr(self._scheduler, self.kind.lower())
260+
k8s_route = getattr(self.scheduler(), self.kind.lower())
261261
k8s_route.delete(self.app.id, self.name, ignore_exception=False)
262262
except KubeException:
263263
logger.log(
@@ -292,7 +292,7 @@ def _check_parent(self, gateway_name, port):
292292

293293
def _refresh_to_k8s(self, rules, parent_refs):
294294
try:
295-
k8s_route = getattr(self._scheduler, self.kind.lower())
295+
k8s_route = getattr(self.scheduler(), self.kind.lower())
296296
hostnames = [domain.domain for domain in self.app.domain_set.all()]
297297
try:
298298
data = k8s_route.get(self.app.id, self.name).json()
@@ -321,15 +321,15 @@ def _https_enforced_to_k8s(self, parent_refs):
321321
}
322322
try:
323323
try:
324-
data = self._scheduler.httproute.get(
324+
data = self.scheduler().httproute.get(
325325
self.app.id, self._https_redirect_name).json()
326-
self._scheduler.httproute.patch(self.app.id, self._https_redirect_name, **{
326+
self.scheduler().httproute.patch(self.app.id, self._https_redirect_name, **{
327327
"rules": rules,
328328
"parent_refs": parent_refs,
329329
"version": data["metadata"]["resourceVersion"],
330330
})
331331
except KubeException:
332-
self._scheduler.httproute.create(self.app.id, self._https_redirect_name, **{
332+
self.scheduler().httproute.create(self.app.id, self._https_redirect_name, **{
333333
"rules": rules,
334334
"parent_refs": parent_refs,
335335
})

0 commit comments

Comments
 (0)