Esempio n. 1
0
def pre_save_experiments(sender, instance, using, **kwargs):
    print('creating cronjob chart')
    job_id = uuid.uuid1().hex[0:5]
    release_name = '{}-{}-{}'.format(instance.project.slug, 'cronjob', job_id)
    is_cron = 1
    if instance.schedule == "None" or instance.schedule == "":
        is_cron = 0

    from api.serializers import ProjectSerializer
    settings_file = ProjectSerializer(instance.project)

    settings_file = JSONRenderer().render(settings_file.data)
    settings_file = settings_file.decode('utf-8')

    settings_file = json.loads(settings_file)
    settings_file = yaml.dump(settings_file)

    user_config_file = create_user_settings(instance.username)
    user_config_file = yaml.dump(json.loads(user_config_file))

    parameters = {
        "release": release_name,
        "chart": "cronjob",
        "namespace": settings.NAMESPACE,
        "project.slug": instance.project.slug,
        "image": instance.environment.image,
        "command": '["/bin/bash", "-c", "'+instance.command+'"]',
        "iscron": str(is_cron),
        "cronjob.schedule": instance.schedule,
        "cronjob.port": "8786",
        "resources.limits.cpu": "500m",
        "resources.limits.memory": "1Gi",
        "resources.requests.cpu": "100m",
        "resources.requests.memory": "256Mi",
        "resources.gpu.enabled": "false",
        "settings_file": settings_file,
        "user_settings_file": user_config_file,
    }
    if hasattr(instance, 'options'):
        del instance.options['command']
        del instance.options['environment']
        del instance.options['schedule']
        parameters.update(instance.options)
    helmchart = HelmResource(name=release_name,
                             namespace='Default',
                             chart='cronjob',
                             params=parameters,
                             username=instance.username)
    helmchart.save()
    instance.helmchart = helmchart
Esempio n. 2
0
def run(request, user, project):
    project = Project.objects.filter(Q(slug=project), Q(owner=request.user) | Q(authorized=request.user)).first()

    if request.method == "POST":
        uid = uuid.uuid4()
        name = str(project.slug) + str(uid)[0:7]
        flavor_slug = request.POST.get('flavor', None)
        environment_slug = request.POST.get('environment', None)

        if flavor_slug:
            flavor = Flavor.objects.filter(slug=flavor_slug).first()
        else:
            flavor = Flavor.objects.all().first()

        if environment_slug:
            environment = Environment.objects.filter(slug=environment_slug).first()
        else:
            environment = Environment.objects.filter.all().first()

        print("dispatching with {}  {}".format(flavor, name))
        import base64
        if name != '' and flavor is not None:
            # Default values here, because otherwise an old deployment can stop working
            # if the deployment configuration files are not compatible with the latest
            # studio image.
            ingress_secret_name = 'prod-ingress'
            try:
                ingress_secret_name = settings.LABS['ingress']['secretName']
            except:
                pass

            minio_keys = get_minio_keys(project)
            decrypted_key = minio_keys['project_key']
            decrypted_secret = minio_keys['project_secret']

            settings_file = ProjectSerializer(project)

            settings_file = JSONRenderer().render(settings_file.data)
            settings_file = settings_file.decode('utf-8')
            print(settings_file)
            # settings_file = yaml.load(settings_file, Loader=yaml.FullLoader)
            settings_file = json.loads(settings_file)
            settings_file = yaml.dump(settings_file)
            print(settings_file)
            # settings_file = json.dumps(json.loads(settings_file))

            # settings_file = yaml.dump(settings_file)
            user_config_file = create_user_settings(user)
            user_config_file = yaml.dump(json.loads(user_config_file))

            prefs = {'labs.resources.requests.cpu': str(flavor.cpu),
                     'labs.resources.limits.cpu': str(flavor.cpu),
                     'labs.resources.requests.memory': str(flavor.mem),
                     'labs.resources.limits.memory': str(flavor.mem),
                     'labs.resources.requests.gpu': str(flavor.gpu),
                     'labs.resources.limits.gpu': str(flavor.gpu),
                     'labs.gpu.enabled': str("true" if flavor.gpu else "false"),
                     'labs.image': environment.image,
                     'ingress.secretName': ingress_secret_name,
                     # 'labs.setup': environment.setup,
                     'minio.access_key': decrypted_key,
                     'minio.secret_key': decrypted_secret,
                     'settings_file': settings_file,
                     'user_settings_file': user_config_file,
                     'project.slug': project.slug
                     }
            session = Session.objects.create_session(name=name, project=project, chart='lab', settings=prefs)
            from .helpers import create_session_resources

            print("trying to create resources")
            retval = create_session_resources(request, user, session, prefs, project)
            if retval:
                print("saving session!")
                project.save()
                session.save()
                return HttpResponseRedirect(
                    reverse('labs:index', kwargs={'user': request.user, 'project': str(project.slug)}))

    return HttpResponseRedirect(
        reverse('labs:index', kwargs={'user': request.user, 'project': str(project.slug)}))