From 3700ee05bb90452e9266e43b553ef2a63dc0c507 Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Sun, 11 Nov 2018 23:03:46 +0530 Subject: [PATCH 1/8] Fix the failing domain deletion task --- readthedocs/core/symlink.py | 14 +++++++------- readthedocs/projects/models.py | 4 ++-- readthedocs/projects/tasks.py | 7 +++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index f3428d95d4a..3421b716c42 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -144,26 +144,26 @@ def symlink_cnames(self, domain=None): if domain: domains = [domain] else: - domains = Domain.objects.filter(project=self.project) + domains = (dom.domain for dom in Domain.objects.filter(project=self.project)) for dom in domains: - log_msg = 'Symlinking CNAME: {0} -> {1}'.format(dom.domain, self.project.slug) + log_msg = 'Symlinking CNAME: {0} -> {1}'.format(dom, self.project.slug) log.info(constants.LOG_TEMPLATE.format(project=self.project.slug, version='', msg=log_msg)) # CNAME to doc root - symlink = os.path.join(self.CNAME_ROOT, dom.domain) + symlink = os.path.join(self.CNAME_ROOT, dom) run(['ln', '-nsf', self.project_root, symlink]) # Project symlink - project_cname_symlink = os.path.join(self.PROJECT_CNAME_ROOT, dom.domain) + project_cname_symlink = os.path.join(self.PROJECT_CNAME_ROOT, dom) run(['ln', '-nsf', self.project.doc_path, project_cname_symlink]) - def remove_symlink_cname(self, domain): + def remove_symlink_cname(self, domain_str): """Remove CNAME symlink.""" - log_msg = "Removing symlink for CNAME {0}".format(domain.domain) + log_msg = "Removing symlink for CNAME {0}".format(domain_str) log.info(constants.LOG_TEMPLATE.format(project=self.project.slug, version='', msg=log_msg)) - symlink = os.path.join(self.CNAME_ROOT, domain.domain) + symlink = os.path.join(self.CNAME_ROOT, domain_str) safe_unlink(symlink) def symlink_subprojects(self): diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 78523387234..27fb86558ea 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -1024,12 +1024,12 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ self.domain = parsed.path super(Domain, self).save(*args, **kwargs) broadcast(type='app', task=tasks.symlink_domain, - args=[self.project.pk, self.pk],) + args=[self.project.pk, self.domain],) def delete(self, *args, **kwargs): # pylint: disable=arguments-differ from readthedocs.projects import tasks broadcast(type='app', task=tasks.symlink_domain, - args=[self.project.pk, self.pk, True],) + args=[self.project.pk, self.domain, True],) super(Domain, self).delete(*args, **kwargs) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index 7dd35b72a06..831535a9ac8 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -1002,15 +1002,14 @@ def symlink_project(project_pk): @app.task(queue='web') -def symlink_domain(project_pk, domain_pk, delete=False): +def symlink_domain(project_pk, domain_str, delete=False): project = Project.objects.get(pk=project_pk) - domain = Domain.objects.get(pk=domain_pk) for symlink in [PublicSymlink, PrivateSymlink]: sym = symlink(project=project) if delete: - sym.remove_symlink_cname(domain) + sym.remove_symlink_cname(domain_str) else: - sym.symlink_cnames(domain) + sym.symlink_cnames(domain_str) @app.task(queue='web') From 450fd0f34504764d32d9249f4f341e08e04ac430 Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Sun, 11 Nov 2018 23:17:27 +0530 Subject: [PATCH 2/8] Move import to the top of the file --- readthedocs/projects/models.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 27fb86558ea..fcba94f17cf 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -34,6 +34,7 @@ from readthedocs.restapi.client import api from readthedocs.vcs_support.backends import backend_cls from readthedocs.vcs_support.utils import Lock, NonBlockingLock +from readthedocs.projects import tasks log = logging.getLogger(__name__) @@ -308,7 +309,6 @@ def sync_supported_versions(self): verbose_name=LATEST_VERBOSE_NAME).update(supported=True) def save(self, *args, **kwargs): # pylint: disable=arguments-differ - from readthedocs.projects import tasks first_save = self.pk is None if not self.slug: # Subdomains can't have underscores in them. @@ -1016,7 +1016,6 @@ def __str__(self): return '{domain} pointed at {project}'.format(domain=self.domain, project=self.project.name) def save(self, *args, **kwargs): # pylint: disable=arguments-differ - from readthedocs.projects import tasks parsed = urlparse(self.domain) if parsed.scheme or parsed.netloc: self.domain = parsed.netloc @@ -1027,7 +1026,6 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ args=[self.project.pk, self.domain],) def delete(self, *args, **kwargs): # pylint: disable=arguments-differ - from readthedocs.projects import tasks broadcast(type='app', task=tasks.symlink_domain, args=[self.project.pk, self.domain, True],) super(Domain, self).delete(*args, **kwargs) From ba068c5e64d1a614d36cc9d5903b3a3ddafaef6b Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Sun, 11 Nov 2018 23:26:47 +0530 Subject: [PATCH 3/8] move the imports back --- readthedocs/projects/models.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index fcba94f17cf..27fb86558ea 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -34,7 +34,6 @@ from readthedocs.restapi.client import api from readthedocs.vcs_support.backends import backend_cls from readthedocs.vcs_support.utils import Lock, NonBlockingLock -from readthedocs.projects import tasks log = logging.getLogger(__name__) @@ -309,6 +308,7 @@ def sync_supported_versions(self): verbose_name=LATEST_VERBOSE_NAME).update(supported=True) def save(self, *args, **kwargs): # pylint: disable=arguments-differ + from readthedocs.projects import tasks first_save = self.pk is None if not self.slug: # Subdomains can't have underscores in them. @@ -1016,6 +1016,7 @@ def __str__(self): return '{domain} pointed at {project}'.format(domain=self.domain, project=self.project.name) def save(self, *args, **kwargs): # pylint: disable=arguments-differ + from readthedocs.projects import tasks parsed = urlparse(self.domain) if parsed.scheme or parsed.netloc: self.domain = parsed.netloc @@ -1026,6 +1027,7 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ args=[self.project.pk, self.domain],) def delete(self, *args, **kwargs): # pylint: disable=arguments-differ + from readthedocs.projects import tasks broadcast(type='app', task=tasks.symlink_domain, args=[self.project.pk, self.domain, True],) super(Domain, self).delete(*args, **kwargs) From 8441a0c92f6fea1cf8a7be51568057bcb568957b Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Mon, 12 Nov 2018 17:19:30 +0530 Subject: [PATCH 4/8] Change genertor expression to list comprehension --- readthedocs/core/symlink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index 3421b716c42..197c231c847 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -144,7 +144,7 @@ def symlink_cnames(self, domain=None): if domain: domains = [domain] else: - domains = (dom.domain for dom in Domain.objects.filter(project=self.project)) + domains = [dom.domain for dom in Domain.objects.filter(project=self.project)] for dom in domains: log_msg = 'Symlinking CNAME: {0} -> {1}'.format(dom, self.project.slug) log.info(constants.LOG_TEMPLATE.format(project=self.project.slug, From 7bb45744611c5e3627ad5d2993c47de21e70fde4 Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Mon, 12 Nov 2018 23:13:46 +0530 Subject: [PATCH 5/8] remove list comprehension --- readthedocs/core/symlink.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index 197c231c847..b68d25ee364 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -144,7 +144,7 @@ def symlink_cnames(self, domain=None): if domain: domains = [domain] else: - domains = [dom.domain for dom in Domain.objects.filter(project=self.project)] + domains = Domain.objects.filter(project=self.project).values_list('domain', flat=True) for dom in domains: log_msg = 'Symlinking CNAME: {0} -> {1}'.format(dom, self.project.slug) log.info(constants.LOG_TEMPLATE.format(project=self.project.slug, From d2980f4cd60da00681391effd1df5b4cb67eb449 Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Tue, 13 Nov 2018 23:57:33 +0530 Subject: [PATCH 6/8] Revert back the argument name --- readthedocs/core/symlink.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index b68d25ee364..dff8958197f 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -158,12 +158,12 @@ def symlink_cnames(self, domain=None): project_cname_symlink = os.path.join(self.PROJECT_CNAME_ROOT, dom) run(['ln', '-nsf', self.project.doc_path, project_cname_symlink]) - def remove_symlink_cname(self, domain_str): + def remove_symlink_cname(self, domain): """Remove CNAME symlink.""" - log_msg = "Removing symlink for CNAME {0}".format(domain_str) + log_msg = "Removing symlink for CNAME {0}".format(domain) log.info(constants.LOG_TEMPLATE.format(project=self.project.slug, version='', msg=log_msg)) - symlink = os.path.join(self.CNAME_ROOT, domain_str) + symlink = os.path.join(self.CNAME_ROOT, domain) safe_unlink(symlink) def symlink_subprojects(self): From 5a1b32718d583ddbfcba65aa5b916461d1c8d6b7 Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Fri, 11 Jan 2019 00:00:51 +0530 Subject: [PATCH 7/8] remove dom.domain --- readthedocs/core/symlink.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index 1266ae1596f..d1157212a5c 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -154,7 +154,7 @@ def symlink_cnames(self, domain=None): domains = Domain.objects.filter(project=self.project).values_list('domain', flat=True) for dom in domains: log_msg = 'Symlinking CNAME: {} -> {}'.format( - dom.domain, self.project.slug + dom, self.project.slug ) log.info( constants.LOG_TEMPLATE.format( @@ -164,12 +164,12 @@ def symlink_cnames(self, domain=None): ) # CNAME to doc root - symlink = os.path.join(self.CNAME_ROOT, dom.domain) + symlink = os.path.join(self.CNAME_ROOT, dom) self.environment.run('ln', '-nsf', self.project_root, symlink) # Project symlink project_cname_symlink = os.path.join( - self.PROJECT_CNAME_ROOT, dom.domain + self.PROJECT_CNAME_ROOT, dom ) self.environment.run( 'ln', '-nsf', self.project.doc_path, project_cname_symlink From 205e53bb5334c7853bebe1eba63ab9960617812c Mon Sep 17 00:00:00 2001 From: dojutsu-user Date: Tue, 22 Jan 2019 11:01:27 +0530 Subject: [PATCH 8/8] add improvements --- readthedocs/core/symlink.py | 11 ++++++++--- readthedocs/projects/tasks.py | 14 +++++++++++--- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/readthedocs/core/symlink.py b/readthedocs/core/symlink.py index e6c0f0be623..6bd84a52c4b 100644 --- a/readthedocs/core/symlink.py +++ b/readthedocs/core/symlink.py @@ -183,14 +183,19 @@ def symlink_cnames(self, domain=None): ) def remove_symlink_cname(self, domain): - """Remove CNAME symlink.""" - log_msg = "Removing symlink for CNAME {}".format(domain) + """ + Remove CNAME symlink. + + :param domain: domain for which symlink is to be removed + :type domain: str + """ + log_msg = 'Removing symlink for CNAME {}'.format(domain) log.info( constants.LOG_TEMPLATE.format( project=self.project.slug, version='', msg=log_msg - ), + ), ) symlink = os.path.join(self.CNAME_ROOT, domain) safe_unlink(symlink) diff --git a/readthedocs/projects/tasks.py b/readthedocs/projects/tasks.py index c335a91be53..f61c9282813 100644 --- a/readthedocs/projects/tasks.py +++ b/readthedocs/projects/tasks.py @@ -1074,14 +1074,22 @@ def symlink_project(project_pk): @app.task(queue='web', throws=(BuildEnvironmentWarning,)) -def symlink_domain(project_pk, domain_str, delete=False): +def symlink_domain(project_pk, domain, delete=False): + """ + Symlink domain. + + :param project_pk: project's pk + :type project_pk: int + :param domain: domain for the symlink + :type domain: str + """ project = Project.objects.get(pk=project_pk) for symlink in [PublicSymlink, PrivateSymlink]: sym = symlink(project=project) if delete: - sym.remove_symlink_cname(domain_str) + sym.remove_symlink_cname(domain) else: - sym.symlink_cnames(domain_str) + sym.symlink_cnames(domain) @app.task(queue='web')