blob: 8c4ec45553798d40a9c484ccbeebd9f1edaf59fb [file] [log] [blame]
Joe Gordonc97f5c72013-02-14 01:15:57 +00001# Copyright 2013 OpenStack Foundation
2# All Rights Reserved.
3#
4# Licensed under the Apache License, Version 2.0 (the "License"); you may
5# not use this file except in compliance with the License. You may obtain
6# a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13# License for the specific language governing permissions and limitations
14# under the License.
15
Mikhail S Medvedev13168d02013-06-24 16:13:40 -050016import os
Pavel Sedláka2b757c2013-02-25 18:16:04 +010017import shlex
18import subprocess
Joe Gordonc97f5c72013-02-14 01:15:57 +000019
Sean Daguef6825792013-05-08 13:51:26 -040020import tempest.cli.output_parser
Matthew Treinishe2b56b52014-01-29 19:25:50 +000021from tempest import config
Matthew Treinishf4a9b0f2013-07-26 16:58:26 -040022from tempest.openstack.common import log as logging
Pavel Sedláka2b757c2013-02-25 18:16:04 +010023import tempest.test
Joe Gordonc97f5c72013-02-14 01:15:57 +000024
Matthew Treinish90aedd12013-02-25 17:56:49 -050025
Joe Gordonc97f5c72013-02-14 01:15:57 +000026LOG = logging.getLogger(__name__)
27
Matthew Treinishe2b56b52014-01-29 19:25:50 +000028CONF = config.CONF
Pavel Sedláka2b757c2013-02-25 18:16:04 +010029
30
31class ClientTestBase(tempest.test.BaseTestCase):
32 @classmethod
33 def setUpClass(cls):
34 if not CONF.cli.enabled:
35 msg = "cli testing disabled"
36 raise cls.skipException(msg)
Pavel Sedláka2b757c2013-02-25 18:16:04 +010037 super(ClientTestBase, cls).setUpClass()
38
39 def __init__(self, *args, **kwargs):
Sean Daguef6825792013-05-08 13:51:26 -040040 self.parser = tempest.cli.output_parser
Pavel Sedláka2b757c2013-02-25 18:16:04 +010041 super(ClientTestBase, self).__init__(*args, **kwargs)
42
43 def nova(self, action, flags='', params='', admin=True, fail_ok=False):
44 """Executes nova command for the given action."""
45 return self.cmd_with_auth(
46 'nova', action, flags, params, admin, fail_ok)
47
Joe Gordone8b0e152013-03-25 13:37:15 -040048 def nova_manage(self, action, flags='', params='', fail_ok=False,
Joe Gordon0e7cbf82013-03-25 19:49:12 +000049 merge_stderr=False):
Joe Gordon4edb6452013-03-05 21:18:59 +000050 """Executes nova-manage command for the given action."""
51 return self.cmd(
Joe Gordone8b0e152013-03-25 13:37:15 -040052 'nova-manage', action, flags, params, fail_ok, merge_stderr)
Joe Gordon4edb6452013-03-05 21:18:59 +000053
Pavel Sedlák5ce5c032013-02-25 18:41:30 +010054 def keystone(self, action, flags='', params='', admin=True, fail_ok=False):
55 """Executes keystone command for the given action."""
56 return self.cmd_with_auth(
57 'keystone', action, flags, params, admin, fail_ok)
58
afazekasf35f9402013-03-25 14:51:13 +010059 def glance(self, action, flags='', params='', admin=True, fail_ok=False):
60 """Executes glance command for the given action."""
61 return self.cmd_with_auth(
62 'glance', action, flags, params, admin, fail_ok)
63
Mehdi Abaakouk8581c0b2013-10-04 10:45:42 +020064 def ceilometer(self, action, flags='', params='', admin=True,
65 fail_ok=False):
66 """Executes ceilometer command for the given action."""
67 return self.cmd_with_auth(
68 'ceilometer', action, flags, params, admin, fail_ok)
69
Steven Hardy5de54ee2013-12-31 15:58:30 +000070 def heat(self, action, flags='', params='', admin=True,
71 fail_ok=False):
72 """Executes heat command for the given action."""
73 return self.cmd_with_auth(
74 'heat', action, flags, params, admin, fail_ok)
75
saurabh467c4112013-07-08 17:08:31 +053076 def cinder(self, action, flags='', params='', admin=True, fail_ok=False):
77 """Executes cinder command for the given action."""
78 return self.cmd_with_auth(
79 'cinder', action, flags, params, admin, fail_ok)
80
saurabh55c29c72013-07-26 21:15:08 +053081 def neutron(self, action, flags='', params='', admin=True, fail_ok=False):
82 """Executes neutron command for the given action."""
83 return self.cmd_with_auth(
84 'neutron', action, flags, params, admin, fail_ok)
85
Sergey Lukjanov582d1c62014-01-21 19:51:21 +040086 def savanna(self, action, flags='', params='', admin=True, fail_ok=False):
87 """Executes savanna command for the given action."""
88 return self.cmd_with_auth(
89 'savanna', action, flags, params, admin, fail_ok)
90
Pavel Sedláka2b757c2013-02-25 18:16:04 +010091 def cmd_with_auth(self, cmd, action, flags='', params='',
92 admin=True, fail_ok=False):
93 """Executes given command with auth attributes appended."""
Attila Fazekasc3a095b2013-08-17 09:15:44 +020094 # TODO(jogo) make admin=False work
Pavel Sedláka2b757c2013-02-25 18:16:04 +010095 creds = ('--os-username %s --os-tenant-name %s --os-password %s '
DennyZhangb432bac2013-09-17 16:24:12 +000096 '--os-auth-url %s ' %
Matthew Treinishe2b56b52014-01-29 19:25:50 +000097 (CONF.identity.admin_username,
98 CONF.identity.admin_tenant_name,
99 CONF.identity.admin_password,
100 CONF.identity.uri))
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100101 flags = creds + ' ' + flags
102 return self.cmd(cmd, action, flags, params, fail_ok)
103
Joe Gordone8b0e152013-03-25 13:37:15 -0400104 def cmd(self, cmd, action, flags='', params='', fail_ok=False,
Joe Gordon0e7cbf82013-03-25 19:49:12 +0000105 merge_stderr=False):
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100106 """Executes specified command for the given action."""
Mikhail S Medvedev13168d02013-06-24 16:13:40 -0500107 cmd = ' '.join([os.path.join(CONF.cli.cli_dir, cmd),
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100108 flags, action, params])
109 LOG.info("running: '%s'" % cmd)
Pavel Sedlák0d9a84f2013-08-27 19:09:26 +0200110 cmd_str = cmd
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100111 cmd = shlex.split(cmd)
Pavel Sedlák0d9a84f2013-08-27 19:09:26 +0200112 result = ''
113 result_err = ''
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100114 try:
Pavel Sedlák0d9a84f2013-08-27 19:09:26 +0200115 stdout = subprocess.PIPE
116 stderr = subprocess.STDOUT if merge_stderr else subprocess.PIPE
117 proc = subprocess.Popen(
118 cmd, stdout=stdout, stderr=stderr)
119 result, result_err = proc.communicate()
120 if not fail_ok and proc.returncode != 0:
121 raise CommandFailed(proc.returncode,
122 cmd,
Cyril Roelandtb18d5fb2013-10-09 20:23:39 +0000123 result,
124 stderr=result_err)
Pavel Sedlák0d9a84f2013-08-27 19:09:26 +0200125 finally:
126 LOG.debug('output of %s:\n%s' % (cmd_str, result))
127 if not merge_stderr and result_err:
128 LOG.debug('error output of %s:\n%s' % (cmd_str, result_err))
Pavel Sedláka2b757c2013-02-25 18:16:04 +0100129 return result
Pavel Sedlák5ce5c032013-02-25 18:41:30 +0100130
131 def assertTableStruct(self, items, field_names):
132 """Verify that all items has keys listed in field_names."""
133 for item in items:
134 for field in field_names:
135 self.assertIn(field, item)
Pavel Sedlák1053bd32013-04-16 16:47:40 +0200136
Pavel Sedlák4c18fa12013-08-22 21:29:45 +0200137 def assertFirstLineStartsWith(self, lines, beginning):
138 self.assertTrue(lines[0].startswith(beginning),
139 msg=('Beginning of first line has invalid content: %s'
140 % lines[:3]))
141
Pavel Sedlák1053bd32013-04-16 16:47:40 +0200142
143class CommandFailed(subprocess.CalledProcessError):
144 # adds output attribute for python2.6
Cyril Roelandtb18d5fb2013-10-09 20:23:39 +0000145 def __init__(self, returncode, cmd, output, stderr=""):
Pavel Sedlák1053bd32013-04-16 16:47:40 +0200146 super(CommandFailed, self).__init__(returncode, cmd)
147 self.output = output
Cyril Roelandtb18d5fb2013-10-09 20:23:39 +0000148 self.stderr = stderr