Different issues with image metadata forms
Fixed different small issues with forms related to marking images with specific Murano metadata Resolved Bug #1236262 Change-Id: I0a4f6c7034c76c6b7a591e26b0df5f9f29ad782d
This commit is contained in:
parent
e54bf89c41
commit
78496587b3
|
@ -20,8 +20,8 @@ from horizon import messages, exceptions
|
|||
from openstack_dashboard.api import glance
|
||||
import json
|
||||
|
||||
from muranodashboard.panel.services import iterate_over_service_forms, \
|
||||
get_service_choices
|
||||
from muranodashboard.panel.services import iterate_over_service_forms
|
||||
from muranodashboard.panel.services import get_service_choices
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
@ -35,38 +35,43 @@ FORMS = [('service_choice', WizardFormServiceType)]
|
|||
FORMS.extend(iterate_over_service_forms())
|
||||
|
||||
|
||||
class AddImageForm(SelfHandlingForm):
|
||||
title = forms.CharField(max_length="255",
|
||||
label=_("Image Title"))
|
||||
class MarkImageForm(SelfHandlingForm):
|
||||
_metadata = {
|
||||
'windows.2012.standart': ' Windows Server 2012 Desktop',
|
||||
'linux': 'Generic Linux',
|
||||
'cirros.demo': 'Murano Demo Image'
|
||||
}
|
||||
|
||||
image_choices = forms.ChoiceField(label='Images')
|
||||
|
||||
windows_image = ('ws-2012-std', ' Windows Server 2012 Desktop')
|
||||
demo_image = ('murano_demo', 'Murano Demo Image')
|
||||
|
||||
image_type = forms.ChoiceField(label="Murano Type",
|
||||
choices=[windows_image, demo_image])
|
||||
image = forms.ChoiceField(label='Image')
|
||||
type = forms.ChoiceField(label="Metadata", choices=_metadata.items())
|
||||
|
||||
def __init__(self, request, *args, **kwargs):
|
||||
super(AddImageForm, self).__init__(request, *args, **kwargs)
|
||||
super(MarkImageForm, self).__init__(request, *args, **kwargs)
|
||||
|
||||
images = []
|
||||
try:
|
||||
images, _more = glance.image_list_detailed(request)
|
||||
except Exception:
|
||||
log.error("Failed to request image list from glance ")
|
||||
images = []
|
||||
exceptions.handle(request, _("Unable to retrieve public images."))
|
||||
self.fields['image_choices'].choices = [(image.id, image.name)
|
||||
for image in images]
|
||||
log.error('Failed to request image list from Glance')
|
||||
exceptions.handle(request, _('Unable to retrieve list of images'))
|
||||
|
||||
self.fields['image'].choices = [(i.id, i.name) for i in images]
|
||||
|
||||
def handle(self, request, data):
|
||||
log.debug('Adding new murano using data {0}'.format(data))
|
||||
murano_properties = {'murano_image_info': json.dumps(
|
||||
{'title': data['title'], 'type': data['image_type']})}
|
||||
try:
|
||||
image = glance.image_update(request, data['image_choices'],
|
||||
properties=murano_properties)
|
||||
log.debug('Marking image with specified metadata: {0}'.format(data))
|
||||
|
||||
messages.success(request, _('Image added to Murano'))
|
||||
image, mtype = (data['image'], data['type'])
|
||||
|
||||
properties = {
|
||||
'murano_image_info': json.dumps({
|
||||
'title': self._metadata[mtype],
|
||||
'type': mtype
|
||||
})
|
||||
}
|
||||
|
||||
try:
|
||||
image = glance.image_update(request, image, properties=properties)
|
||||
messages.success(request, _('Image successfully marked'))
|
||||
return image
|
||||
except Exception:
|
||||
exceptions.handle(request, _('Unable to update image.'))
|
||||
exceptions.handle(request, _('Unable to mark image'))
|
||||
|
|
|
@ -57,10 +57,10 @@ class CreateEnvironment(tables.LinkAction):
|
|||
api.environment_create(request, environment)
|
||||
|
||||
|
||||
class MuranoImages(tables.LinkAction):
|
||||
class MarkedImages(tables.LinkAction):
|
||||
name = 'show_images'
|
||||
verbose_name = _('Murano Images')
|
||||
url = 'horizon:project:murano:murano_images'
|
||||
verbose_name = _('Marked Images')
|
||||
url = 'horizon:project:murano:images'
|
||||
|
||||
def allowed(self, request, environment):
|
||||
return True
|
||||
|
@ -227,7 +227,7 @@ class EnvironmentsTable(tables.DataTable):
|
|||
verbose_name = _('Environments')
|
||||
row_class = UpdateEnvironmentRow
|
||||
status_columns = ['status']
|
||||
table_actions = (CreateEnvironment, MuranoImages)
|
||||
table_actions = (CreateEnvironment, MarkedImages)
|
||||
row_actions = (ShowEnvironmentServices, DeployEnvironment,
|
||||
EditEnvironment, DeleteEnvironment, ShowDeployments)
|
||||
|
||||
|
@ -314,10 +314,10 @@ class EnvConfigTable(tables.DataTable):
|
|||
verbose_name = _('Deployed Services')
|
||||
|
||||
|
||||
class AddMuranoImage(tables.LinkAction):
|
||||
name = "add_image"
|
||||
verbose_name = _("Add Image")
|
||||
url = "horizon:project:murano:add_image"
|
||||
class MarkImage(tables.LinkAction):
|
||||
name = "mark_image"
|
||||
verbose_name = _("Mark Image")
|
||||
url = "horizon:project:murano:mark_image"
|
||||
classes = ("ajax-modal", "btn-create")
|
||||
|
||||
def allowed(self, request, image):
|
||||
|
@ -325,26 +325,27 @@ class AddMuranoImage(tables.LinkAction):
|
|||
|
||||
|
||||
class RemoveImageMetadata(tables.DeleteAction):
|
||||
data_type_singular = _('Murano Metadata')
|
||||
data_type_plural = _('Murano Metadata')
|
||||
data_type_singular = _('Metadata')
|
||||
data_type_plural = _('Metadata')
|
||||
|
||||
def delete(self, request, obj_id):
|
||||
try:
|
||||
glance.image_update(request, obj_id, properties={})
|
||||
messages.success(request, _('Image removed from Murano.'))
|
||||
except Exception:
|
||||
exceptions.handle(request, _('Unable to update image.'))
|
||||
exceptions.handle(request, _('Unable to remove metadata'))
|
||||
|
||||
|
||||
class ImagesTable(tables.DataTable):
|
||||
image_title = tables.Column('title', verbose_name=_('Murano title'))
|
||||
image_id = tables.Column('id', verbose_name=_('Image id'))
|
||||
|
||||
image_name = tables.Column('name', verbose_name=_('Name in Glance'))
|
||||
image_type = tables.Column('name', verbose_name=_('Murano Type'))
|
||||
class MarkedImagesTable(tables.DataTable):
|
||||
image = tables.Column(
|
||||
'name',
|
||||
link='horizon:project:images_and_snapshots:images:detail',
|
||||
verbose_name=_('Image')
|
||||
)
|
||||
type = tables.Column('type', verbose_name=_('Type'))
|
||||
title = tables.Column('title', verbose_name=_('Title'))
|
||||
|
||||
class Meta:
|
||||
name = 'images'
|
||||
verbose_name = _('Murano Images')
|
||||
table_actions = (AddMuranoImage, RemoveImageMetadata)
|
||||
name = 'marked_images'
|
||||
verbose_name = _('Marked Images')
|
||||
table_actions = (MarkImage, RemoveImageMetadata)
|
||||
row_actions = (RemoveImageMetadata,)
|
||||
|
|
|
@ -19,7 +19,7 @@ from views import Services
|
|||
from views import CreateEnvironmentView
|
||||
from views import DetailServiceView
|
||||
from views import DeploymentsView
|
||||
from views import MuranoImageView, AddMuranoImageView
|
||||
from views import MarkedImagesView, MarkImageView
|
||||
from views import Wizard, EditEnvironmentView
|
||||
from forms import FORMS
|
||||
from muranodashboard.panel.services import get_service_checkers
|
||||
|
@ -40,14 +40,14 @@ urlpatterns = patterns(
|
|||
url(r'^create_environment$', CreateEnvironmentView.as_view(),
|
||||
name='create_environment'),
|
||||
|
||||
url(r'^murano_images$', MuranoImageView.as_view(),
|
||||
name='murano_images'),
|
||||
url(r'^images$', MarkedImagesView.as_view(),
|
||||
name='images'),
|
||||
|
||||
url(r'^add_image$', AddMuranoImageView.as_view(),
|
||||
name='add_image'),
|
||||
url(r'^mark_image$', MarkImageView.as_view(),
|
||||
name='mark_image'),
|
||||
|
||||
url(r'^remove_image$', MuranoImageView.as_view(),
|
||||
name='remove_image'),
|
||||
url(r'^remove_metadata$', MarkedImagesView.as_view(),
|
||||
name='remove_metadata'),
|
||||
|
||||
url(ENVIRONMENT_ID + r'/update_environment$',
|
||||
EditEnvironmentView.as_view(),
|
||||
|
|
|
@ -35,11 +35,11 @@ from tables import EnvironmentsTable
|
|||
from tables import ServicesTable
|
||||
from tables import DeploymentsTable
|
||||
from tables import EnvConfigTable
|
||||
from tables import ImagesTable
|
||||
from tables import MarkedImagesTable
|
||||
|
||||
from workflows import CreateEnvironment, UpdateEnvironment
|
||||
from tabs import ServicesTabs, DeploymentTabs
|
||||
from forms import AddImageForm
|
||||
from forms import MarkImageForm
|
||||
|
||||
from muranodashboard.panel import api
|
||||
from muranoclient.common.exceptions import HTTPUnauthorized, \
|
||||
|
@ -334,40 +334,40 @@ class DeploymentDetailsView(tabs.TabbedTableView):
|
|||
**kwargs)
|
||||
|
||||
|
||||
class MuranoImageView(tables.DataTableView):
|
||||
table_class = ImagesTable
|
||||
class MarkedImagesView(tables.DataTableView):
|
||||
table_class = MarkedImagesTable
|
||||
template_name = 'images/index.html'
|
||||
|
||||
def get_data(self):
|
||||
images = []
|
||||
try:
|
||||
images, _more = glance.image_list_detailed(self.request)
|
||||
|
||||
except HTTPForbidden:
|
||||
except Exception:
|
||||
msg = _('Unable to retrieve list of images')
|
||||
exceptions.handle(self.request, msg,
|
||||
redirect=reverse("horizon:project:murano:index"))
|
||||
murano_images = []
|
||||
uri = reverse('horizon:project:murano:index')
|
||||
|
||||
exceptions.handle(self.request, msg, redirect=uri)
|
||||
|
||||
marked_images = []
|
||||
for image in images:
|
||||
murano_property = image.properties.get('murano_image_info')
|
||||
if murano_property:
|
||||
metadata = image.properties.get('murano_image_info')
|
||||
if metadata:
|
||||
try:
|
||||
murano_json = json.loads(murano_property)
|
||||
metadata = json.loads(metadata)
|
||||
except ValueError:
|
||||
LOG.warning("JSON in image metadata is not valid. "
|
||||
"Check it in glance.")
|
||||
messages.error(self.request,
|
||||
_("Invalid murano image metadata"))
|
||||
msg = _('Invalid metadata for image: {0}'.format(image.id))
|
||||
LOG.warn(msg)
|
||||
messages.error(self.request, msg)
|
||||
else:
|
||||
image.title = murano_json.get('title', 'No title')
|
||||
image.type = murano_json.get('type', 'No title')
|
||||
image.title = metadata.get('title', 'No Title')
|
||||
image.type = metadata.get('type', 'No Type')
|
||||
|
||||
murano_images.append(image)
|
||||
return murano_images
|
||||
marked_images.append(image)
|
||||
return marked_images
|
||||
|
||||
|
||||
class AddMuranoImageView(ModalFormView):
|
||||
form_class = AddImageForm
|
||||
template_name = 'images/add.html'
|
||||
class MarkImageView(ModalFormView):
|
||||
form_class = MarkImageForm
|
||||
template_name = 'images/mark.html'
|
||||
context_object_name = 'image'
|
||||
success_url = reverse_lazy("horizon:project:murano:murano_images")
|
||||
success_url = reverse_lazy('horizon:project:murano:images')
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
{% extends "horizon/common/_modal_form.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block form_id %}add_murano_image_form{% endblock %}
|
||||
{% block form_attrs %}enctype="multipart/form-data"{% endblock %}
|
||||
{% block form_action %}add_image{% endblock %}
|
||||
{% block modal-header %}{% trans "Add An Image" %}{% endblock %}
|
||||
|
||||
{% block modal-body %}
|
||||
<div class="left">
|
||||
<fieldset>
|
||||
{% include "horizon/common/_form_fields.html" %}
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class="right">
|
||||
<h3>{% trans "Description:" %}</h3>
|
||||
<p>{% trans "Add image to Murano. Valid image metadata will be added so this image can be picked during service creation." %}</p>
|
||||
<p><strong>{% trans "Image Title" %}</strong>
|
||||
{% blocktrans %}Enter an image desciption which will help you to recognize the service during service creation {% endblocktrans %}
|
||||
</p>
|
||||
<p><strong>{% trans "Images" %}</strong>
|
||||
{% blocktrans %}Select image from Glance{% endblocktrans %}
|
||||
</p>
|
||||
<p><strong>{% trans "Murano Type" %}</strong>
|
||||
{% blocktrans %}Pick image type from supported by Murano{% endblocktrans %}
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block modal-footer %}
|
||||
<input class="btn btn-primary pull-right" type="submit" value="{% trans "Update Image" %}" />
|
||||
{% endblock %}
|
|
@ -0,0 +1,31 @@
|
|||
{% extends 'horizon/common/_modal_form.html' %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block form_id %}add_murano_image_form{% endblock %}
|
||||
{% block form_attrs %}enctype='multipart/form-data'{% endblock %}
|
||||
{% block form_action %}mark_image{% endblock %}
|
||||
{% block modal-header %}{% trans 'Mark Image' %}{% endblock %}
|
||||
|
||||
{% block modal-body %}
|
||||
<div class='left'>
|
||||
<fieldset>
|
||||
{% include 'horizon/common/_form_fields.html' %}
|
||||
</fieldset>
|
||||
</div>
|
||||
<div class='right'>
|
||||
<h3>{% trans 'Description:' %}</h3>
|
||||
<p>{% trans 'Mark image with specific Murano metadata. Valid image metadata will be added to the selected image so image can be picked during service creation.' %}</p>
|
||||
<p>
|
||||
<strong>{% trans 'Image' %}:</strong>
|
||||
{% blocktrans %}Select one of the images registered in the Glance{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
<strong>{% trans 'Metadata' %}:</strong>
|
||||
{% blocktrans %}Pick metadata from supported by Murano{% endblocktrans %}
|
||||
</p>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block modal-footer %}
|
||||
<input class='btn btn-primary pull-right' type='submit' value='{% trans 'Mark' %}' />
|
||||
{% endblock %}
|
|
@ -1,11 +0,0 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Add An Image" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Add Image To Murano") %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'horizon/project/murano/images/_add.html' %}
|
||||
{% endblock %}
|
|
@ -1,9 +1,9 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Murano Images" %}{% endblock %}
|
||||
{% block title %}{% trans "Marked Images" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Murano Images") %}
|
||||
{% include "horizon/common/_page_header.html" with title=_("Marked Images") %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
{% extends 'base.html' %}
|
||||
{% load i18n %}
|
||||
{% block title %}{% trans "Mark Image" %}{% endblock %}
|
||||
|
||||
{% block page_header %}
|
||||
{% include 'horizon/common/_page_header.html' with title=_('Mark image with Metadata') %}
|
||||
{% endblock page_header %}
|
||||
|
||||
{% block main %}
|
||||
{% include 'horizon/project/murano/images/_mark.html' %}
|
||||
{% endblock %}
|
Loading…
Reference in New Issue