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())
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)
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")
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())
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
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())
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", )