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
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