Cherry-pick commits from release-0.4
*Update requirements and package version Closes-Bug: #1269769 *Add new setup scripts Removed old setup scripts * Make modify_horizon_config is up-to-date modify-horizon-config.sh helper script, this script used only for RPMBUILD and would be removed during code refractory procedure * Show floating ip in details blueprint auto-assign-floating-ip * Show floating IP checkbox only for 'routed' Set floatingIp to the unit level blueprint auto-assign-floating-ip * Add hint for fixed IP address (as placeholder) Fixes-Bug: #1272361 * Check title in mark image form Title should be unique To prevent extra api call to glance hidden fiels was used Closes-Bug: 1259522 * Remove error code from inform messages Closes-Bug: 1268929 Change-Id: Id3ad4581cd9ce40a569ac580d0aee8db0178553c
This commit is contained in:
parent
69372d0a14
commit
42db5892f6
|
@ -2,6 +2,10 @@ Murano Dashboard README
|
||||||
=====================
|
=====================
|
||||||
Dashboard is a conponent that provides Web UI to Murano Project.
|
Dashboard is a conponent that provides Web UI to Murano Project.
|
||||||
|
|
||||||
|
INSTALL FROM SOURCE
|
||||||
|
=====================
|
||||||
|
Please, use setup.sh script with root user privileges for install/uninstall of the software.
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
* `Murano <http://Murano.mirantis.com>`__
|
* `Murano <http://Murano.mirantis.com>`__
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# Copyright (c) 2013 Mirantis, Inc.
|
# Copyright (c) 2014 Mirantis, Inc.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# 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
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
@ -13,82 +13,107 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
# CentOS script.
|
# helper script.
|
||||||
|
|
||||||
LOGLVL=1
|
LOGLVL=1
|
||||||
LOG_DIR="/var/log/murano"
|
APPLICATION_NAME="murano-dashboard"
|
||||||
|
APPLICATION_LOG_DIR="/var/log/murano"
|
||||||
|
APPLICATION_CACHE_DIR="/var/cache/$APPLICATION_NAME"
|
||||||
# Functions
|
# Functions
|
||||||
# Loger function
|
# Loger function
|
||||||
log()
|
log()
|
||||||
{
|
{
|
||||||
MSG=$1
|
MSG=$1
|
||||||
if [ $LOGLVL -gt 0 ]; then
|
if [ $LOGLVL -gt 0 ]; then
|
||||||
echo "LOG:> $MSG"
|
echo "LOG:> $MSG"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# patching horizon configuration
|
# patching horizon configuration
|
||||||
modify_horizon_config() {
|
|
||||||
REMOVE=$2
|
modify_horizon_config()
|
||||||
if [ -f $1 ]; then
|
{
|
||||||
lines=$(sed -ne '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ =' $1)
|
INFILE=$1
|
||||||
|
REMOVE=$2
|
||||||
|
PATTERN='from openstack_dashboard import policy'
|
||||||
|
TMPFILE="/tmp/tmpfile"
|
||||||
|
if [ -f $INFILE ]; then
|
||||||
|
lines=$(sed -ne '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ =' $INFILE)
|
||||||
if [ -n "$lines" ]; then
|
if [ -n "$lines" ]; then
|
||||||
if [ ! -z $REMOVE ]; then
|
if [ ! -z $REMOVE ]; then
|
||||||
log "Removing our data from \"$1\"..."
|
log "Removing $APPLICATION_NAME data from \"$INFILE\"..."
|
||||||
sed -e '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ d' -i $1
|
sed -e '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ d' -i $INFILE
|
||||||
if [ $? -ne 0 ];then
|
if [ $? -ne 0 ];then
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
log "...can't modify \"$INFILE\", check permissions or something else, exiting!!!"
|
||||||
exit
|
exit 1
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
log "\"$1\" already has our data, you can change it manually and restart apache2 service"
|
log "...success"
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
log "\"$INFILE\" already has $APPLICATION_NAME data, you can change it manually and restart apache2/httpd service"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
if [ -z $REMOVE ];then
|
if [ -z "$REMOVE" ]; then
|
||||||
log "Adding our data into \"$1\"..."
|
log "Adding $APPLICATION_NAME data to \"$INFILE\"..."
|
||||||
cat >> $1 << EOF
|
rm -f $TMPFILE
|
||||||
|
cat >> $TMPFILE << EOF
|
||||||
#START_MURANO_DASHBOARD
|
#START_MURANO_DASHBOARD
|
||||||
|
#TODO: should remove the next line once https://bugs.launchpad.net/ubuntu/+source/horizon/+bug/1243187 is fixed
|
||||||
|
LOGOUT_URL = '/horizon/auth/logout/'
|
||||||
|
METADATA_CACHE_DIR = '$APPLICATION_CACHE_DIR'
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': os.path.join('$APPLICATION_DB_DIR', 'openstack-dashboard.sqlite')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
|
||||||
HORIZON_CONFIG['dashboards'] += ('murano',)
|
HORIZON_CONFIG['dashboards'] += ('murano',)
|
||||||
INSTALLED_APPS += ('muranodashboard','floppyforms',)
|
INSTALLED_APPS += ('muranodashboard','floppyforms',)
|
||||||
MIDDLEWARE_CLASSES += ('muranodashboard.middleware.ExceptionMiddleware',)
|
MIDDLEWARE_CLASSES += ('muranodashboard.middleware.ExceptionMiddleware',)
|
||||||
verbose_formatter = {'verbose': {'format': '[%(asctime)s] [%(levelname)s] [pid=%(process)d] %(message)s'}}
|
verbose_formatter = {'verbose': {'format': '[%(asctime)s] [%(levelname)s] [pid=%(process)d] %(message)s'}}
|
||||||
if 'formatters' in LOGGING: LOGGING['formatters'].update(verbose_formatter)
|
if 'formatters' in LOGGING: LOGGING['formatters'].update(verbose_formatter)
|
||||||
else: LOGGING['formatters'] = verbose_formatter
|
else: LOGGING['formatters'] = verbose_formatter
|
||||||
LOGGING['handlers']['murano-file'] = {'level': 'DEBUG', 'formatter': 'verbose', 'class': 'logging.FileHandler', 'filename': '$LOG_DIR/murano-dashboard.log'}
|
LOGGING['handlers']['murano-file'] = {'level': 'DEBUG', 'formatter': 'verbose', 'class': 'logging.FileHandler', 'filename': '$APPLICATION_LOG_DIR/murano-dashboard.log'}
|
||||||
LOGGING['loggers']['muranodashboard'] = {'handlers': ['murano-file'], 'level': 'DEBUG'}
|
LOGGING['loggers']['muranodashboard'] = {'handlers': ['murano-file'], 'level': 'DEBUG'}
|
||||||
LOGGING['loggers']['muranoclient'] = {'handlers': ['murano-file'], 'level': 'ERROR'}
|
LOGGING['loggers']['muranoclient'] = {'handlers': ['murano-file'], 'level': 'ERROR'}
|
||||||
|
ADVANCED_NETWORKING_CONFIG = {'max_environments': 100, 'max_hosts': 250, 'env_ip_template': '10.0.0.0'}
|
||||||
|
NETWORK_TOPOLOGY = 'routed'
|
||||||
#MURANO_API_URL = "http://localhost:8082"
|
#MURANO_API_URL = "http://localhost:8082"
|
||||||
#MURANO_METADATA_URL = "http://localhost:8084"
|
#MURANO_METADATA_URL = "http://localhost:8084/v1"
|
||||||
#if murano-api set up with ssl uncomment next strings
|
#if murano-api set up with ssl uncomment next strings
|
||||||
#MURANO_API_INSECURE = True
|
#MURANO_API_INSECURE = True
|
||||||
#END_MURANO_DASHBOARD
|
#END_MURANO_DASHBOARD
|
||||||
EOF
|
EOF
|
||||||
if [ $? -ne 0 ];then
|
sed -ne "/$PATTERN/r $TMPFILE" -e 1x -e '2,${x;p}' -e '${x;p}' -i $INFILE
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
if [ $? -ne 0 ];then
|
||||||
fi
|
log "Can't modify \"$INFILE\", check permissions or something else, exiting!!!"
|
||||||
fi
|
else
|
||||||
fi
|
rm -f $TMPFILE
|
||||||
else
|
log "...success"
|
||||||
echo "File \"$1\" not found, exiting!!!"
|
fi
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "File \"$1\" not found, exiting!!!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Command line args'
|
# Command line args'
|
||||||
COMMAND="$1"
|
COMMAND="$1"
|
||||||
cfg_file="/usr/share/openstack-dashboard/openstack_dashboard/settings.py"
|
cfg_file="/usr/share/openstack-dashboard/openstack_dashboard/settings.py"
|
||||||
case $COMMAND in
|
case $COMMAND in
|
||||||
install )
|
install )
|
||||||
modify_horizon_config $cfg_file
|
modify_horizon_config $cfg_file
|
||||||
;;
|
;;
|
||||||
|
|
||||||
uninstall )
|
uninstall )
|
||||||
modify_horizon_config $cfg_file remove
|
modify_horizon_config $cfg_file remove
|
||||||
;;
|
;;
|
||||||
|
|
||||||
* )
|
*)
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
|
@ -17,7 +17,7 @@ function log {
|
||||||
if [ "$DEBUGLVL" -gt 0 ]; then
|
if [ "$DEBUGLVL" -gt 0 ]; then
|
||||||
chars=$(echo "@$" | wc -c)
|
chars=$(echo "@$" | wc -c)
|
||||||
case $DEBUGLVL in
|
case $DEBUGLVL in
|
||||||
1 )
|
1)
|
||||||
echo -e "LOG:>$@"
|
echo -e "LOG:>$@"
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
|
|
|
@ -574,6 +574,15 @@ class BooleanField(forms.BooleanField, CustomPropertiesField):
|
||||||
super(BooleanField, self).__init__(*args, **kwargs)
|
super(BooleanField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class FloatingIpBooleanField(BooleanField):
|
||||||
|
@with_request
|
||||||
|
def update(self, request, environment_id, **kwargs):
|
||||||
|
env = api.environment_get(request, environment_id)
|
||||||
|
network_topology = env.networking.get('topology')
|
||||||
|
if network_topology != 'routed':
|
||||||
|
self.widget.is_hidden = True
|
||||||
|
|
||||||
|
|
||||||
class ClusterIPField(CharField):
|
class ClusterIPField(CharField):
|
||||||
existing_subnet = None
|
existing_subnet = None
|
||||||
network_topology = None
|
network_topology = None
|
||||||
|
@ -643,6 +652,7 @@ class ClusterIPField(CharField):
|
||||||
self.help_text = _('Specify valid fixed IP')
|
self.help_text = _('Specify valid fixed IP')
|
||||||
self.validators = [self.make_nova_validator(request, ip_ranges)]
|
self.validators = [self.make_nova_validator(request, ip_ranges)]
|
||||||
elif self.network_topology == 'routed':
|
elif self.network_topology == 'routed':
|
||||||
|
self.widget.attrs['placeholder'] = self.existing_subnet
|
||||||
self.validators = [self.make_neutron_validator()]
|
self.validators = [self.make_neutron_validator()]
|
||||||
else: # 'flat' topology
|
else: # 'flat' topology
|
||||||
raise NotImplementedError('Flat topology is not implemented yet')
|
raise NotImplementedError('Flat topology is not implemented yet')
|
||||||
|
|
|
@ -38,7 +38,8 @@ TYPES = {
|
||||||
'keypair': fields.KeyPairChoiceField,
|
'keypair': fields.KeyPairChoiceField,
|
||||||
'image': fields.ImageChoiceField,
|
'image': fields.ImageChoiceField,
|
||||||
'azone': fields.AZoneChoiceField,
|
'azone': fields.AZoneChoiceField,
|
||||||
'text': (fields.CharField, forms.Textarea)
|
'text': (fields.CharField, forms.Textarea),
|
||||||
|
'floatingip': fields.FloatingIpBooleanField
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,9 @@ class OverviewTab(tabs.Tab):
|
||||||
if hasattr(service_data, 'uri'):
|
if hasattr(service_data, 'uri'):
|
||||||
detail_info['Load Balancer URI'] = service_data.uri
|
detail_info['Load Balancer URI'] = service_data.uri
|
||||||
|
|
||||||
|
if hasattr(service_data, 'floatingip'):
|
||||||
|
detail_info['Floating IP'] = service_data.floatingip
|
||||||
|
|
||||||
#check for deployed services so additional information can be added
|
#check for deployed services so additional information can be added
|
||||||
units = []
|
units = []
|
||||||
for unit in service_data.units:
|
for unit in service_data.units:
|
||||||
|
@ -109,11 +112,12 @@ class OverviewTab(tabs.Tab):
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
|
|
||||||
|
unit_detail['Floating IP'] = unit.get('floatingip')
|
||||||
|
|
||||||
if len(service_data.units) > 1:
|
if len(service_data.units) > 1:
|
||||||
units.append(unit_detail)
|
units.append(unit_detail)
|
||||||
else:
|
else:
|
||||||
detail_info.update(unit_detail)
|
detail_info.update(unit_detail)
|
||||||
|
|
||||||
return {'service': detail_info, 'units': units}
|
return {'service': detail_info, 'units': units}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,17 +13,37 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
import json
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from django.forms import ValidationError
|
||||||
from horizon.forms import SelfHandlingForm
|
from horizon.forms import SelfHandlingForm
|
||||||
from horizon import messages, exceptions
|
from horizon import messages, exceptions
|
||||||
from openstack_dashboard.api import glance
|
from openstack_dashboard.api import glance
|
||||||
import json
|
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
def filter_murano_images(images, request=None):
|
||||||
|
marked_images = []
|
||||||
|
for image in images:
|
||||||
|
metadata = image.properties.get('murano_image_info')
|
||||||
|
if metadata:
|
||||||
|
try:
|
||||||
|
metadata = json.loads(metadata)
|
||||||
|
except ValueError:
|
||||||
|
msg = _('Invalid metadata for image: {0}'.format(image.id))
|
||||||
|
log.warn(msg)
|
||||||
|
if request:
|
||||||
|
exceptions.handle(request, msg)
|
||||||
|
else:
|
||||||
|
image.title = metadata.get('title', 'No Title')
|
||||||
|
image.type = metadata.get('type', 'No Type')
|
||||||
|
|
||||||
|
marked_images.append(image)
|
||||||
|
return marked_images
|
||||||
|
|
||||||
|
|
||||||
class MarkImageForm(SelfHandlingForm):
|
class MarkImageForm(SelfHandlingForm):
|
||||||
_metadata = {
|
_metadata = {
|
||||||
'windows.2012': ' Windows Server 2012',
|
'windows.2012': ' Windows Server 2012',
|
||||||
|
@ -34,6 +54,7 @@ class MarkImageForm(SelfHandlingForm):
|
||||||
image = forms.ChoiceField(label='Image')
|
image = forms.ChoiceField(label='Image')
|
||||||
title = forms.CharField(max_length="255", label=_("Title"))
|
title = forms.CharField(max_length="255", label=_("Title"))
|
||||||
type = forms.ChoiceField(label="Type", choices=_metadata.items())
|
type = forms.ChoiceField(label="Type", choices=_metadata.items())
|
||||||
|
existing_titles = forms.CharField(widget=forms.HiddenInput)
|
||||||
|
|
||||||
def __init__(self, request, *args, **kwargs):
|
def __init__(self, request, *args, **kwargs):
|
||||||
super(MarkImageForm, self).__init__(request, *args, **kwargs)
|
super(MarkImageForm, self).__init__(request, *args, **kwargs)
|
||||||
|
@ -46,6 +67,8 @@ class MarkImageForm(SelfHandlingForm):
|
||||||
exceptions.handle(request, _('Unable to retrieve list of images'))
|
exceptions.handle(request, _('Unable to retrieve list of images'))
|
||||||
|
|
||||||
self.fields['image'].choices = [(i.id, i.name) for i in images]
|
self.fields['image'].choices = [(i.id, i.name) for i in images]
|
||||||
|
self.fields['existing_titles'].initial = \
|
||||||
|
[image.title for image in filter_murano_images(images)]
|
||||||
|
|
||||||
def handle(self, request, data):
|
def handle(self, request, data):
|
||||||
log.debug('Marking image with specified metadata: {0}'.format(data))
|
log.debug('Marking image with specified metadata: {0}'.format(data))
|
||||||
|
@ -65,3 +88,13 @@ class MarkImageForm(SelfHandlingForm):
|
||||||
except Exception:
|
except Exception:
|
||||||
exceptions.handle(request, _('Unable to mark image'),
|
exceptions.handle(request, _('Unable to mark image'),
|
||||||
redirect='horizon:murano:images:index')
|
redirect='horizon:murano:images:index')
|
||||||
|
|
||||||
|
def clean_title(self):
|
||||||
|
cleaned_data = super(MarkImageForm, self).clean()
|
||||||
|
title = cleaned_data.get('title')
|
||||||
|
existing_titles = self.fields['existing_titles'].initial
|
||||||
|
if title in existing_titles:
|
||||||
|
raise ValidationError(_('Specified title already in use.'
|
||||||
|
' Please choose another one.'))
|
||||||
|
|
||||||
|
return title
|
||||||
|
|
|
@ -13,21 +13,15 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import json
|
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse, reverse_lazy
|
from django.core.urlresolvers import reverse, reverse_lazy
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from openstack_dashboard.api import glance
|
from openstack_dashboard.api import glance
|
||||||
from horizon import exceptions
|
from horizon import exceptions
|
||||||
from horizon import tables
|
from horizon import tables
|
||||||
from horizon import messages
|
|
||||||
from horizon.forms.views import ModalFormView
|
from horizon.forms.views import ModalFormView
|
||||||
from .tables import MarkedImagesTable
|
from .tables import MarkedImagesTable
|
||||||
|
from .forms import MarkImageForm, filter_murano_images
|
||||||
from .forms import MarkImageForm
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class MarkedImagesView(tables.DataTableView):
|
class MarkedImagesView(tables.DataTableView):
|
||||||
|
@ -43,23 +37,7 @@ class MarkedImagesView(tables.DataTableView):
|
||||||
uri = reverse('horizon:murano:images:index')
|
uri = reverse('horizon:murano:images:index')
|
||||||
|
|
||||||
exceptions.handle(self.request, msg, redirect=uri)
|
exceptions.handle(self.request, msg, redirect=uri)
|
||||||
|
return filter_murano_images(images, request=self.request)
|
||||||
marked_images = []
|
|
||||||
for image in images:
|
|
||||||
metadata = image.properties.get('murano_image_info')
|
|
||||||
if metadata:
|
|
||||||
try:
|
|
||||||
metadata = json.loads(metadata)
|
|
||||||
except ValueError:
|
|
||||||
msg = _('Invalid metadata for image: {0}'.format(image.id))
|
|
||||||
LOG.warn(msg)
|
|
||||||
messages.error(self.request, msg)
|
|
||||||
else:
|
|
||||||
image.title = metadata.get('title', 'No Title')
|
|
||||||
image.type = metadata.get('type', 'No Type')
|
|
||||||
|
|
||||||
marked_images.append(image)
|
|
||||||
return marked_images
|
|
||||||
|
|
||||||
|
|
||||||
class MarkImageView(ModalFormView):
|
class MarkImageView(ModalFormView):
|
||||||
|
|
|
@ -39,8 +39,7 @@ class UploadServiceForm(SelfHandlingForm):
|
||||||
log.exception(_('Uploading service failed'))
|
log.exception(_('Uploading service failed'))
|
||||||
redirect = reverse('horizon:murano:service_catalog:index')
|
redirect = reverse('horizon:murano:service_catalog:index')
|
||||||
exceptions.handle(request,
|
exceptions.handle(request,
|
||||||
_('Unable to upload service. '
|
_('Unable to upload service'),
|
||||||
'Error code: {0}'.format(e.code)),
|
|
||||||
redirect=redirect)
|
redirect=redirect)
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,10 +75,8 @@ class UploadFileToService(SelfHandlingForm):
|
||||||
redirect = reverse('horizon:murano:service_catalog:manage_service',
|
redirect = reverse('horizon:murano:service_catalog:manage_service',
|
||||||
args=(self.service_id,))
|
args=(self.service_id,))
|
||||||
log.exception(_('Uploading file failed'))
|
log.exception(_('Uploading file failed'))
|
||||||
msg = _("Unable to upload {0} file of '{1}' type."
|
msg = _("Unable to upload {0} file of "
|
||||||
" Error code: {2}".format(filename,
|
"'{1}' type".format(filename, self.data_type))
|
||||||
self.data_type,
|
|
||||||
e.code))
|
|
||||||
exceptions.handle(request, msg, redirect=redirect)
|
exceptions.handle(request, msg, redirect=redirect)
|
||||||
|
|
||||||
def clean_file(self):
|
def clean_file(self):
|
||||||
|
@ -118,8 +115,6 @@ class UploadFileForm(UploadFileToService):
|
||||||
redirect = reverse('horizon:murano:service_catalog:manage_files')
|
redirect = reverse('horizon:murano:service_catalog:manage_files')
|
||||||
log.exception(_('Uploading file or '
|
log.exception(_('Uploading file or '
|
||||||
'modifying service manifest file failed'))
|
'modifying service manifest file failed'))
|
||||||
msg = _("Unable to upload {0} file of '{1}' type."
|
msg = _("Unable to upload {0} file "
|
||||||
" Error code: {2}".format(filename,
|
"of '{1}' type.".format(filename, self.data_type))
|
||||||
self.data_type,
|
|
||||||
e.code))
|
|
||||||
exceptions.handle(request, msg, redirect=redirect)
|
exceptions.handle(request, msg, redirect=redirect)
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
pbr>=0.5.21,<1.0
|
pbr>=0.5.21,<1.0
|
||||||
anyjson>=0.3.3
|
anyjson>=0.3.3
|
||||||
|
|
||||||
bunch
|
bunch
|
||||||
iso8601>=0.1.8
|
iso8601>=0.1.8
|
||||||
six>=1.4.1
|
six>=1.4.1
|
||||||
|
@ -8,5 +7,5 @@ PyYAML>=3.1.0
|
||||||
django-floppyforms==1.1
|
django-floppyforms==1.1
|
||||||
ordereddict
|
ordereddict
|
||||||
yaql==0.2
|
yaql==0.2
|
||||||
http://tarballs.openstack.org/python-muranoclient/python-muranoclient-master.tar.gz#egg=muranoclient-0.4
|
python-muranoclient==0.4.1
|
||||||
http://tarballs.openstack.org/murano-metadataclient/murano-metadataclient-master.tar.gz#egg=metadataclient-0.4
|
murano-metadataclient==0.4.1
|
||||||
|
|
343
setup-centos.sh
343
setup-centos.sh
|
@ -1,343 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# 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.
|
|
||||||
#
|
|
||||||
# CentOS script.
|
|
||||||
|
|
||||||
LOGLVL=1
|
|
||||||
SERVICE_CONTENT_DIRECTORY=`cd $(dirname "$0") && pwd`
|
|
||||||
PREREQ_PKGS="wget make git python-pip mysql-connector-python python-devel unzip libffi-devel"
|
|
||||||
PIPAPPS="pip python-pip pip-python"
|
|
||||||
PIPCMD=""
|
|
||||||
SERVICE_SRV_NAME="murano-dashboard"
|
|
||||||
GIT_CLONE_DIR=`echo $SERVICE_CONTENT_DIRECTORY | sed -e "s/$SERVICE_SRV_NAME//"`
|
|
||||||
HORIZON_CONFIGS="/opt/stack/horizon/openstack_dashboard/settings.py,/usr/share/openstack-dashboard/openstack_dashboard/settings.py"
|
|
||||||
APACHE_USER=apache
|
|
||||||
APACHE_GROUP=apache
|
|
||||||
LOG_DIR="/var/log/murano/"
|
|
||||||
|
|
||||||
# Functions
|
|
||||||
# Loger function
|
|
||||||
log()
|
|
||||||
{
|
|
||||||
MSG=$1
|
|
||||||
if [ $LOGLVL -gt 0 ]; then
|
|
||||||
echo "LOG:> $MSG"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check or install package
|
|
||||||
in_sys_pkg()
|
|
||||||
{
|
|
||||||
PKG=$1
|
|
||||||
rpm -q $PKG > /dev/null 2>&1
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
log "Package \"$PKG\" already installed"
|
|
||||||
else
|
|
||||||
log "Installing \"$PKG\"..."
|
|
||||||
yum install $PKG --assumeyes > /dev/null 2>&1
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "installation fails, exiting!!!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# find pip
|
|
||||||
find_pip()
|
|
||||||
{
|
|
||||||
for cmd in $PIPAPPS
|
|
||||||
do
|
|
||||||
_cmd=$(which $cmd 2>/dev/null)
|
|
||||||
if [ $? -eq 0 ];then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ -z $_cmd ];then
|
|
||||||
echo "Can't find \"pip\" in system, please install it first, exiting!"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
PIPCMD=$_cmd
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# git clone
|
|
||||||
gitclone()
|
|
||||||
{
|
|
||||||
FROM=$1
|
|
||||||
CLONEROOT=$2
|
|
||||||
log "Cloning from \"$FROM\" repo to \"$CLONEROOT\""
|
|
||||||
cd $CLONEROOT && git clone $FROM > /dev/null 2>&1
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "cloning from \"$FROM\" fails, exiting!!!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# patching horizon configuration
|
|
||||||
modify_horizon_config() {
|
|
||||||
REMOVE=$2
|
|
||||||
if [ -f $1 ]; then
|
|
||||||
lines=$(sed -ne '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ =' $1)
|
|
||||||
if [ -n "$lines" ]; then
|
|
||||||
if [ ! -z $REMOVE ]; then
|
|
||||||
log "Removing our data from \"$1\"..."
|
|
||||||
sed -e '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ d' -i $1
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "\"$1\" already has our data, you can change it manualy and restart apache2 service"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
if [ -z $REMOVE ];then
|
|
||||||
log "Adding our data into \"$1\"..."
|
|
||||||
cat >> $1 << EOF
|
|
||||||
#START_MURANO_DASHBOARD
|
|
||||||
#TODO: should remove the next line once https://bugs.launchpad.net/ubuntu/+source/horizon/+bug/1243187 is fixed
|
|
||||||
LOGOUT_URL = '/dashboard/auth/logout/'
|
|
||||||
import tempfile
|
|
||||||
METADATA_CACHE_DIR = os.path.join(tempfile.gettempdir(), 'muranodashboard-cache')
|
|
||||||
DATABASES = {
|
|
||||||
'default': {
|
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
|
||||||
'NAME': os.path.join(METADATA_CACHE_DIR, 'openstack-dashboard.sqlite')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
|
|
||||||
HORIZON_CONFIG['dashboards'] += ('murano',)
|
|
||||||
INSTALLED_APPS += ('muranodashboard','floppyforms',)
|
|
||||||
MIDDLEWARE_CLASSES += ('muranodashboard.middleware.ExceptionMiddleware',)
|
|
||||||
verbose_formatter = {'verbose': {'format': '[%(asctime)s] [%(levelname)s] [pid=%(process)d] %(message)s'}}
|
|
||||||
if 'formatters' in LOGGING: LOGGING['formatters'].update(verbose_formatter)
|
|
||||||
else: LOGGING['formatters'] = verbose_formatter
|
|
||||||
LOGGING['handlers']['murano-file'] = {'level': 'DEBUG', 'formatter': 'verbose', 'class': 'logging.FileHandler', 'filename': '$LOG_DIR/murano-dashboard.log'}
|
|
||||||
LOGGING['loggers']['muranodashboard'] = {'handlers': ['murano-file'], 'level': 'DEBUG'}
|
|
||||||
LOGGING['loggers']['muranoclient'] = {'handlers': ['murano-file'], 'level': 'ERROR'}
|
|
||||||
#MURANO_API_URL = "http://localhost:8082"
|
|
||||||
#MURANO_METADATA_URL = "http://localhost:8084/v1"
|
|
||||||
#if murano-api set up with ssl uncomment next strings
|
|
||||||
#MURANO_API_INSECURE = True
|
|
||||||
ADVANCED_NETWORKING_CONFIG = {'max_environments': 100, 'max_hosts': 250, 'env_ip_template': '10.0.0.0'}
|
|
||||||
NETWORK_TOPOLOGY = 'routed'
|
|
||||||
#END_MURANO_DASHBOARD
|
|
||||||
EOF
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "File \"$1\" not found, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# searching horizon configuration
|
|
||||||
find_horizon_config()
|
|
||||||
{
|
|
||||||
FOUND=0
|
|
||||||
for cfg_file in $(echo $HORIZON_CONFIGS | sed 's/,/ /g' )
|
|
||||||
do
|
|
||||||
if [ -e $cfg_file ];then
|
|
||||||
log "Horizon config found at \"$cfg_file\""
|
|
||||||
modify_horizon_config $cfg_file $1
|
|
||||||
FOUND=1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
if [ $FOUND -eq 0 ];then
|
|
||||||
log "Horizon config not found or openstack-dashboard does not installed, to override this set proper \"HORIZON_CONFIGS\" variable, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# preinstall checks
|
|
||||||
preinst()
|
|
||||||
{
|
|
||||||
# check openstack-dashboard installed from system packages
|
|
||||||
_PKG=openstack-dashboard
|
|
||||||
rpm -q $_PKG > /dev/null 2>&1
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "Package \"$_PKG\" is not installed."
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# rebuild static
|
|
||||||
rebuildstatic()
|
|
||||||
{
|
|
||||||
horizon_manage=$(rpm -ql openstack-dashboard | grep -E "*manage.py$")
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "openstack-dashboard manage.py not found, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
_old_murano_static="$(dirname $horizon_manage)/openstack_dashboard/static/muranodashboard"
|
|
||||||
if [ -d "$_old_murano_static" ];then
|
|
||||||
log "Our static for \"muranodashboard\" found under \"HORIZON\" STATIC, deleting \"$_old_murano_static\"..."
|
|
||||||
rm -rf $_old_murano_static
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "Can't delete \"$_old_murano_static\, WARNING!!!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
log "Rebuilding STATIC...."
|
|
||||||
python $horizon_manage collectstatic --noinput
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "\"$horizon_manage\" collectstatic failed, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
log "Creating db for storing sessions..."
|
|
||||||
python $horizon_manage syncdb --noinput
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "\"$horizon_manage\" syncdb failed, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# postinstall
|
|
||||||
postinst()
|
|
||||||
{
|
|
||||||
rebuildstatic
|
|
||||||
sleep 2
|
|
||||||
chown $APACHE_USER:$APACHE_GROUP $LOG_DIR/murano-dashboard.log
|
|
||||||
chown -R $APACHE_USER:$APACHE_GROUP /var/lib/openstack-dashboard
|
|
||||||
service httpd restart
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
# install
|
|
||||||
inst()
|
|
||||||
{
|
|
||||||
CLONE_FROM_GIT=$1
|
|
||||||
# Checking packages
|
|
||||||
for PKG in $PREREQ_PKGS
|
|
||||||
do
|
|
||||||
in_sys_pkg $PKG
|
|
||||||
done
|
|
||||||
# Find python pip
|
|
||||||
find_pip
|
|
||||||
preinst
|
|
||||||
# If clone from git set
|
|
||||||
if [ ! -z $CLONE_FROM_GIT ]; then
|
|
||||||
# Preparing clone root directory
|
|
||||||
if [ ! -d $GIT_CLONE_DIR ];then
|
|
||||||
log "Creating $GIT_CLONE_DIR direcory..."
|
|
||||||
mkdir -p $GIT_CLONE_DIR
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't create $GIT_CLONE_DIR, exiting!!!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Cloning from GIT
|
|
||||||
GIT_WEBPATH_PRFX="https://github.com/stackforge/"
|
|
||||||
gitclone "$GIT_WEBPATH_PRFX$SERVICE_SRV_NAME.git" $GIT_CLONE_DIR
|
|
||||||
# End clone from git section
|
|
||||||
fi
|
|
||||||
# Setupping...
|
|
||||||
log "Running setup.py"
|
|
||||||
MRN_CND_SPY=$SERVICE_CONTENT_DIRECTORY/setup.py
|
|
||||||
if [ -e $MRN_CND_SPY ]; then
|
|
||||||
chmod +x $MRN_CND_SPY
|
|
||||||
log "$MRN_CND_SPY output:_____________________________________________________________"
|
|
||||||
## Setup through pip
|
|
||||||
# Creating tarball
|
|
||||||
rm -rf $SERVICE_CONTENT_DIRECTORY/*.egg-info
|
|
||||||
cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY egg_info
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "\"$MRN_CND_SPY\" egg info creation FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
rm -rf $SERVICE_CONTENT_DIRECTORY/dist
|
|
||||||
cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY sdist
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "\"$MRN_CND_SPY\" tarball creation FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Running tarball install
|
|
||||||
TRBL_FILE=$(basename `ls $SERVICE_CONTENT_DIRECTORY/dist/*.tar.gz`)
|
|
||||||
$PIPCMD install $SERVICE_CONTENT_DIRECTORY/dist/$TRBL_FILE
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "$PIPCMD install \"$TRBL_FILE\" FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Creating log directory for the murano
|
|
||||||
if [ ! -d $LOG_DIR ];then
|
|
||||||
log "Creating $LOG_DIR direcory..."
|
|
||||||
mkdir -p $LOG_DIR
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't create $LOG_DIR, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
chmod -R a+rw $LOG_DIR
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "$MRN_CND_SPY not found!"
|
|
||||||
fi
|
|
||||||
# add apache to autostart
|
|
||||||
chkconfig --add httpd
|
|
||||||
chkconfig httpd on
|
|
||||||
}
|
|
||||||
|
|
||||||
# uninstall
|
|
||||||
uninst()
|
|
||||||
{
|
|
||||||
# Uninstall trough pip
|
|
||||||
find_pip
|
|
||||||
# looking up for python package installed
|
|
||||||
PYPKG=`echo $SERVICE_SRV_NAME | tr -d '-'`
|
|
||||||
_pkg=$($PIPCMD freeze | grep $PYPKG)
|
|
||||||
if [ $? -eq 0 ]; then
|
|
||||||
log "Removing package \"$PYPKG\" with pip"
|
|
||||||
$PIPCMD uninstall $_pkg --yes
|
|
||||||
else
|
|
||||||
log "Python package \"$PYPKG\" not found"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
# Command line args'
|
|
||||||
COMMAND="$1"
|
|
||||||
case $COMMAND in
|
|
||||||
testinstall )
|
|
||||||
find_horizon_config
|
|
||||||
postinst
|
|
||||||
;;
|
|
||||||
|
|
||||||
testuninstall )
|
|
||||||
find_horizon_config remove
|
|
||||||
postinst
|
|
||||||
;;
|
|
||||||
|
|
||||||
install )
|
|
||||||
inst
|
|
||||||
find_horizon_config
|
|
||||||
postinst
|
|
||||||
;;
|
|
||||||
|
|
||||||
installfromgit )
|
|
||||||
inst "yes"
|
|
||||||
find_horizon_config
|
|
||||||
postinst
|
|
||||||
;;
|
|
||||||
|
|
||||||
uninstall )
|
|
||||||
log "Uninstalling \"$SERVICE_SRV_NAME\" from system..."
|
|
||||||
uninst
|
|
||||||
find_horizon_config remove
|
|
||||||
postinst
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo -e "Usage: $(basename "$0") command \nCommands:\n\tinstall - Install $SERVICE_SRV_NAME software\n\tuninstall - Uninstall $SERVICE_SRV_NAME software"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
name = murano-dashboard
|
name = murano-dashboard
|
||||||
version = 0.4
|
version = 0.4.1
|
||||||
summary = The Murano Dashboard
|
summary = The Murano Dashboard
|
||||||
description-file =
|
description-file =
|
||||||
README.rst
|
README.rst
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
# Copyright (c) 2013 Mirantis, Inc.
|
# Copyright (c) 2014 Mirantis, Inc.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# 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
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
@ -13,87 +13,169 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
# Ubuntu script.
|
RUN_DIR=$(cd $(dirname "$0") && pwd)
|
||||||
|
INC_FILE="$RUN_DIR/common.inc"
|
||||||
LOGLVL=1
|
if [ -f "$INC_FILE" ]; then
|
||||||
SERVICE_CONTENT_DIRECTORY=`cd $(dirname "$0") && pwd`
|
source "$INC_FILE"
|
||||||
PREREQ_PKGS="wget make git python-pip python-dev python-mysqldb libxml2-dev libxslt-dev unzip libffi-dev"
|
else
|
||||||
SERVICE_SRV_NAME="murano-dashboard"
|
echo "Can't load \"$INC_FILE\" or file not found, exiting!"
|
||||||
GIT_CLONE_DIR=`echo $SERVICE_CONTENT_DIRECTORY | sed -e "s/$SERVICE_SRV_NAME//"`
|
exit 1
|
||||||
|
fi
|
||||||
|
#
|
||||||
|
WEB_SERVICE_SYSNAME=${WEB_SERVICE_SYSNAME:-httpd}
|
||||||
|
WEB_SERVICE_USER=${WEB_SERVICE_USER:-apache}
|
||||||
|
WEB_SERVICE_GROUP=${WEB_SERVICE_GROUP:-apache}
|
||||||
|
APPLICATION_NAME="murano-dashboard"
|
||||||
|
APPLICATION_LOG_DIR="/var/log/$APPLICATION_NAME"
|
||||||
|
APPLICATION_CACHE_DIR="/var/cache/$APPLICATION_NAME"
|
||||||
|
APPLICATION_DB_DIR="/var/lib/openstack-dashboard"
|
||||||
|
LOGFILE="/tmp/${APPLICATION_NAME}_install.log"
|
||||||
HORIZON_CONFIGS="/opt/stack/horizon/openstack_dashboard/settings.py,/usr/share/openstack-dashboard/openstack_dashboard/settings.py"
|
HORIZON_CONFIGS="/opt/stack/horizon/openstack_dashboard/settings.py,/usr/share/openstack-dashboard/openstack_dashboard/settings.py"
|
||||||
APACHE_USER=horizon
|
common_pkgs="wget git make gcc python-pip python-setuptools unzip"
|
||||||
APACHE_GROUP=horizon
|
# Distro-specific package namings
|
||||||
LOG_DIR="/var/log/murano/"
|
debian_pkgs="python-dev python-mysqldb libxml2-dev libxslt1-dev libffi-dev mysql-client memcached apache2 libapache2-mod-wsgi openstack-dashboard"
|
||||||
|
redhat_pkgs="python-devel MySQL-python libxml2-devel libxslt-devel libffi-devel mysql memcached httpd python-memcached mod_wsgi openstack-dashboard python-netaddr"
|
||||||
|
#
|
||||||
|
get_os
|
||||||
|
eval req_pkgs="\$$(lowercase $DISTRO_BASED_ON)_pkgs"
|
||||||
|
REQ_PKGS="$common_pkgs $req_pkgs"
|
||||||
|
|
||||||
# Functions
|
function install_prerequisites()
|
||||||
# Logger function
|
|
||||||
log()
|
|
||||||
{
|
{
|
||||||
MSG=$1
|
retval=0
|
||||||
if [ $LOGLVL -gt 0 ]; then
|
_dist=$(lowercase $DISTRO_BASED_ON)
|
||||||
echo "LOG:> $MSG"
|
log "Adding Extra repos, updating..."
|
||||||
fi
|
case $_dist in
|
||||||
|
"debian")
|
||||||
|
find_or_install "python-software-properties"
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
retval=1
|
||||||
|
return $retval
|
||||||
|
fi
|
||||||
|
find /var/lib/apt/lists/ -name "*cloud.archive*" | grep -q "havana_main"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
add-apt-repository -y cloud-archive:havana >> $LOGFILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "... can't enable \"cloud-archive:havana\", exiting !"
|
||||||
|
retval=1
|
||||||
|
return $retval
|
||||||
|
fi
|
||||||
|
apt-get update -y
|
||||||
|
apt-get upgrade -y
|
||||||
|
log "..success"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
"redhat")
|
||||||
|
$(yum repolist | grep -qoE "epel") || rpm -ivh "http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm" >> $LOGFILE 2>&1
|
||||||
|
$(yum repolist | grep -qoE "openstack-havana") || rpm -ivh "http://rdo.fedorapeople.org/openstack-havana/rdo-release-havana.rpm" >> $LOGFILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "... can't enable EPEL6 or RDO, exiting!"
|
||||||
|
retval=1
|
||||||
|
return $retval
|
||||||
|
fi
|
||||||
|
yum --quiet makecache
|
||||||
|
log "..success"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
for pack in $REQ_PKGS
|
||||||
|
do
|
||||||
|
find_or_install "$pack"
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
retval=1
|
||||||
|
break
|
||||||
|
else
|
||||||
|
retval=0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return $retval
|
||||||
}
|
}
|
||||||
|
function make_tarball()
|
||||||
# Check or install package
|
|
||||||
in_sys_pkg()
|
|
||||||
{
|
{
|
||||||
PKG=$1
|
retval=0
|
||||||
dpkg -s $PKG > /dev/null 2>&1
|
log "Preparing tarball package..."
|
||||||
if [ $? -eq 0 ]; then
|
setuppy="$RUN_DIR/setup.py"
|
||||||
log "Package \"$PKG\" already installed"
|
if [ -e "$setuppy" ]; then
|
||||||
else
|
chmod +x $setuppy
|
||||||
log "Installing \"$PKG\"..."
|
rm -rf $RUN_DIR/*.egg-info
|
||||||
apt-get install $PKG --yes > /dev/null 2>&1
|
cd $RUN_DIR && python $setuppy egg_info > /dev/null 2>&1
|
||||||
if [ $? -ne 0 ];then
|
if [ $? -ne 0 ];then
|
||||||
log "installation fails, exiting!!!"
|
log "...\"$setuppy\" egg info creation fails, exiting!!!"
|
||||||
exit
|
retval=1
|
||||||
fi
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
rm -rf $RUN_DIR/dist/*
|
||||||
|
log "...\"setup.py sdist\" output will be recorded in \"$LOGFILE\""
|
||||||
|
cd $RUN_DIR && $setuppy sdist >> $LOGFILE 2>&1
|
||||||
|
if [ $? -ne 0 ];then
|
||||||
|
log "...\"$setuppy\" tarball creation fails, exiting!!!"
|
||||||
|
retval=1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
#TRBL_FILE=$(basename $(ls $RUN_DIR/dist/*.tar.gz | head -n 1))
|
||||||
|
TRBL_FILE=$(ls $RUN_DIR/dist/*.tar.gz | head -n 1)
|
||||||
|
if [ ! -e "$TRBL_FILE" ]; then
|
||||||
|
log "...tarball not found, exiting!"
|
||||||
|
retval=1
|
||||||
|
else
|
||||||
|
log "...success, tarball created as \"$TRBL_FILE\""
|
||||||
|
retval=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "...\"$setuppy\" not found, exiting!"
|
||||||
|
retval=1
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
}
|
}
|
||||||
|
function run_pip_install()
|
||||||
# git clone
|
|
||||||
gitclone()
|
|
||||||
{
|
{
|
||||||
FROM=$1
|
find_pip
|
||||||
CLONEROOT=$2
|
retval=0
|
||||||
log "Cloning from \"$FROM\" repo to \"$CLONEROOT\""
|
tarball_file=${1:-$TRBL_FILE}
|
||||||
cd $CLONEROOT && git clone $FROM > /dev/null 2>&1
|
log "Running \"$PIPCMD install $PIPARGS $tarball_file\" output will be recorded in \"$LOGFILE\""
|
||||||
if [ $? -ne 0 ];then
|
$PIPCMD install $PIPARGS $tarball_file >> $LOGFILE 2>&1
|
||||||
log "cloning from \"$FROM\" fails, exiting!!!"
|
if [ $? -ne 0 ]; then
|
||||||
exit
|
log "...pip install fails, exiting!"
|
||||||
fi
|
retval=1
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
}
|
}
|
||||||
|
modify_horizon_config()
|
||||||
# patching horizon configuration
|
{
|
||||||
modify_horizon_config() {
|
INFILE=$1
|
||||||
REMOVE=$2
|
REMOVE=$2
|
||||||
if [ -f $1 ]; then
|
PATTERN='from openstack_dashboard import policy'
|
||||||
lines=$(sed -ne '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ =' $1)
|
TMPFILE="./tmpfile"
|
||||||
if [ -n "$lines" ]; then
|
retval=0
|
||||||
if [ ! -z $REMOVE ]; then
|
if [ -f $INFILE ]; then
|
||||||
log "Removing our data from \"$1\"..."
|
lines=$(sed -ne '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ =' $INFILE)
|
||||||
sed -e '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ d' -i $1
|
if [ -n "$lines" ]; then
|
||||||
if [ $? -ne 0 ];then
|
if [ ! -z $REMOVE ]; then
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
log "Removing $APPLICATION_NAME data from \"$INFILE\"..."
|
||||||
exit
|
sed -e '/^#START_MURANO_DASHBOARD/,/^#END_MURANO_DASHBOARD/ d' -i $INFILE
|
||||||
fi
|
if [ $? -ne 0 ];then
|
||||||
else
|
log "...can't modify \"$INFILE\", check permissions or something else, exiting!!!"
|
||||||
log "\"$1\" already has our data, you can change it manually and restart apache2 service"
|
retval=1
|
||||||
fi
|
return $retval
|
||||||
else
|
else
|
||||||
if [ -z $REMOVE ];then
|
log "...success"
|
||||||
log "Adding our data into \"$1\"..."
|
fi
|
||||||
cat >> $1 << EOF
|
else
|
||||||
|
log "\"$INFILE\" already has $APPLICATION_NAME data, you can change it manually and restart apache2/httpd service"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ -z "$REMOVE" ]; then
|
||||||
|
log "Adding $APPLICATION_NAME data to \"$INFILE\"..."
|
||||||
|
rm -f $TMPFILE
|
||||||
|
cat >> $TMPFILE << EOF
|
||||||
#START_MURANO_DASHBOARD
|
#START_MURANO_DASHBOARD
|
||||||
#TODO: should remove the next line once https://bugs.launchpad.net/ubuntu/+source/horizon/+bug/1243187 is fixed
|
#TODO: should remove the next line once https://bugs.launchpad.net/ubuntu/+source/horizon/+bug/1243187 is fixed
|
||||||
LOGOUT_URL = '/horizon/auth/logout/'
|
LOGOUT_URL = '/horizon/auth/logout/'
|
||||||
import tempfile
|
METADATA_CACHE_DIR = '$APPLICATION_CACHE_DIR'
|
||||||
METADATA_CACHE_DIR = os.path.join(tempfile.gettempdir(), 'muranodashboard-cache')
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
'ENGINE': 'django.db.backends.sqlite3',
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
'NAME': os.path.join(METADATA_CACHE_DIR, 'openstack-dashboard.sqlite')
|
'NAME': os.path.join('$APPLICATION_DB_DIR', 'openstack-dashboard.sqlite')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
|
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
|
||||||
|
@ -103,207 +185,213 @@ MIDDLEWARE_CLASSES += ('muranodashboard.middleware.ExceptionMiddleware',)
|
||||||
verbose_formatter = {'verbose': {'format': '[%(asctime)s] [%(levelname)s] [pid=%(process)d] %(message)s'}}
|
verbose_formatter = {'verbose': {'format': '[%(asctime)s] [%(levelname)s] [pid=%(process)d] %(message)s'}}
|
||||||
if 'formatters' in LOGGING: LOGGING['formatters'].update(verbose_formatter)
|
if 'formatters' in LOGGING: LOGGING['formatters'].update(verbose_formatter)
|
||||||
else: LOGGING['formatters'] = verbose_formatter
|
else: LOGGING['formatters'] = verbose_formatter
|
||||||
LOGGING['handlers']['murano-file'] = {'level': 'DEBUG', 'formatter': 'verbose', 'class': 'logging.FileHandler', 'filename': '$LOG_DIR/murano-dashboard.log'}
|
LOGGING['handlers']['murano-file'] = {'level': 'DEBUG', 'formatter': 'verbose', 'class': 'logging.FileHandler', 'filename': '$APPLICATION_LOG_DIR/murano-dashboard.log'}
|
||||||
LOGGING['loggers']['muranodashboard'] = {'handlers': ['murano-file'], 'level': 'DEBUG'}
|
LOGGING['loggers']['muranodashboard'] = {'handlers': ['murano-file'], 'level': 'DEBUG'}
|
||||||
LOGGING['loggers']['muranoclient'] = {'handlers': ['murano-file'], 'level': 'ERROR'}
|
LOGGING['loggers']['muranoclient'] = {'handlers': ['murano-file'], 'level': 'ERROR'}
|
||||||
|
ADVANCED_NETWORKING_CONFIG = {'max_environments': 100, 'max_hosts': 250, 'env_ip_template': '10.0.0.0'}
|
||||||
|
NETWORK_TOPOLOGY = 'routed'
|
||||||
#MURANO_API_URL = "http://localhost:8082"
|
#MURANO_API_URL = "http://localhost:8082"
|
||||||
#MURANO_METADATA_URL = "http://localhost:8084/v1"
|
#MURANO_METADATA_URL = "http://localhost:8084/v1"
|
||||||
#if murano-api set up with ssl uncomment next strings
|
#if murano-api set up with ssl uncomment next strings
|
||||||
#MURANO_API_INSECURE = True
|
#MURANO_API_INSECURE = True
|
||||||
ADVANCED_NETWORKING_CONFIG = {'max_environments': 100, 'max_hosts': 250, 'env_ip_template': '10.0.0.0'}
|
|
||||||
NETWORK_TOPOLOGY = 'routed'
|
|
||||||
#END_MURANO_DASHBOARD
|
#END_MURANO_DASHBOARD
|
||||||
EOF
|
EOF
|
||||||
if [ $? -ne 0 ];then
|
sed -ne "/$PATTERN/r $TMPFILE" -e 1x -e '2,${x;p}' -e '${x;p}' -i $INFILE
|
||||||
log "Can't modify \"$1\", check permissions or something else, exiting!!!"
|
if [ $? -ne 0 ];then
|
||||||
fi
|
log "Can't modify \"$INFILE\", check permissions or something else, exiting!!!"
|
||||||
fi
|
else
|
||||||
fi
|
rm -f $TMPFILE
|
||||||
else
|
log "...success"
|
||||||
echo "File \"$1\" not found, exiting!!!"
|
fi
|
||||||
exit 1
|
fi
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "File \"$1\" not found, exiting!!!"
|
||||||
|
retval=1
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
function find_horizon_config()
|
||||||
|
{
|
||||||
|
retval=0
|
||||||
|
for cfg_file in $(echo $HORIZON_CONFIGS | sed 's/,/ /')
|
||||||
|
do
|
||||||
|
if [ -e "$cfg_file" ]; then
|
||||||
|
log "Horizon config found at \"$cfg_file\""
|
||||||
|
modify_horizon_config $cfg_file $1
|
||||||
|
retval=0
|
||||||
|
break
|
||||||
|
else
|
||||||
|
retval=1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ $retval -eq 1 ]; then
|
||||||
|
log "Horizon config not found or openstack-dashboard does not installed, to override this set proper \"HORIZON_CONFIGS\" variable, exiting!!!"
|
||||||
|
#exit 1
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
}
|
}
|
||||||
|
|
||||||
# searching horizon configuration
|
function prepare_db()
|
||||||
find_horizon_config()
|
|
||||||
{
|
{
|
||||||
FOUND=0
|
horizon_manage=$1
|
||||||
for cfg_file in $(echo $HORIZON_CONFIGS | sed 's/,/ /' )
|
retval=0
|
||||||
do
|
log "Creating db for storing sessions..."
|
||||||
if [ -e $cfg_file ];then
|
#python $horizon_manage syncdb --noinput
|
||||||
log "Horizon config found at \"$cfg_file\""
|
su -c "python $horizon_manage syncdb --noinput >> $LOGFILE 2>&1" -s /bin/bash $WEB_SERVICE_USER
|
||||||
modify_horizon_config $cfg_file $1
|
if [ $? -ne 0 ]; then
|
||||||
FOUND=1
|
log "...\"$horizon_manage\" syncdb failed, exiting!!!"
|
||||||
fi
|
retval=1
|
||||||
done
|
else
|
||||||
if [ $FOUND -eq 0 ];then
|
log "..success"
|
||||||
log "Horizon config not found or openstack-dashboard does not installed, to override this set proper \"HORIZON_CONFIGS\" variable, exiting!!!"
|
fi
|
||||||
exit 1
|
return $retval
|
||||||
fi
|
}
|
||||||
|
function rebuildstatic()
|
||||||
|
{
|
||||||
|
retval=0
|
||||||
|
_dist=$(lowercase $DISTRO_BASED_ON)
|
||||||
|
log "Running collectstatic..."
|
||||||
|
case $_dist in
|
||||||
|
"debian")
|
||||||
|
horizon_manage=$(dpkg-query -L openstack-dashboard | grep -E "*manage.py$")
|
||||||
|
;;
|
||||||
|
"redhat")
|
||||||
|
horizon_manage=$(rpm -ql openstack-dashboard | grep -E "*manage.py$")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
if [ -z "$horizon_manage" ]; then
|
||||||
|
log "...openstack-dashboard manage.py not found, exiting!!!"
|
||||||
|
retval=1
|
||||||
|
return $retval
|
||||||
|
fi
|
||||||
|
_old_murano_static="$(dirname $horizon_manage)/openstack_dashboard/static/muranodashboard"
|
||||||
|
if [ -d "$_old_murano_static" ];then
|
||||||
|
log "...$APPLICATION_NAME static for \"muranodashboard\" found under \"HORIZON\" STATIC, deleting \"$_old_murano_static\"..."
|
||||||
|
rm -rf $_old_murano_static
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "...can't delete \"$_old_murano_static\, WARNING!!!"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
log "Rebuilding STATIC output will be recorded in \"$LOGFILE\""
|
||||||
|
#python $horizon_manage collectstatic --noinput >> $LOGFILE 2>&1
|
||||||
|
chmod a+rw $LOGFILE
|
||||||
|
su -c "python $horizon_manage collectstatic --noinput >> $LOGFILE 2>&1" -s /bin/bash $WEB_SERVICE_USER
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "...\"$horizon_manage\" collectstatic failed, exiting!!!"
|
||||||
|
retval=1
|
||||||
|
else
|
||||||
|
log "...success"
|
||||||
|
fi
|
||||||
|
prepare_db "$horizon_manage" || retval=$?
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
function run_pip_uninstall()
|
||||||
|
{
|
||||||
|
find_pip
|
||||||
|
retval=0
|
||||||
|
pack_to_del=$(is_py_package_installed "$APPLICATION_NAME")
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
log "Running \"$PIPCMD uninstall $PIPARGS $APPLICATION_NAME\" output will be recorded in \"$LOGFILE\""
|
||||||
|
$PIPCMD uninstall $pack_to_del --yes >> $LOGFILE 2>&1
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "...can't uninstall $APPLICATION_NAME with $PIPCMD"
|
||||||
|
retval=1
|
||||||
|
else
|
||||||
|
log "...success"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Python package for \"$APPLICATION_NAME\" not found"
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
function install_application()
|
||||||
|
{
|
||||||
|
install_prerequisites || exit 1
|
||||||
|
make_tarball || exit $?
|
||||||
|
run_pip_install || exit $?
|
||||||
|
log "Configuring HORIZON..."
|
||||||
|
find_horizon_config || exit $?
|
||||||
|
_dist=$(lowercase $DISTRO_BASED_ON)
|
||||||
|
log "Configuring system..."
|
||||||
|
case $_dist in
|
||||||
|
"debian")
|
||||||
|
WEB_SERVICE_SYSNAME="apache2"
|
||||||
|
WEB_SERVICE_USER="horizon"
|
||||||
|
WEB_SERVICE_GROUP="horizon"
|
||||||
|
dpkg --purge openstack-dashboard-ubuntu-theme
|
||||||
|
;;
|
||||||
|
"redhat")
|
||||||
|
WEB_SERVICE_SYSNAME="httpd"
|
||||||
|
WEB_SERVICE_USER="apache"
|
||||||
|
WEB_SERVICE_GROUP="apache"
|
||||||
|
log "Disabling firewall and selinux..."
|
||||||
|
service iptables stop
|
||||||
|
chkconfig iptables off
|
||||||
|
setenforce 0
|
||||||
|
iniset '' 'SELINUX' 'permissive' '/etc/selinux/config'
|
||||||
|
chkconfig $WEB_SERVICE_SYSNAME on
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
log "Creating required directories..."
|
||||||
|
mk_dir "$APPLICATION_LOG_DIR" "$WEB_SERVICE_USER" "$WEB_SERVICE_GROUP" || exit $?
|
||||||
|
mk_dir "$APPLICATION_CACHE_DIR" "$WEB_SERVICE_USER" "$WEB_SERVICE_GROUP" || exit $?
|
||||||
|
horizon_etc_cfg=$(find /etc/openstack-dashboard -name "local_setting*" | head -n 1)
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
log "Can't find horizon config under \"/etc/openstack-dashboard...\""
|
||||||
|
retval=1
|
||||||
|
else
|
||||||
|
iniset '' 'ALLOWED_HOSTS' "'*'" $horizon_etc_cfg
|
||||||
|
iniset '' 'DEBUG' 'True' $horizon_etc_cfg
|
||||||
|
fi
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
function uninstall_application()
|
||||||
|
{
|
||||||
|
run_pip_uninstall || exit $?
|
||||||
|
find_horizon_config remove || exit $?
|
||||||
}
|
}
|
||||||
|
|
||||||
# install
|
function postinst()
|
||||||
inst()
|
|
||||||
{
|
{
|
||||||
CLONE_FROM_GIT=$1
|
rebuildstatic || exit $?
|
||||||
# Checking packages
|
sleep 2
|
||||||
for PKG in $PREREQ_PKGS
|
chown -R $WEB_SERVICE_USER:$WEB_SERVICE_GROUP /var/lib/openstack-dashboard
|
||||||
do
|
service $WEB_SERVICE_SYSNAME restart
|
||||||
in_sys_pkg $PKG
|
|
||||||
done
|
|
||||||
|
|
||||||
# If clone from git set
|
|
||||||
if [ ! -z $CLONE_FROM_GIT ]; then
|
|
||||||
# Preparing clone root directory
|
|
||||||
if [ ! -d $GIT_CLONE_DIR ];then
|
|
||||||
log "Creating $GIT_CLONE_DIR direcory..."
|
|
||||||
mkdir -p $GIT_CLONE_DIR
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't create $GIT_CLONE_DIR, exiting!!!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
# Cloning from GIT
|
|
||||||
GIT_WEBPATH_PRFX="https://github.com/stackforge/"
|
|
||||||
gitclone "$GIT_WEBPATH_PRFX$SERVICE_SRV_NAME.git" $GIT_CLONE_DIR
|
|
||||||
# End clone from git section
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Installing...
|
|
||||||
log "Running setup.py"
|
|
||||||
#MRN_CND_SPY=$GIT_CLONE_DIR/$SERVICE_SRV_NAME/setup.py
|
|
||||||
MRN_CND_SPY=$SERVICE_CONTENT_DIRECTORY/setup.py
|
|
||||||
if [ -e $MRN_CND_SPY ]; then
|
|
||||||
chmod +x $MRN_CND_SPY
|
|
||||||
log "$MRN_CND_SPY output:_____________________________________________________________"
|
|
||||||
## Setup through pip
|
|
||||||
# Creating tarball
|
|
||||||
rm -rf $SERVICE_CONTENT_DIRECTORY/*.egg-info
|
|
||||||
cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY egg_info
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "\"$MRN_CND_SPY\" egg info creation FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
rm -rf $SERVICE_CONTENT_DIRECTORY/dist
|
|
||||||
cd $SERVICE_CONTENT_DIRECTORY && python $MRN_CND_SPY sdist
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "\"$MRN_CND_SPY\" tarball creation FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Running tarball install
|
|
||||||
TRBL_FILE=$(basename `ls $SERVICE_CONTENT_DIRECTORY/dist/*.tar.gz`)
|
|
||||||
pip install $SERVICE_CONTENT_DIRECTORY/dist/$TRBL_FILE
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "pip install \"$TRBL_FILE\" FAILS, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# Creating log directory for the murano
|
|
||||||
if [ ! -d $LOG_DIR ];then
|
|
||||||
log "Creating $LOG_DIR direcory..."
|
|
||||||
mkdir -p $LOG_DIR
|
|
||||||
if [ $? -ne 0 ];then
|
|
||||||
log "Can't create $LOG_DIR, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
chmod -R a+rw $LOG_DIR
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "$MRN_CND_SPY not found!"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
function postuninst()
|
||||||
# uninstall
|
|
||||||
uninst()
|
|
||||||
{
|
{
|
||||||
# Uninstall trough pip
|
_dist=$(lowercase $DISTRO_BASED_ON)
|
||||||
# looking up for python package installed
|
case $_dist in
|
||||||
PYPKG=`echo $SERVICE_SRV_NAME | tr -d '-'`
|
"debian")
|
||||||
pip freeze | grep $PYPKG
|
WEB_SERVICE_SYSNAME="apache2"
|
||||||
if [ $? -eq 0 ]; then
|
;;
|
||||||
log "Removing package \"$PYPKG\" with pip"
|
"redhat")
|
||||||
pip uninstall $PYPKG --yes
|
WEB_SERVICE_SYSNAME="httpd"
|
||||||
else
|
;;
|
||||||
log "Python package \"$PYPKG\" not found"
|
esac
|
||||||
fi
|
service $WEB_SERVICE_SYSNAME restart
|
||||||
}
|
|
||||||
# preinstall
|
|
||||||
preinst()
|
|
||||||
{
|
|
||||||
# check openstack-dashboard installed from system packages
|
|
||||||
_PKG=openstack-dashboard
|
|
||||||
dpkg -s $_PKG > /dev/null 2>&1
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "Package \"$_PKG\" is not installed."
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# rebuild static
|
|
||||||
rebuildstatic()
|
|
||||||
{
|
|
||||||
horizon_manage=$(dpkg-query -L openstack-dashboard | grep -E "*manage.py$")
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "openstack-dashboard manage.py not found, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
_old_murano_static="$(dirname $horizon_manage)/openstack_dashboard/static/muranodashboard"
|
|
||||||
if [ -d "$_old_murano_static" ];then
|
|
||||||
log "Our static for \"muranodashboard\" found under \"HORIZON\" STATIC, deleting \"$_old_murano_static\"..."
|
|
||||||
rm -rf $_old_murano_static
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "Can't delete \"$_old_murano_static\, WARNING!!!"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
log "Rebuilding STATIC...."
|
|
||||||
python $horizon_manage collectstatic --noinput
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "\"$horizon_manage\" collectstatic failed, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
log "Creating db for storing sessions..."
|
|
||||||
python $horizon_manage syncdb --noinput
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
log "\"$horizon_manage\" syncdb failed, exiting!!!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# postinstall
|
|
||||||
postinst()
|
|
||||||
{
|
|
||||||
rebuildstatic
|
|
||||||
sleep 2
|
|
||||||
chown $APACHE_USER:$APACHE_GROUP $LOG_DIR/murano-dashboard.log
|
|
||||||
chown -R $APACHE_USER:$APACHE_GROUP /var/lib/openstack-dashboard
|
|
||||||
service apache2 restart
|
|
||||||
}
|
}
|
||||||
# Command line args'
|
# Command line args'
|
||||||
COMMAND="$1"
|
COMMAND="$1"
|
||||||
case $COMMAND in
|
case $COMMAND in
|
||||||
install )
|
install)
|
||||||
preinst
|
rm -rf $LOGFILE
|
||||||
inst
|
log "Installing \"$APPLICATION_NAME\" to system..."
|
||||||
find_horizon_config
|
install_application || exit $?
|
||||||
postinst
|
postinst || exit $?
|
||||||
;;
|
log "...success"
|
||||||
|
;;
|
||||||
|
|
||||||
installfromgit )
|
uninstall )
|
||||||
preinst
|
log "Uninstalling \"$APPLICATION_NAME\" from system..."
|
||||||
inst "yes"
|
uninstall_application || exit $?
|
||||||
find_horizon_config
|
postuninst
|
||||||
postinst
|
log "Software uninstalled, application logs located at \"$APPLICATION_LOG_DIR\", cache files - at \"$APPLICATION_CACHE_DIR'\" ."
|
||||||
;;
|
;;
|
||||||
|
|
||||||
uninstall )
|
|
||||||
log "Uninstalling \"$SERVICE_SRV_NAME\" from system..."
|
|
||||||
uninst
|
|
||||||
find_horizon_config remove
|
|
||||||
service apache2 restart
|
|
||||||
;;
|
|
||||||
|
|
||||||
* )
|
|
||||||
echo "Usage: $(basename "$0") command \nCommands:\n\tinstall - Install $SERVICE_SRV_NAME software\n\tuninstall - Uninstall $SERVICE_SRV_NAME software"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
* )
|
||||||
|
echo -e "Usage: $(basename "$0") [command] \nCommands:\n\tinstall - Install \"$APPLICATION_NAME\" software\n\tuninstall - Uninstall \"$APPLICATION_NAME\" software"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
Loading…
Reference in New Issue