Example #1
0
    def test_index_flavor_get_exception(self):
        servers = self.servers.list()
        flavors = self.flavors.list()
        # UUIDs generated using indexes are unlikely to match
        # any of existing flavor ids and are guaranteed to be deterministic.
        for i, server in enumerate(servers):
            server.flavor["id"] = str(uuid.UUID(int=i))

        api.server_list(IsA(http.HttpRequest)).AndReturn(servers)
        api.flavor_list(IsA(http.HttpRequest)).AndReturn(flavors)
        for server in servers:
            api.flavor_get(IsA(http.HttpRequest), server.flavor["id"]).AndRaise(self.exceptions.nova)
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(
            self.limits["absolute"]
        )

        self.mox.ReplayAll()

        res = self.client.get(reverse("horizon:project:instances:index"))

        instances = res.context["instances_table"].data

        self.assertTemplateUsed(res, "project/instances/index.html")
        self.assertMessageCount(res, error=len(servers))
        self.assertItemsEqual(instances, self.servers.list())
Example #2
0
    def test_index_server_list_exception(self):
        api.server_list(IsA(http.HttpRequest)).AndRaise(self.exceptions.nova)
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(
            self.limits["absolute"]
        )

        self.mox.ReplayAll()

        res = self.client.get(reverse("horizon:project:instances:index"))

        self.assertTemplateUsed(res, "project/instances/index.html")
        self.assertEqual(len(res.context["instances_table"].data), 0)
        self.assertMessageCount(res, error=1)
Example #3
0
    def test_index_options_after_migrate(self):
        server = self.servers.first()
        server.status = "VERIFY_RESIZE"

        api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list())
        api.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list())
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(
            self.limits["absolute"]
        )

        self.mox.ReplayAll()

        res = self.client.get(INDEX_URL)
        self.assertContains(res, "instances__confirm")
        self.assertContains(res, "instances__revert")
Example #4
0
    def test_index(self):
        api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list())
        api.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list())
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(
            self.limits["absolute"]
        )

        self.mox.ReplayAll()

        res = self.client.get(reverse("horizon:project:instances:index"))

        self.assertTemplateUsed(res, "project/instances/index.html")
        instances = res.context["instances_table"].data

        self.assertItemsEqual(instances, self.servers.list())
Example #5
0
    def allowed(self, request, datum):
        try:
            limits = api.tenant_absolute_limits(request, reserved=True)

            instances_available = limits['maxTotalInstances'] \
                - limits['totalInstancesUsed']
            cores_available = limits['maxTotalCores'] \
                - limits['totalCoresUsed']
            ram_available = limits['maxTotalRAMSize'] - limits['totalRAMUsed']

            if instances_available <= 0 or cores_available <= 0 \
                    or ram_available <= 0:
                if "disabled" not in self.classes:
                    self.classes = [c for c in self.classes] + ['disabled']
                    self.verbose_name = string_concat(self.verbose_name, ' ',
                                                      _("(Quota exceeded)"))
            else:
                self.verbose_name = _("Launch Instance")
                classes = [c for c in self.classes if c != "disabled"]
                self.classes = classes
        except:
            LOG.exception("Failed to retrieve quota information")
            # If we can't get the quota information, leave it to the
            # API to check when launching

        return True  # The action should always be displayed
Example #6
0
    def test_index_flavor_list_exception(self):
        servers = self.servers.list()
        flavors = self.flavors.list()
        full_flavors = SortedDict([(f.id, f) for f in flavors])

        api.server_list(IsA(http.HttpRequest)).AndReturn(servers)
        api.flavor_list(IsA(http.HttpRequest)).AndRaise(self.exceptions.nova)
        for server in servers:
            api.flavor_get(IsA(http.HttpRequest), server.flavor["id"]).AndReturn(full_flavors[server.flavor["id"]])
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(
            self.limits["absolute"]
        )

        self.mox.ReplayAll()

        res = self.client.get(reverse("horizon:project:instances:index"))

        self.assertTemplateUsed(res, "project/instances/index.html")
        instances = res.context["instances_table"].data

        self.assertItemsEqual(instances, self.servers.list())
Example #7
0
    def test_launch_button_disabled_when_quota_exceeded(self):
        limits = self.limits["absolute"]
        limits["totalInstancesUsed"] = limits["maxTotalInstances"]

        api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list())
        api.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list())
        api.tenant_absolute_limits(IsA(http.HttpRequest), reserved=True).MultipleTimes().AndReturn(limits)

        self.mox.ReplayAll()

        launch = LaunchLink()
        url = launch.get_link_url()
        classes = list(launch.get_default_classes()) + list(launch.classes)
        link_name = "%s (%s)" % (unicode(launch.verbose_name), "Quota exceeded")

        res = self.client.get(INDEX_URL)
        self.assertContains(
            res,
            "<a href='%s' id='instances__action_launch'"
            " class='%s disabled'>%s</a>" % (url, " ".join(classes), link_name),
            html=True,
            msg_prefix="The launch button is not disabled",
        )