76cd701382
Introduce a fixed network mode for environments. Specifically, when this mode is activated, in the environment creation dialog user is no longer prompted for a network and instead a network previously assigned to the current project is used. Network is assigned to project using project metadata key (custom) with network ID as the value. Specify this metadata key in Horizon config to be able to use it This behavior is disabled by default and could be enabled by adding: USE_FIXED_NETWORK = yes FIXED_MURANO_NETWORK = murano_network to the Horizon configuration. Change-Id: Ic464e1560cc89fdc7615d51e67beb0f50e11f24c
99 lines
3.9 KiB
Python
99 lines
3.9 KiB
Python
# Copyright (c) 2013 Mirantis, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
import ast
|
|
|
|
from django.conf import settings
|
|
from django import forms
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from horizon import exceptions
|
|
from horizon import forms as horizon_forms
|
|
from horizon import messages
|
|
from oslo_log import log as logging
|
|
|
|
from muranoclient.common import exceptions as exc
|
|
from muranodashboard.common import net
|
|
from muranodashboard.environments import api
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
ENV_NAME_HELP_TEXT = _("Environment name must contain at least one "
|
|
"non-white space symbol.")
|
|
|
|
|
|
class CreateEnvironmentForm(horizon_forms.SelfHandlingForm):
|
|
name = forms.CharField(label=_("Environment Name"),
|
|
help_text=ENV_NAME_HELP_TEXT,
|
|
max_length=255)
|
|
|
|
net_config = forms.ChoiceField(
|
|
label=_("Environment Default Network"))
|
|
|
|
def __init__(self, request, *args, **kwargs):
|
|
super(CreateEnvironmentForm, self).__init__(request, *args, **kwargs)
|
|
env_fixed_network = getattr(settings, 'USE_FIXED_NETWORK', False)
|
|
if env_fixed_network:
|
|
net_choices = net.get_project_assigned_network(request)
|
|
help_text = None
|
|
if not net_choices:
|
|
msg = _("Default network is either not specified for "
|
|
"this project, or specified incorrectly, "
|
|
"please contact administrator.")
|
|
messages.error(request, msg)
|
|
raise exceptions.ConfigurationError(msg)
|
|
else:
|
|
self.fields['net_config'].required = False
|
|
self.fields['net_config'].widget.attrs['readonly'] = True
|
|
else:
|
|
net_choices = net.get_available_networks(
|
|
request,
|
|
murano_networks='translate')
|
|
|
|
if net_choices is None: # NovaNetwork case
|
|
net_choices = [((None, None), _('Unavailable'))]
|
|
help_text = net.NN_HELP
|
|
else:
|
|
net_choices.insert(0, ((None, None), _('Create New')))
|
|
help_text = net.NEUTRON_NET_HELP
|
|
self.fields['net_config'].choices = net_choices
|
|
self.fields['net_config'].help_text = help_text
|
|
|
|
def clean_name(self):
|
|
cleaned_data = super(CreateEnvironmentForm, self).clean()
|
|
env_name = cleaned_data.get('name')
|
|
if not env_name.strip():
|
|
self._errors['name'] = self.error_class([ENV_NAME_HELP_TEXT])
|
|
return env_name
|
|
|
|
def handle(self, request, data):
|
|
try:
|
|
net_config = ast.literal_eval(data.pop('net_config'))
|
|
if net_config[0] is not None:
|
|
data.update(net.generate_join_existing_net(net_config))
|
|
env = api.environment_create(request, data)
|
|
request.session['env_id'] = env.id
|
|
messages.success(request,
|
|
u'Created environment "{0}"'.format(data['name']))
|
|
return True
|
|
except exc.HTTPConflict:
|
|
msg = _('Environment with specified name already exists')
|
|
LOG.exception(msg)
|
|
exceptions.handle(request, ignore=True)
|
|
messages.error(request, msg)
|
|
return False
|
|
except Exception:
|
|
msg = _('Failed to create environment')
|
|
LOG.exception(msg)
|
|
exceptions.handle(request)
|
|
messages.error(request, msg)
|
|
return False
|