run_vitrage & stop_vitrage & get_topology

Change-Id: Idd2928bb839a9740f14ea0023bcf93f1cf569e37
This commit is contained in:
marina.koushnir@nokia.com 2016-02-10 13:15:29 +00:00
parent cd932db3ff
commit 190e4a3087
11 changed files with 797 additions and 199 deletions

View File

@ -1,276 +1,389 @@
{ {
"directed": true, "directed": true,
"graph": { "graph": {},
},
"nodes": [ "nodes": [
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "node1", "is_placeholder": false,
"id": 0 "is_deleted": false,
"name": "vm-8",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:20d12a8a-ea9a-89c6-5947-83bea959362e"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "zone0", "is_placeholder": false,
"id": 1 "is_deleted": false,
"name": "vm-2",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:dc35fa2f-4515-1653-ef6b-03b471bb395b"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "zone1", "is_placeholder": false,
"id": 2 "is_deleted": false,
"name": "vm-13",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:9879cf5a-bdcf-3651-3017-961ed887ec86"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "zone2", "is_placeholder": false,
"id": 3 "is_deleted": false,
"name": "vm-10",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:fe124f4b-9ed7-4591-fcd1-803cf5c33cb1"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "host0", "is_placeholder": false,
"id": 4 "is_deleted": false,
"name": "vm-11",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:f2e48a97-7350-061e-12d3-84c6dc3e67c0"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "host1", "is_placeholder": false,
"id": 5 "is_deleted": false,
"name": "host-2",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.host",
"id": "RESOURCE:nova.host:host-2"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "host2", "is_placeholder": false,
"id": 6 "is_deleted": false,
"name": "host-3",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.host",
"id": "RESOURCE:nova.host:host-3"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "host3", "is_placeholder": false,
"id": 7 "is_deleted": false,
"name": "host-0",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.host",
"id": "RESOURCE:nova.host:host-0"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "host4", "is_placeholder": false,
"id": 8 "is_deleted": false,
"name": "host-1",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.host",
"id": "RESOURCE:nova.host:host-1"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "host5", "is_placeholder": false,
"id": 9 "is_deleted": false,
"name": "vm-9",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:275097cf-954e-8e24-b185-9514e24b8591"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "host6", "is_placeholder": false,
"id": 10 "is_deleted": false,
"name": "vm-1",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:a0f0805f-c804-cffe-c25a-1b38f555ed68"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "vm0", "is_placeholder": false,
"id": 11 "is_deleted": false,
"name": "vm-14",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:56af57d2-34a4-19b1-5106-b613637a11a7"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "vm1", "is_placeholder": false,
"id": 12 "is_deleted": false,
"name": "zone-1",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.zone",
"id": "RESOURCE:nova.zone:zone-1"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "vm2", "is_placeholder": false,
"id": 13 "is_deleted": false,
"name": "vm-3",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:16e14c58-d254-2bec-53e4-c766e48810aa"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "vm3", "is_placeholder": false,
"id": 14 "is_deleted": false,
"name": "vm-7",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:f35a1e10-74ff-7332-8edf-83cd6ffcb2de"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "vm4", "is_placeholder": false,
"id": 15 "is_deleted": false,
"name": "vm-4",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:ea8a450e-cab1-2272-f431-494b40c5c378"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "vm5", "is_placeholder": false,
"id": 16 "is_deleted": false,
"name": "vm-6",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:6e42bdc3-b776-1b2c-2c7d-b7a8bb98f721"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "vm6", "is_placeholder": false,
"id": 17 "is_deleted": false,
"name": "vm-5",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:8c951613-c660-87c0-c18b-0fa3293ce8d8"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "vm7", "is_placeholder": false,
"id": 18 "is_deleted": false,
"name": "zone-0",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "available",
"type": "nova.zone",
"id": "RESOURCE:nova.zone:zone-0"
}, },
{ {
"state": "ERROR", "category": "RESOURCE",
"name": "vm8", "is_placeholder": false,
"id": 19 "is_deleted": false,
"name": "vm-0",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:78353ce4-2710-49b5-1341-b8cbb6000ebc"
}, },
{ {
"state": "SUBOPTIMAL", "category": "RESOURCE",
"name": "vm9", "is_placeholder": false,
"id": 20 "is_deleted": false,
"name": "vm-12",
"update_timestamp": "2015-12-01T12:46:41Z",
"state": "ACTIVE",
"project_id": "0683517e1e354d2ba25cba6937f44e79",
"type": "nova.instance",
"id": "RESOURCE:nova.instance:35bf479a-75d9-80a9-874e-d3b50fb2dd2e"
}, },
{ {
"state": "RUNNING", "category": "RESOURCE",
"name": "vm10", "is_placeholder": false,
"id": 21 "is_deleted": false,
}, "name": "node",
{ "type": "node",
"state": "ERROR", "id": "RESOURCE:node"
"name": "vm11",
"id": 22
},
{
"state": "SUBOPTIMAL",
"name": "vm12",
"id": 23
},
{
"state": "RUNNING",
"name": "vm13",
"id": 24
},
{
"state": "ERROR",
"name": "vm14",
"id": 25
},
{
"state": "SUBOPTIMAL",
"name": "vm15",
"id": 26
} }
], ],
"links": [ "links": [
{ {
"source": 1, "relationship_name": "contains",
"target": 0, "is_deleted": false,
"relationship": "contains"
},
{
"source": 2,
"target": 0,
"relationship": "contains"
},
{
"source": 3,
"target": 0,
"relationship": "contains"
},
{
"source": 4,
"target": 2,
"relationship": "contains"
},
{
"source": 5,
"target": 1,
"relationship": "contains"
},
{
"source": 6,
"target": 3, "target": 3,
"relationship": "contains" "key": "contains",
"source": 5
}, },
{ {
"source": 7, "relationship_name": "contains",
"target": 2, "is_deleted": false,
"relationship": "contains"
},
{
"source": 8,
"target": 1, "target": 1,
"relationship": "contains" "key": "contains",
"source": 5
}, },
{ {
"source": 9, "relationship_name": "contains",
"target": 3, "is_deleted": false,
"relationship": "contains" "target": 16,
"key": "contains",
"source": 5
}, },
{ {
"source": 10, "relationship_name": "contains",
"is_deleted": false,
"target": 11,
"key": "contains",
"source": 5
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 13,
"key": "contains",
"source": 6
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 4,
"key": "contains",
"source": 6
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 14,
"key": "contains",
"source": 6
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 20,
"key": "contains",
"source": 7
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 0,
"key": "contains",
"source": 7
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 19,
"key": "contains",
"source": 7
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 15,
"key": "contains",
"source": 7
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 9,
"key": "contains",
"source": 8
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 10,
"key": "contains",
"source": 8
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 2, "target": 2,
"relationship": "contains" "key": "contains",
"source": 8
}, },
{ {
"source": 11, "relationship_name": "contains",
"is_deleted": false,
"target": 17,
"key": "contains",
"source": 8
},
{
"relationship_name": "contains",
"is_deleted": false,
"target": 6, "target": 6,
"relationship": "contains" "key": "contains",
"source": 12
}, },
{ {
"source": 12, "relationship_name": "contains",
"target": 5, "is_deleted": false,
"relationship": "contains"
},
{
"source": 13,
"target": 4,
"relationship": "contains"
},
{
"source": 14,
"target": 10,
"relationship": "contains"
},
{
"source": 15,
"target": 9,
"relationship": "contains"
},
{
"source": 16,
"target": 8, "target": 8,
"relationship": "contains" "key": "contains",
"source": 12
}, },
{ {
"source": 17, "relationship_name": "contains",
"target": 7, "is_deleted": false,
"relationship": "contains"
},
{
"source": 18,
"target": 6,
"relationship": "contains"
},
{
"source": 19,
"target": 5, "target": 5,
"relationship": "contains" "key": "contains",
"source": 18
}, },
{ {
"source": 20, "relationship_name": "contains",
"target": 4, "is_deleted": false,
"relationship": "contains"
},
{
"source": 21,
"target": 10,
"relationship": "contains"
},
{
"source": 22,
"target": 9,
"relationship": "contains"
},
{
"source": 23,
"target": 8,
"relationship": "contains"
},
{
"source": 24,
"target": 7, "target": 7,
"relationship": "contains" "key": "contains",
"source": 18
}, },
{ {
"source": 25, "relationship_name": "contains",
"target": 6, "is_deleted": false,
"relationship": "contains" "target": 18,
"key": "contains",
"source": 21
}, },
{ {
"source": 26, "relationship_name": "contains",
"target": 5, "is_deleted": false,
"relationship": "contains" "target": 12,
"key": "contains",
"source": 21
} }
], ],
"multigraph": false "multigraph": true
} }

View File

@ -15,6 +15,7 @@ oslo.service>=1.0.0 # Apache-2.0
oslo.i18n>=2.1.0 oslo.i18n>=2.1.0
pecan>=0.8.0 pecan>=0.8.0
PasteDeploy>=1.5.0 PasteDeploy>=1.5.0
testtools>=1.4.0
Werkzeug>=0.7 Werkzeug>=0.7
keystonemiddleware>=2.3.0 keystonemiddleware>=2.3.0
stevedore>=1.5.0 # Apache-2.0 stevedore>=1.5.0 # Apache-2.0

86
run_vitrage.sh Executable file
View File

@ -0,0 +1,86 @@
#!/usr/bin/env bash
function usage {
echo "Usage: $0 [OPTION]..."
echo "Run Vitrage Tempest tests"
echo ""
echo " -h, --help Print this usage message"
echo " -d, --debug Run tests with testtools instead of testr. This allows you to use PDB"
echo " -t, --serial Run testr serially"
echo " -c, --coverage Generate coverage report"
echo " -- [TESTROPTIONS] After the first '--' you can pass arbitrary arguments to testr "
}
testrargs=""
debug=0
serial=0
coverage=0
wrapper=""
if ! options=$(getopt -o VNnfuctphd -l help,debug,serial,coverage -- "$@")
then
# parse error
usage
exit 1
fi
eval set -- $options
first_uu=yes
while [ $# -gt 0 ]; do
case "$1" in
-h|--help) usage; exit;;
-d|--debug) debug=1;;
-c|--coverage) coverage=1;;
-t|--serial) serial=1;;
--) [ "yes" == "$first_uu" ] || testrargs="$testrargs $1"; first_uu=no ;;
*) testrargs="$testrargs $1";;
esac
shift
done
cd `dirname "$0"`
function testr_init {
if [ ! -d .testrepository ]; then
${wrapper} testr init
fi
}
function run_tests {
testr_init
echo "run env"
nosetests -vx vitrage_tempest_tests/tests/run_vitrage_env.py
echo "run tests"
${wrapper} find . -type f -name "*.pyc" -delete
export OS_TEST_PATH=./vitrage_tempest_tests/tests
if [ "$testrargs" = "" ]; then
testrargs="discover ../vitrage_tempest_tests/tests"
fi
if [ $debug -eq 1 ]; then
${wrapper} python -m testtools.run $testrargs
return $?
fi
if [ $coverage -eq 1 ]; then
${wrapper} python setup.py test --coverage
return $?
fi
if [ $serial -eq 1 ]; then
${wrapper} testr run --subunit $testrargs | ${wrapper} subunit-trace -n -f
else
${wrapper} testr run --parallel --subunit $testrargs | ${wrapper} subunit-trace -n -f
fi
echo "stop env"
nosetests -vx vitrage_tempest_tests/tests/stop_vitrage_env.py
}
run_tests
retval=$?
exit $retval

View File

@ -0,0 +1,15 @@
# Copyright 2016 - Nokia
#
# 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.
__author__ = 'stack'

View File

@ -0,0 +1,15 @@
# Copyright 2016 - Nokia
#
# 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.
__author__ = 'stack'

View File

@ -0,0 +1,21 @@
# Copyright 2016 Nokia
#
# 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 vitrage.tests.base import BaseTest
class BaseVitrageTest(BaseTest):
"""Base test class for Vitrage API tests."""
def __init__(self, *args, **kwds):
super(BaseVitrageTest, self).__init__(*args, **kwds)

View File

@ -0,0 +1,15 @@
# Copyright 2016 - Nokia
#
# 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.
__author__ = 'stack'

View File

@ -0,0 +1,93 @@
# Copyright 2016 Nokia
#
# 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 os
import oslo_messaging
from oslo_config import cfg
from oslo_log import log as logging
from vitrage.api.controllers.v1.topology import TopologyController
from vitrage_tempest_tests.tests.api.base import BaseVitrageTest
from vitrage_tempest_tests.tests.base_mock import BaseMock
LOG = logging.getLogger(__name__)
class BaseTopologyTest(BaseVitrageTest):
"""Topology test class for Vitrage API tests."""
def __init__(self, *args, **kwds):
super(BaseTopologyTest, self).__init__(*args, **kwds)
self.created_graphs = []
self.name = 'tempest_graph'
self.depth = ''
self.query = ''
self.root = ''
""" Get client """
transport = oslo_messaging.get_transport(cfg.CONF)
cfg.CONF.set_override('rpc_backend', 'rabbit')
target = oslo_messaging.Target(topic='rpcapiv1')
self.client = oslo_messaging.RPCClient(transport, target)
def test_get_graph(self):
"""Wrapper that returns a test graph."""
self.graph_type = 'graph'
self.graph = self._get_topology()
self._validate_graph_correctness()
LOG.debug('The graph ' + self.name + ' does not exist')
def test_get_tree(self):
"""Wrapper that returns a test tree."""
self.graph_type = 'tree'
self.graph = self._get_topology()
self._validate_graph_correctness()
LOG.debug('The graph tree ' + self.name + ' exist')
def _get_topology(self):
"""Get Graph objects returned by the v1 client """
try:
g = TopologyController().get_graph(graph_type=self.graph_type)
except Exception as e:
LOG.exception("Failed to get topology (graph_type = " +
self.graph_type + ") %s ", e)
return None
return g
def _validate_graph_correctness(self):
"""Compare Graph object to graph form os terminal """
print("The topology graph taken by api is : %s", self.graph)
def _create_graph_by_mock(self):
"""Create MOCK Graph and copied to the string """
processor = BaseMock.create_processor_with_graph(self)
entity_graph = processor.entity_graph
a = entity_graph.output_graph()
print (a)
@staticmethod
def _show_topology():
text_out = os.popen("vitrage topology show").read()
print (text_out)
if "RESOURCE" not in text_out:
LOG.info('The topology graph does not exist')
return False
else:
LOG.info('The topology graph exist')
return True

View File

@ -0,0 +1,39 @@
# Copyright 2016 Nokia
#
# 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 testtools
from vitrage.entity_graph.processor import processor as proc
from vitrage.tests.mocks import mock_syncronizer as mock_sync
class BaseMock(testtools.TestCase):
"""Base test class for Vitrage API tests."""
def create_processor_with_graph(self):
events = self._create_mock_events()
processor = proc.Processor()
for event in events:
processor.process_event(event)
return processor
@staticmethod
def _create_mock_events():
gen_list = mock_sync.simple_zone_generators(
2, 4, snapshot_events=2, snap_vals={'sync_mode': 'init_snapshot'})
gen_list += mock_sync.simple_host_generators(
2, 4, 4, snap_vals={'sync_mode': 'init_snapshot'})
gen_list += mock_sync.simple_instance_generators(
4, 15, 15, snap_vals={'sync_mode': 'init_snapshot'})
return mock_sync.generate_sequential_events_list(gen_list)

View File

@ -0,0 +1,156 @@
# Copyright 2016 Nokia
#
# 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 oslo_log import log as logging
import os
import re
import testtools
LOG = logging.getLogger(__name__)
class RunVitrageEnv(testtools.TestCase):
"""RunVitrageEnv class. Run Vitrage env."""
def __init__(self, *args, **kwds):
super(RunVitrageEnv, self).__init__(*args, **kwds)
self.filename = '/opt/stack/vitrage/etc/vitrage/vitrage.conf'
self.port = '8999'
def test_run_env(self):
self._set_env_params()
print("The host ip address = " + self.host + " with port " + self.port)
LOG.info('MARINA!!!')
if self._show_vitrage_processes() is True:
print ("The vitrage processed existed and should be removed")
LOG.info('The vitrage processed existed and should be removed')
self._stop_vitrage_processes()
os.system("openstack service create rca" +
" --os-username " + self.user +
" --os-password " + self.password +
" --os-auth-url " + self.url +
" --os-project-name admin" +
" --name vitrage")
os.system("openstack endpoint create rca --os-username " + self.user +
" --os-password " + self.password +
" --os-auth-url " + self.url +
" --os-project-name admin" +
" --adminurl http://" + self.host + ":" + self.port +
" --internalurl http://" + self.host + ":" + self.port +
" --publicurl http://" + self.host + ":" + self.port +
" --region RegionOne")
os.chdir('/tmp')
os.system("\rm nohup.out")
os.system("nohup vitrage-graph &")
os.system("nohup vitrage-api &")
if self._show_vitrage_processes() is False:
LOG.error("No vitrage processes founded")
raise ValueError("No vitrage processes founded")
if self._validate_vitrage_processes() is False:
LOG.error("The vitrage processes are not correct")
self._stop_vitrage_processes()
raise ValueError("The vitrage processes are not correct")
@staticmethod
def _show_vitrage_processes():
text_out = os.popen(
"ps -ef | grep vitrage-api | grep -v grep").read()
print (text_out)
text_out2 = os.popen(
"ps -ef | grep vitrage-graph | grep -v grep").read()
print (text_out2)
if ("vitrage-api" in text_out) and ("vitrage-graph" in text_out2):
LOG.info('The vitrage processes exists')
return True
elif "vitrage-api" in text_out:
LOG.info('Only vitrage-api process exist')
return True
elif "vitrage-graph" in text_out2:
LOG.info('Only vitrage-graph process exist')
return True
else:
LOG.info('The vitrage process does not run')
return False
@staticmethod
def _get_field_from_file(pattern, lines_arr):
p = re.compile(pattern)
for line in lines_arr:
m = p.search(line)
if m:
print("The field value is " + m.group(1))
return m.group(1)
return None
def _set_env_params(self):
lines_arr = []
with open(self.filename, 'r') as the_file:
for line in the_file:
if "#" not in line and line.strip() != '':
lines_arr.append(line)
self.user = self._get_field_from_file(
"admin_user = (\w+)", lines_arr)
text_out = os.popen("echo $OS_USERNAME").read()
if text_out not in self.user:
os.system("export OS_USERNAME=" + self.user)
self.tenent_user = self._get_field_from_file(
"admin_tenant_name = (\w+)", lines_arr)
text_out = os.popen("echo $OS_TENANT_NAME").read()
if text_out not in self.tenent_user:
os.system("export OS_TENANT_NAME=" + self.tenent_user)
self.password = self._get_field_from_file(
"admin_password = (\w+)", lines_arr)
text_out = os.popen("echo $OS_PASSWORD").read()
if text_out not in self.password:
os.system("export OS_PASSWORD=" + self.password)
self.host = self._get_field_from_file(
"(\d+\.\d+\.\d+\.\d+)", lines_arr)
self.url = "http://" + self.host + ":5000/v2.0"
text_out = os.popen("echo $OS_AUTH_URL").read()
if text_out not in self.url:
os.system("export OS_AUTH_URL=" + self.url)
@staticmethod
def _stop_vitrage_processes():
text_out = os.popen("pgrep vitrage-api").read()
print (text_out)
if text_out != '':
LOG.info("The vitrage-api process exist")
os.system("kill -9 " + text_out)
text_out2 = os.popen("pgrep vitrage-graph").read()
print (text_out2)
if text_out2 != '':
LOG.info("The vitrage-graph process exist")
os.system("kill -9 " + text_out2)
@staticmethod
def _validate_vitrage_processes():
text_out2 = os.popen("grep 'ERROR vitrage' nohup.out").read()
if text_out2 != '':
LOG.info("The error is : " + text_out2)
print("The error is : " + text_out2)
return False
return True

View File

@ -0,0 +1,44 @@
# Copyright 2016 Nokia
#
# 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 oslo_log import log as logging
import os
import subprocess
import testtools
LOG = logging.getLogger(__name__)
class StopVitrageEnv(testtools.TestCase):
"""RunVitrageEnv class. Run Vitrage env."""
def __init__(self, *args, **kwds):
super(StopVitrageEnv, self).__init__(*args, **kwds)
self.filename = '/etc/vitrage/vitrage.conf'
@staticmethod
def test_stop_vitrage_processes():
f = subprocess.Popen("pgrep vitrage-api",
stdout=subprocess.PIPE, shell=True)
text_out, std_error = f.communicate()
print (text_out)
if text_out != '':
os.system("kill -9 " + text_out)
f = subprocess.Popen("pgrep vitrage-graph",
stdout=subprocess.PIPE, shell=True)
text_out, std_error2 = f.communicate()
print (text_out)
if text_out != '':
os.system("kill -9 " + text_out)