def enc(host_id): from app.models import Host host_id = resolve_id(host_id) host = Host.find_one({ "$or": [{ "_id": host_id }, { "fqdn": host_id }, { "short_name": host_id }] }) if host is None: return json_response({"errors": ["Host not found"]}, 404) puppet_data = {"classes": [], "parameters": {}} for tag in host.all_tags: class_match = CLASS_EXPR.match(tag) if class_match is not None: puppet_data["classes"].append(class_match.groups()[0]) continue param_match = PARAM_EXPR.match(tag) if param_match is not None: k, v = param_match.groups() puppet_data["parameters"][k] = v continue env_match = ENV_EXPR.match(tag) if env_match is not None: puppet_data["environment"] = env_match.groups()[0] return yaml_response(puppet_data)
def _get_group_by_id(group_id): from app.models import Group group_id = resolve_id(group_id) return Group.find_one({ "$or": [ { "_id": group_id }, { "name": group_id } ] })
def get(cls, expression): from bson.objectid import ObjectId, InvalidId from library.engine.utils import resolve_id expression = resolve_id(expression) if type(expression) == ObjectId: query = {"_id": expression} else: expression = str(expression) query = {cls.KEY_FIELD: expression} return cls.find_one(query)
def show(group_id=None): from app.models import Group if group_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) >= 2: query["name"] = { "$regex": "^%s" % name_filter } if "project_id" in request.values: project_id = resolve_id(request.values["project_id"]) query["project_id"] = project_id groups = Group.find(query) else: group_id = resolve_id(group_id) groups = Group.find({"$or": [ { "_id": group_id }, { "name": group_id } ]}) data = paginated_data(groups.sort("name")) return json_response(data)
def show(host_id=None): from app.models import Host if host_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) >= 2: query["fqdn"] = {"$regex": "^%s" % name_filter} if "group_id" in request.values: group_id = resolve_id(request.values["group_id"]) query["group_id"] = group_id hosts = Host.find(query) else: host_id = resolve_id(host_id) hosts = Host.find({"$or": [{"_id": host_id}, {"fqdn": host_id}]}) if hosts.count() == 0: return json_response({"errors": ["Host not found"]}, 404) try: data = paginated_data(hosts.sort("fqdn")) except AttributeError as e: return json_exception(e, 500) return json_response(data)
def update(dc_id): dc = _get_dc_by_id(dc_id) if dc is None: return json_response({"errors": ["Datacenter not found"]}, 404) # TODO: check permissions! try: dc.update(request.json) except Exception as e: return json_exception(e, 500) if "parent_id" in request.json: parent_id = resolve_id(request.json["parent_id"]) if parent_id != dc.parent_id: return set_parent(dc._id) return json_response({"data": dc.to_dict()})
def delete(id): from app.models import Project id = resolve_id(id) project = Project.find_one({ "$or": [ { "_id": id }, { "name": id } ] }) if project is None: return json_response({ "errors": [ "Project not found" ]}, 404) # TODO check user supervisor privileges try: project.destroy() except Exception as e: return json_exception(e, 400) return json_response({ "data": project.to_dict(), "status": "deleted" })
def update(id): from app.models import Project data = clear_aux_fields(request.json) # TODO check user ownership of project id = resolve_id(id) project = Project.find_one({ "$or": [ { "_id": id }, { "name": id } ] }) if project is None: return json_response({ "errors": [ "Project not found" ]}, 404) try: project.update(data) except Exception as e: return json_exception(e, 500) return json_response({ "data": project.to_dict(), "status": "updated" })
def show(project_id=None): "list/show handler for projects" from app.models import Project if project_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) > 2: query["name"] = { "$regex": "^%s" % name_filter } projects = Project.find(query) else: project_id = resolve_id(project_id) projects = Project.find({ "$or": [ { "_id": project_id }, { "name": project_id } ] }) return json_response(paginated_data(projects.sort("name")))
def set_parent(dc_id): dc = _get_dc_by_id(dc_id) if dc is None: return json_response({"errors": ["Datacenter not found"]}, 404) # TODO: check permissions! parent_id = request.json.get("parent_id") if dc.parent: try: dc.unset_parent() except Exception as e: return json_exception(e, 500) if parent_id is not None: try: parent_id = resolve_id(parent_id) dc.set_parent(parent_id) except Exception as e: return json_exception(e, 500) return json_response({"data": dc.to_dict()})
def show(host_id=None): from app.models import Host if host_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) >= 2: query["fqdn"] = { "$regex": "^%s" % name_filter } hosts = Host.find(query) else: host_id = resolve_id(host_id) hosts = Host.find({ "$or": [ { "_id": host_id }, { "fqdn": host_id }, { "short_name": host_id } ]}) data = paginated_data(hosts.sort("fqdn")) return json_response(data)
def mass_detach(): if "host_ids" not in request.json or request.json["host_ids"] is None: return json_response({"errors": ["No host_ids provided"]}, 400) if type(request.json["host_ids"]) != list: return json_response({"errors": ["host_ids must be an array type"]}, 400) from app.models import Host # resolving hosts host_ids = [resolve_id(x) for x in request.json["host_ids"]] host_ids = set([x for x in host_ids if x is not None]) hosts = Host.find({"_id": {"$in": list(host_ids)}}).all() if len(hosts) == 0: return json_response({"errors": ["No hosts found to be moved"]}, 404) failed_hosts = [] for host in hosts: if not host.modification_allowed: failed_hosts.append(host) if len(failed_hosts) > 0: failed_hosts = ', '.join([h.fqdn for h in failed_hosts]) return json_response( { "errors": [ "You don't have permissions to modify hosts: %s" % failed_hosts ] }, 403) # moving hosts for host in hosts: host.group_id = None host.save() result = { "status": "ok", "data": { "hosts": [host.to_dict() for host in hosts] } } return json_response(result)
def show(project_id=None): from app.models import Project if project_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) > 2: query["name"] = {"$regex": "^%s" % name_filter} projects = Project.find(query) else: project_id = resolve_id(project_id) projects = Project.find( {"$or": [{ "_id": project_id }, { "name": project_id }]}) if projects.count() == 0: return json_response({"errors": ["Project not found"]}, 404) return json_response(paginated_data(projects.sort("name")))
def show(datacenter_id=None): from app.models import Datacenter if datacenter_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) >= 2: query["name"] = {"$regex": "^%s" % name_filter} datacenters = Datacenter.find(query) else: datacenter_id = resolve_id(datacenter_id) datacenters = Datacenter.find( {"$or": [{ "_id": datacenter_id }, { "name": datacenter_id }]}) if datacenters.count() == 0: return json_response({"errors": ["Datacenter not found"]}, 404) data = paginated_data(datacenters.sort("name")) return json_response(data)
def show(user_id=None): from app.models import User if user_id is None: query = {} if "_filter" in request.values: name_filter = request.values["_filter"] if len(name_filter) >= 2: query["username"] = { "$regex": "^%s" % name_filter } users = User.find(query) else: user_id = resolve_id(user_id) users = User.find({ "$or": [ { "_id": user_id }, { "username": user_id } ] }) if users.count() == 0: return json_response({"errors":["User not found"]}, 404) try: data = paginated_data(users.sort("username")) except AttributeError as e: return json_exception(e, 500) return json_response(data)
def _get_dc_by_id(dc_id): from app.models import Datacenter dc_id = resolve_id(dc_id) return Datacenter.find_one({"$or": [{"_id": dc_id}, {"name": dc_id}]})