Remove dashboard url from success actions messages for tasks

_success_action method of NailgunReceiver was modified so that is now
not supply dashboard url for produced message. Tests was updated
accordingly

Change-Id: Idc3756b5ac7c2cbe5d890a22796cc5b0c74c8027
Closes-Bug: #1479414
This commit is contained in:
Artem Roma 2015-07-29 20:00:48 +03:00
parent 999efffd19
commit 88db2a7cf4
5 changed files with 18 additions and 219 deletions

View File

@ -28,7 +28,6 @@ from sqlalchemy import or_
from nailgun import consts
from nailgun import notifier
from nailgun import objects
from nailgun.rpc import utils
from nailgun.settings import settings
from nailgun.consts import TASK_STATUSES
@ -485,87 +484,22 @@ class NailgunReceiver(object):
return
task_name = task.name.title()
if task.cluster.mode in ('singlenode', 'multinode'):
# determining horizon url - it's an IP
# of a first cluster controller
controller = db().query(Node).filter_by(
cluster_id=task.cluster_id
).filter(
Node.roles.any('controller')
).first()
if controller:
logger.debug(
u"Controller is found, node_id=%s, "
"getting it's IP addresses",
controller.id
)
public_net = filter(
lambda n: n['name'] == 'public' and 'ip' in n,
objects.Cluster.get_network_manager(
controller.cluster
).get_node_networks(controller)
)
if public_net:
horizon_ip = public_net[0]['ip'].split('/')[0]
protocol = utils.get_protocol_for_horizon(task.cluster)
message = (
u"{task} of environment '{name}' is done. "
"Access the OpenStack dashboard (Horizon) at "
"{proto}://{horizon_address}/ or via internal "
"network at http://{controller_address}/"
).format(
task=task_name,
name=task.cluster.name,
proto=protocol,
horizon_address=horizon_ip,
controller_address=controller.ip
)
else:
message = u"{0} of environment '{1}' is done".format(
task_name,
task.cluster.name
)
logger.warning(
u"Public ip for controller node "
"not found in '{0}'".format(task.cluster.name)
)
else:
message = u"{0} of environment '{1}' is done".format(
task_name,
task.cluster.name
)
logger.warning(u"Controller node not found in '{0}'".format(
task.cluster.name
))
elif task.cluster.is_ha_mode:
# determining horizon url in HA mode - it's vip
# from a public network saved in task cache
try:
message = (
u"{0} of environment '{1}' is done. "
"Access the OpenStack dashboard (Horizon) at {2}"
).format(
task_name,
task.cluster.name,
objects.Cluster.get_network_manager(
task.cluster
).get_horizon_url(task.cluster.id)
)
except Exception as exc:
logger.error(": ".join([
str(exc),
traceback.format_exc()
]))
message = u"{0} of environment '{1}' is done".format(
task_name,
task.cluster.name
)
logger.warning(
u"Cannot find virtual IP for '{0}'".format(
task.cluster.name
)
)
try:
message = (
u"{0} of environment '{1}' is done. "
).format(
task_name,
task.cluster.name,
)
except Exception as exc:
logger.error(": ".join([
str(exc),
traceback.format_exc()
]))
message = u"{0} of environment '{1}' is done".format(
task_name,
task.cluster.name
)
zabbix_url = objects.Cluster.get_network_manager(
task.cluster

View File

@ -16,7 +16,6 @@
import six
from nailgun import consts
from nailgun.logger import logger
@ -26,12 +25,3 @@ def delete_entities(conn, *entities):
channel = conn.channel()
bound_entity = entity(channel)
bound_entity.delete()
def get_protocol_for_horizon(cluster):
attr_value = cluster.attributes.editable.\
get('public_ssl', {}).get('horizon', {}).get('value')
if attr_value is True:
return consts.PROTOCOL.https
else:
return consts.PROTOCOL.http

View File

@ -1,63 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 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.
from nailgun import consts
from nailgun import objects
from nailgun.db.sqlalchemy.models import IPAddr
from nailgun.db.sqlalchemy.models import NetworkGroup
from nailgun.test.base import BaseIntegrationTest
from nailgun.test.base import fake_tasks
class TestHorizonURL(BaseIntegrationTest):
def tearDown(self):
self._wait_for_threads()
super(TestHorizonURL, self).tearDown()
@fake_tasks(override_state={"progress": 100, "status": "ready"})
def test_horizon_url_ha_mode(self):
self.env.create(
nodes_kwargs=[
{"pending_addition": True},
{"pending_addition": True},
{"pending_addition": True},
]
)
supertask = self.env.launch_deployment()
self.env.wait_ready(supertask, 60)
network = self.db.query(NetworkGroup).\
filter(NetworkGroup.group_id ==
objects.Cluster.get_default_group(
self.env.clusters[0]).id).\
filter_by(name="public").first()
lost_ips = self.db.query(IPAddr).filter_by(
network=network.id,
node=None,
vip_type=consts.NETWORK_VIP_TYPES.haproxy,
).all()
self.assertEqual(len(lost_ips), 1)
self.assertEqual(supertask.message, (
u"Deployment of environment '{0}' is done. "
"Access the OpenStack dashboard (Horizon) at http://{1}/"
).format(
self.env.clusters[0].name,
lost_ips[0].ip_addr
))

View File

@ -53,9 +53,8 @@ class TestNailgunReceiver(base.BaseTestCase):
NailgunReceiver._success_action(self.task, 'ready', 100)
self.assertRegexpMatches(
self.task.message,
"Deployment of environment '[^\s]+' is done. Access the OpenStack "
"dashboard \(Horizon\) at [^\s]+\n"
"\n"
"Deployment of environment '[^\s]+' is done. "
"\n\n"
"Plugin name\d is deployed. description\d\n"
"Plugin name\d is deployed. description\d")

View File

@ -1,61 +0,0 @@
# -*- coding: utf-8 -*-
# Copyright 2015 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 mock
from nailgun import consts
from nailgun.rpc import utils
from nailgun.test import base
class TestRpcUtils(base.BaseTestCase):
def test_get_protocol_for_horizon(self):
self.env.create()
cluster = self.env.clusters[0]
self.assertIn(
cluster.attributes.editable['public_ssl']['horizon']['value'],
(True, True)
)
with mock.patch.dict(cluster.attributes.editable, {}):
self.assertEqual(consts.PROTOCOL.https,
utils.get_protocol_for_horizon(cluster))
with mock.patch.dict(cluster.attributes.editable, {'public_ssl': {}}):
self.assertEqual(consts.PROTOCOL.http,
utils.get_protocol_for_horizon(cluster))
with mock.patch.dict(cluster.attributes.editable,
{'public_ssl': {'horizon': {}}}):
self.assertEqual(consts.PROTOCOL.http,
utils.get_protocol_for_horizon(cluster))
with mock.patch.dict(cluster.attributes.editable,
{'public_ssl': {'horizon': {'value': False}}}):
self.assertEqual(consts.PROTOCOL.http,
utils.get_protocol_for_horizon(cluster))
with mock.patch.dict(cluster.attributes.editable,
{'public_ssl': {'horizon': {'value': None}}}):
self.assertEqual(consts.PROTOCOL.http,
utils.get_protocol_for_horizon(cluster))
with mock.patch.dict(cluster.attributes.editable,
{'public_ssl': {'horizon': {'value': True}}}):
self.assertEqual(consts.PROTOCOL.https,
utils.get_protocol_for_horizon(cluster))