Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Task management for DjangoZoom

This project contains two main packages:

  • dz.tasks, which provides callable celery tasks for various djangozoom functions
  • dz.tasklib, which contains the actual work logic for those tasks.

Tasks are managed using a network of celeryd workers, all speaking to a central AMQP (rabbitmq) server. The server layout looks like this:

  • usercontrol: runs rabbitmq. No celeryd processes.
  • build: runs celeryd -Q build (i.e. only looks at the "build" queue)
  • appserver: runs celeryd -Q all_appservers,appserver_<my_instance_id>
  • proxy: runs celeryd -Q proxy
  • database: runs celeryd -Q database

Each user-visible job, represented by the Job model in dz2.models, may reflect a set of other jobs executed across the above workers. The distinction between a Job and a task is that a Job is a user-visible (and usually, but not neccessarily, user-initiated) unit of work; a Job may involve one or many celery tasks.

Job: check_repo

This job is used during the setup of a brand new project. It checks out the code, does some parsing and snooping around in it, and provides a set of guesses about how the project should be configured in order to make the code buildable and deployable.

Sequence:
  • [usercontrol] user provides source code URL
  • [usercontrol] check_repo task issued (in queue "build")
  • [build] check_repo task executed
    • check out code
    • inspect code
    • write ConfigGuesses to DB via zoomdb
  • [usercontrol] on task completion, forward user to verification form

Job: build_and_deploy

This job creates a bundle corresponding to a newly built version of the project code and all known dependencies. The bundle is then uploaded to S3 and the database is updated with information about the new bundle. If necessary, a database is created for the project. The bundle is then deployed to an appserver, and post-build hooks (i.e. syncdb & migrate) are run on the appserver.

Sequence:
  • [usercontrol] user requests new build

  • [usercontrol] build_and_deploy task issued (in queue "build")
    • zoombuild.cfg attached (as job_params)
  • [build] build_bundle task enqueued and executed (as subtask of build_and_launch)

    • check out code
    • create virtualenv
    • install dependencies
    • verify can execute something simple, abort on importerror etc
    • archive bundle into tarball
    • enqueue create_database task (in parallel with bundle_upload below)
      • [db] create_database task executed (in parallel)
        • create database for app if needed
        • return db name, hostname, user (=sysid), password (random)
    • enqueue bundle_upload task (in parallel with create_database)
      • [build] upload bundle to S3
    • wait for create_database and bundle_upload to finish
    • enqueue and wait for placement task
      • [build] execute placement task
        • select appserver
          • initially choose from the list of length 1
          • later select based on continuously-updated load/health stats
        • return selected appserver ID
    • enqueue and wait for deploy task to selected appserver's queue
      • [appserver-<ID>] execute deploy task
        • download bundle from S3
        • create project user if needed
        • extract bundle
        • run bundle under cherrypy/gunicorn/whatevs
        • update DB with bundle deployment location
        • return hostname, port, and instance id where worker is running
    • process post-build hooks (maybe initially do this as part of deploy)
      • syncdb, migrate
    • enqueue proxy_update task to proxy queue
      • [proxy] execute proxy_update task
        • given app ID, virtual hostnames, appserver IP & port, (re)create nginx config entry for app
    • (later) execute rollback (or at least vhost rename) of other (old) bundle versions
    • w00t, report success & url to user!

About

DjangoZoom async management tasks

Resources

Stars

1 star

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages