Example #1
0
def launchconfiguration_resource(request, id):
    if request.method == "GET":
        lc_dict = get_launch_configuration(id)
        if lc_dict is not None and lc_dict.get('owner') == request.user.username:

            lc_dict['uri'] = "/api/%s/launchconfigurations/%s" % (API_VERSION, lc_dict.get('id'))

            h = HttpResponse(json.dumps(lc_dict), mimetype='application/javascript')
        else:
            h = HttpResponseNotFound('Launch configuration %s not found' % id, mimetype='application/javascript')
        return h
    elif request.method == "PUT":

        lc = get_launch_configuration_object(id)
        if lc is None:
            msg = "Launch configuration %s not found" % id
            return HttpResponseNotFound(msg, mimetype='application/javascript')

        try:
            content = json.loads(request.body)
        except:
            return HttpResponseBadRequest()

        required_params = ['name', 'cloud_params']
        if not has_all_required_params(required_params, content):
            return HttpResponseBadRequest()

        cloud_params = content['cloud_params']

        required_cloud_params = ['image_id', 'instance_type', 'max_vms', 'common', 'rank']
        for cloud_name, cloud_p in cloud_params.iteritems():
            if not has_all_required_params(required_cloud_params, cloud_p):
                missing = list(set(required_params) - set(cloud_p))
                return HttpResponseBadRequest("Missing parameters. %s needs: %s." % (
                    cloud_name, ", ".join(missing)))

        contextualization_method = content.get('contextualization_method', 'none')
        user_data = content.get('user_data')
        chef_runlist = content.get('chef_runlist')
        chef_attributes = content.get('chef_attributes')
        appliance = content.get('appliance')

        if (contextualization_method is 'none' and
                (user_data, chef_runlist, chef_attributes) is not (None, None, None)):
            msg = "Your contextualization_method is 'none', but you have provided "
            "'user_data', 'chef_runlist' or 'chef_attributes'?"
            return HttpResponseBadRequest(msg)
        elif (contextualization_method is 'user_data' and
                (chef_runlist, chef_attributes) is not (None, None)):
            msg = "Your contextualization_method is 'user_data', but you have provided "
            "'chef_runlist' or 'chef_attributes'?"
            return HttpResponseBadRequest(msg)
        elif contextualization_method is 'chef' and user_data is not None:
            msg = "Your contextualization_method is 'chef', but you have provided "
            "'user_data'?"
            return HttpResponseBadRequest(msg)

        context_params = {
            'contextualization_method': contextualization_method,
            'user_data': content.get('user_data'),
            'chef_runlist': content.get('chef_runlist'),
            'chef_attributes': content.get('chef_attributes')
        }

        response_dict = update_launch_configuration(lc.id, cloud_params, context_params, appliance)
        response_dict['uri'] = "/api/%s/launchconfigurations/%s" % (API_VERSION, lc.id)
        response_dict['contextualization_method'] = contextualization_method

        if contextualization_method == "user_data":
            response_dict['user_data'] = user_data
        elif contextualization_method == "chef":
            response_dict['chef_runlist'] = chef_runlist
            response_dict['chef_attributes'] = chef_attributes

        h = HttpResponse(json.dumps(response_dict), status=200, mimetype='application/javascript')
        return h

    elif request.method == "DELETE":
        lc = get_launch_configuration(id)
        if lc is not None and lc.get('owner') == request.user.username:
            remove_launch_configuration(request.user.username, id)

            h = HttpResponse(status=204)
        else:
            h = HttpResponseNotFound('Launch configuration %s not found' % id, mimetype='application/javascript')
        return h
Example #2
0
def launchconfigurations(request):
    if request.method == "GET":
        public = str_to_bool(request.GET.get('public', 'false'))

        all_launch_configurations = get_all_launch_configurations(request.user.username, public=public)
        response_list = []
        for lc_id, lc in all_launch_configurations.iteritems():
            lc_dict = get_launch_configuration(lc_id)
            lc_dict['uri'] = "/api/%s/launchconfigurations/%s" % (API_VERSION, lc_dict.get('id'))
            if 'description' in lc:
                lc_dict['description'] = lc['description']
            response_list.append(lc_dict)

        h = HttpResponse(json.dumps(response_list), mimetype='application/javascript')

    elif request.method == "POST":
        try:
            content = json.loads(request.body)
        except:
            return HttpResponseBadRequest("Couldn't load json from body")

        required_params = ['name', 'cloud_params']
        if not has_all_required_params(required_params, content):
            return HttpResponseBadRequest("Request must have %s params" % ", ".join(required_params))
        name = content['name']
        cloud_params = content['cloud_params']
        username = request.user.username

        required_cloud_params = ['image_id', 'instance_type', 'max_vms', 'common', 'rank']
        for cloud_name, cloud_p in cloud_params.iteritems():
            if not has_all_required_params(required_cloud_params, cloud_p):
                missing = list(set(required_params) - set(cloud_p))
                return HttpResponseBadRequest("Missing parameters. %s needs: %s." % (
                    cloud_name, ", ".join(missing)))

        if re.search("^%s+$" % ACCEPTED_RESOURCE_PATTERN, name) is None:
            return HttpResponseBadRequest("%s isn't an acceptable id. Must match %s" % (
                name, ACCEPTED_RESOURCE_PATTERN))

        lc = get_launch_configuration_by_name(username, name)
        if lc is not None:
            # LC already exists, redirect to existing one
            return HttpResponseRedirect("/api/%s/launchconfigurations/%s" % (API_VERSION, lc.id))

        contextualization_method = content.get('contextualization_method', 'None')
        user_data = content.get('user_data')
        chef_runlist = content.get('chef_runlist')
        chef_attributes = content.get('chef_attributes')
        appliance = content.get('appliance')

        if (contextualization_method is 'none' and
                (user_data, chef_runlist, chef_attributes) is not (None, None, None)):
            msg = "Your contextualization_method is 'none', but you have provided "
            "'user_data', 'chef_runlist' or 'chef_attributes'?"
            return HttpResponseBadRequest(msg)
        elif (contextualization_method is 'user_data' and
                (chef_runlist, chef_attributes) is not (None, None)):
            msg = "Your contextualization_method is 'user_data', but you have provided "
            "'chef_runlist' or 'chef_attributes'?"
            return HttpResponseBadRequest(msg)
        elif contextualization_method is 'chef' and user_data is not None:
            msg = "Your contextualization_method is 'chef', but you have provided "
            "'user_data'?"
            return HttpResponseBadRequest(msg)

        context_params = {
            'contextualization_method': contextualization_method,
            'user_data': user_data,
            'chef_runlist': chef_runlist,
            'chef_attributes': chef_attributes,
        }

        lc = create_launch_configuration(username, name, cloud_params, context_params, appliance)

        response_dict = {
            "id": lc.id,
            "name": name,
            "owner": username,
            'appliance': appliance,
            'contextualization_method': contextualization_method,
            "cloud_params": cloud_params,
            "uri": "/api/%s/launchconfigurations/%s" % (API_VERSION, lc.id),
        }

        if contextualization_method == "user_data":
            response_dict['user_data'] = content.get('user_data')
        elif contextualization_method == "chef":
            response_dict['chef_runlist'] = content.get('chef_runlist')
            response_dict['chef_attributes'] = content.get('chef_attributes')

        h = HttpResponse(json.dumps(response_dict), status=201, mimetype='application/javascript')
    return h