Support POC mode correctly

In the POC mode, only one flavor is displayed and the nodes
are matched to the flavor using <= operator.

Change-Id: I406955ed37760cf2a565d6cc722e04ce8eb9c06b
This commit is contained in:
Radomir Dopieralski 2015-01-08 13:16:28 +01:00
parent 6118c69c10
commit da9c7e708e

View File

@ -13,18 +13,21 @@
# under the License. # under the License.
import collections import collections
import operator
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
import django.utils.text import django.utils.text
from openstack_dashboard.api import base as api_base from openstack_dashboard.api import base as api_base
from tuskar_ui import api from tuskar_ui import api
from tuskar_ui.infrastructure.flavors import utils
from tuskar_ui.infrastructure.overview import views from tuskar_ui.infrastructure.overview import views
from tuskar_ui.utils import metering from tuskar_ui.utils import metering
from tuskar_boxes.overview import forms from tuskar_boxes.overview import forms
MATCHING_DEPLOYMENT_MODE = utils.matching_deployment_mode()
NODE_STATE_ICON = { NODE_STATE_ICON = {
api.node.DISCOVERING_STATE: 'fa-search', api.node.DISCOVERING_STATE: 'fa-search',
api.node.DISCOVERED_STATE: 'fa-search-plus', api.node.DISCOVERED_STATE: 'fa-search-plus',
@ -39,15 +42,24 @@ NODE_STATE_ICON = {
} }
def flavor_nodes(request, flavor): def flavor_nodes(request, flavor, exact_match=True):
"""Lists all nodes that match the given flavor exactly.""" """Lists all nodes that match the given flavor.
If exact_match is True, only nodes that match exactly will be listed.
Otherwise, all nodes that have at least the required resources will
be listed.
"""
if exact_match:
matches = operator.eq
else:
matches = operator.ge
for node in api.node.Node.list(request, maintenance=False): for node in api.node.Node.list(request, maintenance=False):
if all([ if all(matches(*pair) for pair in (
int(node.cpus) == int(flavor.vcpus), (int(node.cpus or 0), int(flavor.vcpus or 0)),
int(node.memory_mb) == int(flavor.ram), (int(node.memory_mb or 0), int(flavor.ram or 0)),
int(node.local_gb) == int(flavor.disk), (int(node.local_gb or 0), int(flavor.disk or 0)),
node.cpu_arch == flavor.cpu_arch, (node.cpu_arch, flavor.cpu_arch),
]): )):
yield node yield node
@ -79,7 +91,9 @@ def _node_data(request, nodes):
def _flavor_data(request, flavors, flavor_roles): def _flavor_data(request, flavors, flavor_roles):
for flavor in flavors: for flavor in flavors:
nodes = list(_node_data(request, flavor_nodes(request, flavor))) nodes = list(_node_data(request,
flavor_nodes(request, flavor,
MATCHING_DEPLOYMENT_MODE)))
roles = flavor_roles.get(flavor.name, []) roles = flavor_roles.get(flavor.name, [])
if nodes or roles: if nodes or roles:
# Don't list empty flavors # Don't list empty flavors
@ -102,22 +116,25 @@ class IndexView(views.IndexView):
data = super(IndexView, self).get_data(request, context, data = super(IndexView, self).get_data(request, context,
*args, **kwargs) *args, **kwargs)
if not data['stack']: if not data['stack']:
flavors = api.flavor.Flavor.list(self.request)
if not MATCHING_DEPLOYMENT_MODE:
# In the POC mode, only one flavor is allowed.
flavors = flavors[:1]
flavors.sort(key=lambda np: (np.vcpus, np.ram, np.disk))
roles = data['roles'] roles = data['roles']
free_roles = [] free_roles = []
flavor_roles = {} flavor_roles = {}
for role in roles: for role in roles:
role['flavor_field'] = data['form'][role['id'] + '-flavor'] role['flavor_field'] = data['form'][role['id'] + '-flavor']
flavor = role['role'].flavor(data['plan']) flavor = role['role'].flavor(data['plan'])
if flavor: if flavor in flavors:
role['flavor_name'] = flavor.name role['flavor_name'] = flavor.name
flavor_roles.setdefault(flavor.name, []).append(role) flavor_roles.setdefault(flavor.name, []).append(role)
else: else:
role['flavor_name'] = '' role['flavor_name'] = ''
free_roles.append(role) free_roles.append(role)
data['free_roles'] = free_roles data['free_roles'] = free_roles
flavors = api.flavor.Flavor.list(self.request)
flavors.sort(key=lambda np: (np.vcpus, np.ram, np.disk))
data['flavors'] = list( data['flavors'] = list(
_flavor_data(self.request, flavors, flavor_roles)) _flavor_data(self.request, flavors, flavor_roles))
else: else: