1#   Copyright 2016 Huawei, Inc. All rights reserved.
2#
3#   Licensed under the Apache License, Version 2.0 (the "License"); you may
4#   not use this file except in compliance with the License. You may obtain
5#   a copy of the License at
6#
7#        http://www.apache.org/licenses/LICENSE-2.0
8#
9#   Unless required by applicable law or agreed to in writing, software
10#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12#   License for the specific language governing permissions and limitations
13#   under the License.
14#
15
16from unittest import mock
17
18from openstackclient.compute.v2 import console
19from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
20
21
22class TestConsole(compute_fakes.TestComputev2):
23
24    def setUp(self):
25        super(TestConsole, self).setUp()
26        self.servers_mock = self.app.client_manager.compute.servers
27        self.servers_mock.reset_mock()
28
29
30class TestConsoleUrlShow(TestConsole):
31
32    def setUp(self):
33        super(TestConsoleUrlShow, self).setUp()
34        fake_console_data = {'remote_console': {'url': 'http://localhost',
35                                                'protocol': 'fake_protocol',
36                                                'type': 'fake_type'}}
37        methods = {
38            'get_console_url': fake_console_data
39        }
40        self.fake_server = compute_fakes.FakeServer.create_one_server(
41            methods=methods)
42        self.servers_mock.get.return_value = self.fake_server
43
44        self.columns = (
45            'protocol',
46            'type',
47            'url',
48        )
49        self.data = (
50            fake_console_data['remote_console']['protocol'],
51            fake_console_data['remote_console']['type'],
52            fake_console_data['remote_console']['url']
53        )
54
55        self.cmd = console.ShowConsoleURL(self.app, None)
56
57    def test_console_url_show_by_default(self):
58        arglist = [
59            'foo_vm',
60        ]
61        verifylist = [
62            ('url_type', 'novnc'),
63            ('server', 'foo_vm'),
64        ]
65        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
66        columns, data = self.cmd.take_action(parsed_args)
67        self.fake_server.get_console_url.assert_called_once_with('novnc')
68        self.assertEqual(self.columns, columns)
69        self.assertEqual(self.data, data)
70
71    def test_console_url_show_with_novnc(self):
72        arglist = [
73            '--novnc',
74            'foo_vm',
75        ]
76        verifylist = [
77            ('url_type', 'novnc'),
78            ('server', 'foo_vm'),
79        ]
80        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
81        columns, data = self.cmd.take_action(parsed_args)
82        self.fake_server.get_console_url.assert_called_once_with('novnc')
83        self.assertEqual(self.columns, columns)
84        self.assertEqual(self.data, data)
85
86    def test_console_url_show_with_xvpvnc(self):
87        arglist = [
88            '--xvpvnc',
89            'foo_vm',
90        ]
91        verifylist = [
92            ('url_type', 'xvpvnc'),
93            ('server', 'foo_vm'),
94        ]
95        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
96        columns, data = self.cmd.take_action(parsed_args)
97        self.fake_server.get_console_url.assert_called_once_with('xvpvnc')
98        self.assertEqual(self.columns, columns)
99        self.assertEqual(self.data, data)
100
101    def test_console_url_show_with_spice(self):
102        arglist = [
103            '--spice',
104            'foo_vm',
105        ]
106        verifylist = [
107            ('url_type', 'spice-html5'),
108            ('server', 'foo_vm'),
109        ]
110        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
111        columns, data = self.cmd.take_action(parsed_args)
112        self.fake_server.get_console_url.assert_called_once_with(
113            'spice-html5')
114        self.assertEqual(self.columns, columns)
115        self.assertEqual(self.data, data)
116
117    def test_console_url_show_compatible(self):
118        methods = {
119            'get_console_url': {'console': {'url': 'http://localhost',
120                                            'type': 'fake_type'}},
121        }
122        old_fake_server = compute_fakes.FakeServer.create_one_server(
123            methods=methods)
124        old_columns = (
125            'type',
126            'url',
127        )
128        old_data = (
129            methods['get_console_url']['console']['type'],
130            methods['get_console_url']['console']['url']
131        )
132        arglist = [
133            'foo_vm',
134        ]
135        verifylist = [
136            ('url_type', 'novnc'),
137            ('server', 'foo_vm'),
138        ]
139        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
140        with mock.patch.object(self.servers_mock, 'get',
141                               return_value=old_fake_server):
142            columns, data = self.cmd.take_action(parsed_args)
143            old_fake_server.get_console_url.assert_called_once_with('novnc')
144            self.assertEqual(old_columns, columns)
145            self.assertEqual(old_data, data)
146
147    def test_console_url_show_with_rdp(self):
148        arglist = [
149            '--rdp',
150            'foo_vm',
151        ]
152        verifylist = [
153            ('url_type', 'rdp-html5'),
154            ('server', 'foo_vm'),
155        ]
156        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
157        columns, data = self.cmd.take_action(parsed_args)
158        self.fake_server.get_console_url.assert_called_once_with(
159            'rdp-html5')
160        self.assertEqual(self.columns, columns)
161        self.assertEqual(self.data, data)
162
163    def test_console_url_show_with_serial(self):
164        arglist = [
165            '--serial',
166            'foo_vm',
167        ]
168        verifylist = [
169            ('url_type', 'serial'),
170            ('server', 'foo_vm'),
171        ]
172        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
173        columns, data = self.cmd.take_action(parsed_args)
174        self.fake_server.get_console_url.assert_called_once_with(
175            'serial')
176        self.assertEqual(self.columns, columns)
177        self.assertEqual(self.data, data)
178
179    def test_console_url_show_with_mks(self):
180        arglist = [
181            '--mks',
182            'foo_vm',
183        ]
184        verifylist = [
185            ('url_type', 'webmks'),
186            ('server', 'foo_vm'),
187        ]
188        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
189        columns, data = self.cmd.take_action(parsed_args)
190        self.fake_server.get_console_url.assert_called_once_with('webmks')
191        self.assertEqual(self.columns, columns)
192        self.assertEqual(self.data, data)
193