Exemple #1
0
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)
Exemple #3
0
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})
Exemple #4
0
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)
Exemple #5
0
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)
Exemple #6
0
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)
Exemple #7
0
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)