Nextdoor / ndscheduler

A flexible python library for building your own cron-like system, with REST APIs and a Web UI.
BSD 2-Clause "Simplified" License
1.08k stars 202 forks source link

ImportError: No module named corescheduler #72

Open pavelsr opened 4 years ago

pavelsr commented 4 years ago

I'd like to implement custom job class (same as ShellJob but which run only once)

I made a class:

"""A job to run executable programs ONLY ONCE."""

from subprocess import call

from ndscheduler.corescheduler import job

class ShellJobOnce(job.JobBase):

    @classmethod
    def meta_info(cls):
        return {
            'job_class_string': '%s.%s' % (cls.__module__, cls.__name__),
            'notes': ('This will run an executable program ONLY ONCE. You can specify as many '
                      'arguments as you want. This job will pass these arguments to the '
                      'program in order.'),
            'arguments': [
                {'type': 'string', 'description': 'Executable path'}
            ],
            'example_arguments': '["/usr/local/telegram_notify.pl", "user_id", "arg2"]'
        }

    def run(self, *args, **kwargs):
        code = call(args)
        self.scheduler_manager.pause_job(self.job_id);
        #self.scheduler_manager.remove_job(self.job_id);
        return {'returncode': code}

if __name__ == "__main__":
    # You can easily test this job here
    job = ShellJobOnce.create_test_instance()
    job.run('at', '-h')

and run NDScheduler using docker-compose like:

version: '2'

services:
    scheduler:
        image: wenbinf/ndscheduler
        volumes:
        - "${PWD}/python/shell_job.py:/mnt/scheduler/src/ndscheduler/simple_scheduler/jobs/shell_job.py"
        ports:
        - "8888:8888"

After that I get at http://localhost:8888/

Traceback (most recent call last):
  File "/mnt/scheduler/local/lib/python2.7/site-packages/tornado/web.py", line 1443, in _execute
    result = method(*self.path_args, **self.path_kwargs)
  File "/mnt/scheduler/src/ndscheduler/ndscheduler/server/handlers/index.py", line 16, in get
    meta_info = utils.get_all_available_jobs()
  File "/mnt/scheduler/src/ndscheduler/ndscheduler/utils.py", line 155, in get_all_available_jobs
    job_module = importlib.import_module('%s.%s' % (job_class_package, module_name))
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/mnt/scheduler/src/ndscheduler/simple_scheduler/jobs/shell_job_once.py", line 5, in <module>
    from ndscheduler.corescheduler import job
ImportError: No module named corescheduler

Could you please explain me why such happened?

My module has same import from ndscheduler.corescheduler import job sting as original ShellJob

P.S. Even if I mount same ShellJob module with same content inside wenbinf/ndscheduler container I got same error.

tvoikoteika228 commented 4 years ago

It's problem in docker image

If you try to download latest version of wenbinf/ndscheduler, somehow you get not the same as you see in this git.

I've re-downloaded image 3 times and all 3 times I got same string in original shell_job.py:

from ndscheduler import job

instead of

from ndscheduler.corescheduler import job

All of 5 classes have this import:

apns_job.py: from ndscheduler import job
curl_job.py: from ndscheduler import job
sample_job.py: from ndscheduler import job
shell_job.py: from ndscheduler import job
slack_job.py: from ndscheduler import job

Thus, your solution is simple: Replace from ndscheduler.coresheduler import job to from ndscheduler import job in your shell_job.py

pavelsr commented 4 years ago

@tvoikoteika228 you are absolutely right

$ docker run -it wenbinf/ndscheduler bash -c "cd /mnt/scheduler/src/ndscheduler/.git && git log -1"
commit 5b1f5bf62c5cb6e247ad45a5b2acd50723fd87c3
Author: Aaron Webber <1557636+sabw8217@users.noreply.github.com>
Date:   Fri Dec 14 15:42:07 2018 -0800

    Remove reference to LLVM.

    It's not like LLVM.

So docker version is corresponding to commit 5b1f5bf62c5cb6e247ad45a5b2acd50723fd87c3, made 15 Dec 2018

And latest commit in master branch is c7100c02a8df3998ca882865b1b902d8951b764b ( Aug 23, 2019 )