Add services filtering if no images avaliable
Change-Id: I9018420d50618bce183e7d46c03298758404cd6e
This commit is contained in:
parent
56e0596846
commit
05d77b150e
|
@ -13,16 +13,57 @@
|
|||
# under the License.
|
||||
|
||||
import logging
|
||||
import json
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from muranodashboard.environments.services import get_service_choices
|
||||
|
||||
from .services import get_service_choices
|
||||
from .services.fields import get_murano_images
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def filter_service_by_image_type(service, request):
|
||||
def find_image_field():
|
||||
for form_cls in service.forms:
|
||||
for field in form_cls.fields_template:
|
||||
if field.get('type') == 'image':
|
||||
return field
|
||||
return None
|
||||
|
||||
filtered = False
|
||||
image_field = find_image_field()
|
||||
if not image_field:
|
||||
message = "Please provide Image field description in UI definition"
|
||||
return filtered, message
|
||||
specified_image_type = image_field.get('imageType')
|
||||
if not specified_image_type:
|
||||
message = "Please provide 'imageType' parameter in Image field " \
|
||||
"description in UI definition"
|
||||
return filtered, message
|
||||
|
||||
registered_murano_images = []
|
||||
available_images = get_murano_images(request)
|
||||
for image in available_images:
|
||||
registered_murano_images.append(image.murano_property.get('type'))
|
||||
|
||||
for type in registered_murano_images:
|
||||
if specified_image_type in type:
|
||||
filtered = True
|
||||
message = ''
|
||||
else:
|
||||
message = 'Murano image type "{0}" is not registered'.format(
|
||||
specified_image_type)
|
||||
return filtered, message
|
||||
|
||||
|
||||
def ChoiceServiceFormFactory(request):
|
||||
filtered, not_filtered = get_service_choices(
|
||||
request, filter_service_by_image_type)
|
||||
|
||||
class _Class(forms.Form):
|
||||
service = forms.ChoiceField(label=_('Service Type'),
|
||||
choices=get_service_choices(request))
|
||||
service = forms.ChoiceField(
|
||||
label=_('Service Type'),
|
||||
choices=filtered or [("", _("No services available"))])
|
||||
|
||||
description = forms.CharField(widget=forms.HiddenInput,
|
||||
initial=json.dumps(not_filtered))
|
||||
return _Class
|
||||
|
|
|
@ -164,10 +164,16 @@ def get_service_type(wizard):
|
|||
return cleaned_data.get('service')
|
||||
|
||||
|
||||
def get_service_choices(request):
|
||||
return [(srv_type, service.name) for srv_type, service, forms in
|
||||
iterate_over_services(request)]
|
||||
|
||||
def get_service_choices(request, filter_func=None):
|
||||
filter_func = filter_func or (lambda srv: True, None)
|
||||
filtered, not_filtered = [], []
|
||||
for srv_type, service, forms in iterate_over_services(request):
|
||||
has_filtered, message = filter_func(service, request)
|
||||
if has_filtered:
|
||||
filtered.append((srv_type, service.name))
|
||||
else:
|
||||
not_filtered.append((service.name, message))
|
||||
return filtered, not_filtered
|
||||
|
||||
get_forms = make_forms_getter()
|
||||
|
||||
|
|
|
@ -101,6 +101,30 @@ def wrap_regex_validator(validator, message):
|
|||
return _validator
|
||||
|
||||
|
||||
def get_murano_images(request):
|
||||
images = []
|
||||
try:
|
||||
# public filter removed
|
||||
images, _more = glance.image_list_detailed(request)
|
||||
except:
|
||||
log.error("Error to request image list from glance ")
|
||||
exceptions.handle(request, _("Unable to retrieve public images."))
|
||||
murano_images = []
|
||||
for image in images:
|
||||
murano_property = image.properties.get('murano_image_info')
|
||||
if murano_property:
|
||||
try:
|
||||
murano_metadata = json.loads(murano_property)
|
||||
except ValueError:
|
||||
log.warning("JSON in image metadata is not valid. "
|
||||
"Check it in glance.")
|
||||
messages.error(request, _("Invalid murano image metadata"))
|
||||
else:
|
||||
image.murano_property = murano_metadata
|
||||
murano_images.append(image)
|
||||
return murano_images
|
||||
|
||||
|
||||
class CustomPropertiesField(forms.Field):
|
||||
def __init__(self, form=None, key=None, *args, **kwargs):
|
||||
validators = []
|
||||
|
@ -465,40 +489,23 @@ class ImageChoiceField(ChoiceField):
|
|||
|
||||
@with_request
|
||||
def update(self, request, **kwargs):
|
||||
try:
|
||||
# public filter removed
|
||||
images, _more = glance.image_list_detailed(request)
|
||||
except:
|
||||
log.error("Error to request image list from glance ")
|
||||
images = []
|
||||
exceptions.handle(request, _("Unable to retrieve public images."))
|
||||
|
||||
image_mapping, image_choices = {}, []
|
||||
for image in images:
|
||||
murano_property = image.properties.get('murano_image_info')
|
||||
if murano_property:
|
||||
try:
|
||||
murano_json = json.loads(murano_property)
|
||||
except ValueError:
|
||||
log.warning("JSON in image metadata is not valid. "
|
||||
"Check it in glance.")
|
||||
messages.error(request, _("Invalid murano image metadata"))
|
||||
else:
|
||||
title = murano_json.get('title', image.name)
|
||||
murano_json['name'] = image.name
|
||||
murano_images = get_murano_images(request)
|
||||
for image in murano_images:
|
||||
murano_data = image.murano_property
|
||||
title = murano_data.get('title', image.name)
|
||||
murano_data['name'] = image.name
|
||||
if self.image_type is not None:
|
||||
itype = murano_data.get('type')
|
||||
|
||||
if self.image_type is not None:
|
||||
itype = murano_json.get('type')
|
||||
if not self.image_type and itype is None:
|
||||
continue
|
||||
|
||||
if not self.image_type and itype is None:
|
||||
continue
|
||||
|
||||
prefix = '{type}.'.format(type=self.image_type)
|
||||
if (not itype.startswith(prefix) and
|
||||
not self.image_type == itype):
|
||||
continue
|
||||
|
||||
image_mapping[smart_text(title)] = json.dumps(murano_json)
|
||||
prefix = '{type}.'.format(type=self.image_type)
|
||||
if (not itype.startswith(prefix) and
|
||||
not self.image_type == itype):
|
||||
continue
|
||||
image_mapping[smart_text(title)] = json.dumps(murano_data)
|
||||
|
||||
for name in sorted(image_mapping.keys()):
|
||||
image_choices.append((image_mapping[name], name))
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
import logging
|
||||
import re
|
||||
import copy
|
||||
import json
|
||||
|
||||
from django.core.urlresolvers import reverse, reverse_lazy
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
@ -137,10 +138,6 @@ class Wizard(ModalFormMixin, LazyWizard):
|
|||
|
||||
def get_context_data(self, form, **kwargs):
|
||||
context = super(Wizard, self).get_context_data(form=form, **kwargs)
|
||||
context.update({
|
||||
'service_descriptions': get_service_descriptions(self.request),
|
||||
'environment_id': self.kwargs.get('environment_id')
|
||||
})
|
||||
if self.steps.index > 0:
|
||||
data = self.get_cleaned_data_for_step('service_choice')
|
||||
service_type = data['service']
|
||||
|
@ -148,7 +145,28 @@ class Wizard(ModalFormMixin, LazyWizard):
|
|||
self.request, service_type, self.steps.index - 1)
|
||||
service_name = get_service_name(self.request, service_type)
|
||||
context.update({'type': service_type,
|
||||
'service_name': service_name})
|
||||
'service_name': service_name,
|
||||
'environment_id': self.kwargs.get('environment_id')
|
||||
})
|
||||
else:
|
||||
extended_description = form.fields['description'].initial or ''
|
||||
if extended_description:
|
||||
data = json.loads(extended_description)
|
||||
unavailable_services, reasons = zip(*data)
|
||||
if unavailable_services:
|
||||
services_msg = ', '.join(unavailable_services)
|
||||
reasons_msg = '\n'.join(set(reasons))
|
||||
extended_description = 'Services {0} are not available. ' \
|
||||
'Reasons: {1}'.format(services_msg,
|
||||
reasons_msg)
|
||||
else:
|
||||
extended_description = ''
|
||||
|
||||
context.update({
|
||||
'service_descriptions': get_service_descriptions(self.request),
|
||||
'extended_description': extended_description,
|
||||
'environment_id': self.kwargs.get('environment_id')
|
||||
})
|
||||
return context
|
||||
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
<style>
|
||||
.italic {font-style:italic;}
|
||||
</style>
|
||||
|
||||
{% extends "common/_modal_form.html" %}
|
||||
{% load i18n humanize %}
|
||||
{% load url from future %} {# fix for django 1.4.9 on CentOS #}
|
||||
|
@ -19,6 +23,7 @@
|
|||
{% include "common/_form_fields.html" %}
|
||||
</fieldset>
|
||||
{% endif %}
|
||||
<p class='italic'>{% blocktrans %} {{ extended_description }} {% endblocktrans %}</p>
|
||||
</div>
|
||||
<div class="right">
|
||||
{% if wizard.steps.index > 0 %}
|
||||
|
@ -63,6 +68,8 @@
|
|||
if ( selected ) {
|
||||
$('p.switchable:not(#'+selected+')').css('display', 'none');
|
||||
$('p.switchable#'+selected).css('display', 'block');
|
||||
} else {
|
||||
$('.modal-body .right').css('display', 'none');
|
||||
}
|
||||
});
|
||||
$('#id_service_choice-service').change();
|
||||
|
|
Loading…
Reference in New Issue