From e4a97d060df5c6c5d8d086602bab3e178f74b065 Mon Sep 17 00:00:00 2001 From: yangdsh Date: Tue, 15 Oct 2019 18:03:24 +0000 Subject: [PATCH] add command resetwebsite --- .../{dumpknobtunability.py => dumpknob.py} | 8 +-- .../{loadknobtunability.py => loadknob.py} | 8 +-- .../management/commands/resetwebsite.py | 50 +++++++++++++++++++ .../website/management/commands/stopcelery.py | 2 +- server/website/website/models.py | 17 ++++--- 5 files changed, 70 insertions(+), 15 deletions(-) rename server/website/website/management/commands/{dumpknobtunability.py => dumpknob.py} (85%) rename server/website/website/management/commands/{loadknobtunability.py => loadknob.py} (85%) create mode 100644 server/website/website/management/commands/resetwebsite.py diff --git a/server/website/website/management/commands/dumpknobtunability.py b/server/website/website/management/commands/dumpknob.py similarity index 85% rename from server/website/website/management/commands/dumpknobtunability.py rename to server/website/website/management/commands/dumpknob.py index 19f032f..9e34945 100644 --- a/server/website/website/management/commands/dumpknobtunability.py +++ b/server/website/website/management/commands/dumpknob.py @@ -1,5 +1,5 @@ # -# OtterTune - dumpknobtunability.py +# OtterTune - dumpknob.py # # Copyright (c) 2017-18, Carnegie Mellon University Database Group # @@ -12,7 +12,7 @@ from website.models import Session, SessionKnob, SessionKnobManager class Command(BaseCommand): - help = 'Dump knob tunability for the session with the given upload code.' + help = 'Dump knobs for the session with the given upload code.' def add_arguments(self, parser): parser.add_argument( @@ -40,7 +40,7 @@ class Command(BaseCommand): raise CommandError( "ERROR: Session with upload code '{}' not exist.".format(options['uploadcode'])) - session_knobs = SessionKnobManager.get_knob_tunability(session) + session_knobs = SessionKnobManager.get_knob_min_max_tunability(session) filename = options['filename'] or 'knobs.json' path = os.path.join(directory, filename) @@ -49,4 +49,4 @@ class Command(BaseCommand): json.dump(session_knobs, f, indent=4) self.stdout.write(self.style.SUCCESS( - "Successfully dumped knob tunability to '{}'.".format(path))) + "Successfully dumped knob information to '{}'.".format(path))) diff --git a/server/website/website/management/commands/loadknobtunability.py b/server/website/website/management/commands/loadknob.py similarity index 85% rename from server/website/website/management/commands/loadknobtunability.py rename to server/website/website/management/commands/loadknob.py index 646c8bb..446368b 100644 --- a/server/website/website/management/commands/loadknobtunability.py +++ b/server/website/website/management/commands/loadknob.py @@ -1,5 +1,5 @@ # -# OtterTune - loadknobtunability.py +# OtterTune - loadknob.py # # Copyright (c) 2017-18, Carnegie Mellon University Database Group # @@ -12,7 +12,7 @@ from website.models import Session, SessionKnob, SessionKnobManager class Command(BaseCommand): - help = 'load session tunability for the session with the given upload code.' + help = 'load knobs for the session with the given upload code.' def add_arguments(self, parser): parser.add_argument( @@ -46,7 +46,7 @@ class Command(BaseCommand): with open(path, 'r') as f: knobs = json.load(f) - SessionKnobManager.set_knob_tunability(session, knobs) + SessionKnobManager.set_knob_min_max_tunability(session, knobs) self.stdout.write(self.style.SUCCESS( - "Successfully load knob tunability from '{}'.".format(path))) + "Successfully load knob information from '{}'.".format(path))) diff --git a/server/website/website/management/commands/resetwebsite.py b/server/website/website/management/commands/resetwebsite.py new file mode 100644 index 0000000..fecf1c3 --- /dev/null +++ b/server/website/website/management/commands/resetwebsite.py @@ -0,0 +1,50 @@ +# +# OtterTune - resetwebsite.py +# +# Copyright (c) 2017-18, Carnegie Mellon University Database Group +# +from django.core.management.base import BaseCommand +from fabric.api import local +from website.settings import DATABASES + + +class Command(BaseCommand): + help = 'dump the website; reset the website; load data from file if specified.' + + def add_arguments(self, parser): + parser.add_argument( + '-d', '--dumpfile', + metavar='FILE', + help='Name of the file to dump data to. ' + 'Default: dump_website.json') + parser.add_argument( + '-l', '--loadfile', + metavar='FILE', + help='Name of the file to load data from. ') + + def reset_website(self): + # WARNING: destroys the existing website and creates with all + # of the required inital data loaded (e.g., the KnobCatalog) + + # Recreate the ottertune database + user = DATABASES['default']['USER'] + passwd = DATABASES['default']['PASSWORD'] + name = DATABASES['default']['NAME'] + local("mysql -u {} -p{} -N -B -e \"DROP DATABASE IF EXISTS {}\"".format( + user, passwd, name)) + local("mysql -u {} -p{} -N -B -e \"CREATE DATABASE {}\"".format( + user, passwd, name)) + + # Reinitialize the website + local('python manage.py migrate') + + def handle(self, *args, **options): + dumpfile = options['dumpfile'] if options['dumpfile'] else 'dump_website.json' + local("python manage.py dumpdata admin auth django_db_logger djcelery sessions\ + sites website > {}".format(dumpfile)) + self.reset_website() + if options['loadfile']: + local("python manage.py loaddata '{}'".format(options['loadfile'])) + + self.stdout.write(self.style.SUCCESS( + "Successfully reset website.")) diff --git a/server/website/website/management/commands/stopcelery.py b/server/website/website/management/commands/stopcelery.py index 0eef50f..c1091fb 100644 --- a/server/website/website/management/commands/stopcelery.py +++ b/server/website/website/management/commands/stopcelery.py @@ -11,7 +11,7 @@ from fabric.api import local class Command(BaseCommand): - help = 'Start celery and celerybeat in the background.' + help = 'Stop celery and celerybeat and remove pid files.' celery_cmd = 'python3 manage.py {cmd} {opts} &'.format max_wait_sec = 15 diff --git a/server/website/website/models.py b/server/website/website/models.py index ce85ae7..61503ce 100644 --- a/server/website/website/models.py +++ b/server/website/website/models.py @@ -194,24 +194,29 @@ class SessionKnobManager(models.Manager): return knob_dicts @staticmethod - def get_knob_tunability(session): + def get_knob_min_max_tunability(session): # Returns a dict of the knob knobs = KnobCatalog.objects.filter(dbms=session.dbms) knob_dicts = list(knobs.values()) - session_knob_dict = {} + session_knob_dicts = {} for i, _ in enumerate(knob_dicts): if SessionKnob.objects.filter(session=session, knob=knobs[i]).exists(): new_knob = SessionKnob.objects.filter(session=session, knob=knobs[i])[0] - session_knob_dict[new_knob.name] = new_knob.tunable - return session_knob_dict + min_max_tunability = {"minval": new_knob.minval, + "maxval": new_knob.maxval, + "tunable": new_knob.tunable} + session_knob_dicts[new_knob.name] = min_max_tunability + return session_knob_dicts @staticmethod - def set_knob_tunability(session, knob_dicts): + def set_knob_min_max_tunability(session, knob_dicts): # Returns a dict of the knob session_knobs = SessionKnob.objects.filter(session=session) for session_knob in session_knobs: if knob_dicts.__contains__(session_knob.name): - session_knob.tunable = knob_dicts[session_knob.name] + session_knob.minval = knob_dicts[session_knob.name]["minval"] + session_knob.maxval = knob_dicts[session_knob.name]["maxval"] + session_knob.tunable = knob_dicts[session_knob.name]["tunable"] session_knob.save()