def get_executer_data(query, recursive=False, include_unattached=False): from app.models import Project, Datacenter, Group, Host host_fields = list(Host.FIELDS) group_fields = list(Group.FIELDS) if recursive: host_fields += ["all_tags", "all_custom_fields"] group_fields += ["all_tags", "all_custom_fields"] projects = Project.find(query) projects = cursor_to_list(projects) project_ids = [x["_id"] for x in projects] groups = Group.find({"project_id": {"$in": project_ids}}) groups = cursor_to_list(groups, fields=group_fields) group_ids = [x["_id"] for x in groups] if include_unattached: hosts = Host.find({}) else: hosts = Host.find({"group_id": {"$in": group_ids}}) hosts = cursor_to_list(hosts, fields=host_fields) datacenters = Datacenter.find({}) datacenters = cursor_to_list(datacenters) return { "datacenters": datacenters, "projects": projects, "groups": groups, "hosts": hosts }
def test_mass_delete(self): from app.models import Group g1 = Group(name="g1", project_id=self.project1._id) g1.save() h1 = Host(fqdn="host1", group_id=g1._id) h1.save() h2 = Host(fqdn="host2", group_id=g1._id) h2.save() h3 = Host(fqdn="host3", group_id=g1._id) h3.save() h4 = Host(fqdn="host4", group_id=g1._id) h4.save() r = self.post_json("/api/v1/hosts/mass_delete", {"host_ids": [str(h2._id), str(h3._id)]}) self.assertEqual(200, r.status_code) data = json.loads(r.data) self.assertIn("data", data) hosts_data = data["data"] self.assertIn("hosts", hosts_data) hosts_data = hosts_data["hosts"] self.assertIs(list, type(hosts_data)) self.assertEqual(2, len(hosts_data)) deleted_hosts = Host.find({"_id": {"$in": [h2._id, h3._id]}}) self.assertEqual(0, deleted_hosts.count()) g1 = Group.find_one({"_id": g1._id}) self.assertItemsEqual([h1._id, h4._id], g1.host_ids)
def executer_data(): from app.models import Project, Datacenter, Group, Host if "projects" not in request.values: return json_response( { "errors": ["'projects' parameter is required for executer_data handler"] }, 400) project_names = request.values["projects"].split(",") projects = Project.find({"name": {"$in": project_names}}) projects = cursor_to_list(projects) project_ids = [x["_id"] for x in projects] groups = Group.find({"project_id": {"$in": project_ids}}) groups = cursor_to_list(groups) group_ids = [x["_id"] for x in groups] hosts = Host.find({"group_id": {"$in": group_ids}}) hosts = cursor_to_list(hosts) datacenters = Datacenter.find({}) datacenters = cursor_to_list(datacenters) results = { "datacenters": datacenters, "projects": projects, "groups": groups, "hosts": hosts } return json_response({"data": results})
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 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 create(): from app.models import Host hosts_attrs = dict( [x for x in request.json.items() if x[0] in Host.FIELDS]) if "fqdn_pattern" in request.json: if "fqdn" in hosts_attrs: return json_response({ "errors": [ "fqdn field is not allowed due to fqdn_pattern param presence" ] }) try: hostnames = list(expand_pattern(request.json["fqdn_pattern"])) except Exception as e: return json_exception(e) else: hostnames = [hosts_attrs["fqdn"]] del (hosts_attrs["fqdn"]) try: hosts_attrs["group_id"] = ObjectId(hosts_attrs["group_id"]) except (KeyError, InvalidId): hosts_attrs["group_id"] = None try: hosts_attrs["datacenter_id"] = ObjectId(hosts_attrs["datacenter_id"]) except (KeyError, InvalidId): hosts_attrs["datacenter_id"] = None for fqdn in hostnames: attrs = hosts_attrs attrs["fqdn"] = fqdn host = Host(**attrs) try: host.save() except Exception as e: return json_exception(e, 500) hosts = Host.find({"fqdn": {"$in": list(hostnames)}}) try: data = paginated_data(hosts.sort("fqdn")) except AttributeError as e: return json_exception(e, 500) return json_response(data, 201)
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 test_mass_detach(self): from app.models import Group g1 = Group(name="g1", project_id=self.project1._id) g1.save() g2 = Group(name="g2", project_id=self.project1._id) g2.save() h1 = Host(fqdn="host1", group_id=g1._id) h1.save() h2 = Host(fqdn="host2", group_id=g1._id) h2.save() h3 = Host(fqdn="host3", group_id=g2._id) h3.save() h4 = Host(fqdn="host4", group_id=g2._id) h4.save() r = self.post_json( "/api/v1/hosts/mass_detach", {"host_ids": [str(h1._id), str(h2._id), str(h3._id), str(h4._id)]}) self.assertEqual(200, r.status_code) data = json.loads(r.data) self.assertIn("data", data) hosts_data = data["data"] self.assertIn("hosts", hosts_data) hosts_data = hosts_data["hosts"] self.assertIs(list, type(hosts_data)) self.assertEqual(4, len(hosts_data)) g1 = Group.get(g1._id) g2 = Group.get(g2._id) self.assertItemsEqual([], g1.host_ids) self.assertItemsEqual([], g2.host_ids) hosts = Host.find( {"fqdn": { "$in": ["host1", "host2", "host3", "host4"] }}) for host in hosts: self.assertEqual(host.group_id, None)