147 lines
5.3 KiB
Python
147 lines
5.3 KiB
Python
# Copyright 2016 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 collections
|
|
|
|
import mock
|
|
|
|
from devops import models
|
|
from devops.tests.driver.libvirt.base import LibvirtTestCase
|
|
from django.conf import settings
|
|
|
|
|
|
class TestCentosMasterExt(LibvirtTestCase):
|
|
|
|
def patch(self, *args, **kwargs):
|
|
patcher = mock.patch(*args, **kwargs)
|
|
m = patcher.start()
|
|
self.addCleanup(patcher.stop)
|
|
return m
|
|
|
|
def setUp(self):
|
|
super(TestCentosMasterExt, self).setUp()
|
|
|
|
self.open_mock = mock.mock_open(read_data='image_data')
|
|
self.patch('devops.driver.libvirt.libvirt_driver.open',
|
|
self.open_mock, create=True)
|
|
|
|
self.os_mock = self.patch('devops.helpers.helpers.os')
|
|
# noinspection PyPep8Naming
|
|
Size = collections.namedtuple('Size', ['st_size'])
|
|
self.file_sizes = {
|
|
'/tmp/test/cloud_settings.iso': Size(st_size=1 * 1024 ** 3),
|
|
}
|
|
self.os_mock.stat.side_effect = self.file_sizes.get
|
|
|
|
# Environment with an 'admin' network
|
|
|
|
self.env = models.Environment.create('test')
|
|
self.group = self.env.add_group(
|
|
group_name='test_group',
|
|
driver_name='devops.driver.libvirt',
|
|
connection_string='test:///default',
|
|
storage_pool_name='default-pool')
|
|
|
|
self.pub_ap = self.env.add_address_pool(
|
|
name='admin-pool01', net='10.109.0.0/16:24', tag=0,
|
|
ip_reserved=dict(gateway=1, l2_network_device=1),
|
|
ip_ranges=dict(default=[2, -2]))
|
|
self.group.add_l2_network_device(
|
|
name='admin', address_pool='admin-pool01')
|
|
|
|
self.node = self.group.add_node(
|
|
name='test-node',
|
|
role='centos_master',
|
|
architecture='x86_64',
|
|
hypervisor='test')
|
|
|
|
self.system_volume = self.node.add_volume(name='system', capacity=10)
|
|
self.iso_volume = self.node.add_volume(name='iso', capacity=5)
|
|
|
|
self.adm_iface = self.node.add_interface(
|
|
label='enp0s3',
|
|
l2_network_device_name='admin',
|
|
mac_address='64:c6:27:47:14:83',
|
|
interface_model='e1000')
|
|
|
|
self.node.add_network_config(
|
|
label='enp0s3',
|
|
networks=['fuelweb_admin'])
|
|
|
|
self.wait_tcp_mock = self.patch(
|
|
'devops.helpers.helpers.wait_tcp')
|
|
|
|
@mock.patch('exec_helpers.Subprocess', autospec=True)
|
|
@mock.patch('devops.driver.libvirt.libvirt_driver.uuid')
|
|
@mock.patch('libvirt.virConnect.defineXML')
|
|
@mock.patch.multiple(settings, CLOUD_IMAGE_DIR='/tmp/')
|
|
def test_001_pre_define(self, define_xml_mock, uuid_mock, subprocess):
|
|
uuid_mock.uuid4.side_effect = (
|
|
mock.Mock(hex='fe527bd28e0f4a84b9117dc97142c580'),
|
|
mock.Mock(hex='9cddb80fe82e480eb14c1a89f1c0e11d'),
|
|
mock.Mock(hex='885674d28e0f4a84b265625673674565'),
|
|
mock.Mock(hex='91252350fe82e480eb14c1a89f1c0234'))
|
|
define_xml_mock.return_value.UUIDString.return_value = 'fake_uuid'
|
|
|
|
self.system_volume.define()
|
|
self.iso_volume.define()
|
|
self.node.define()
|
|
|
|
assert self.node.cloud_init_iface_up == 'enp0s3'
|
|
|
|
assert self.node.cloud_init_volume_name == 'iso'
|
|
|
|
volume = self.node.get_volume(
|
|
name=self.node.cloud_init_volume_name)
|
|
|
|
assert volume.cloudinit_meta_data == (
|
|
"instance-id: iid-local1\n"
|
|
"network-interfaces: |\n"
|
|
" auto {interface_name}\n"
|
|
" iface {interface_name} inet static\n"
|
|
" address {address}\n"
|
|
" network {network}\n"
|
|
" netmask {netmask}\n"
|
|
" gateway {gateway}\n"
|
|
" dns-nameservers 8.8.8.8\n"
|
|
"local-hostname: nailgun.domain.local")
|
|
|
|
assert volume.cloudinit_user_data == (
|
|
"\n#cloud-config\n"
|
|
"ssh_pwauth: True\n"
|
|
"chpasswd:\n"
|
|
" list: |\n"
|
|
" root:r00tme\n"
|
|
" expire: False\n\n"
|
|
"runcmd:\n"
|
|
" - sudo ifup {interface_name}\n"
|
|
" - sudo sed -i -e '/^PermitRootLogin/s/^.*$/PermitRootLogin yes/'"
|
|
" /etc/ssh/sshd_config\n"
|
|
" - sudo service ssh restart\n"
|
|
" - sudo route add default gw {gateway} {interface_name}")
|
|
|
|
def test_002_deploy_wait(self):
|
|
self.node.ext.deploy_wait()
|
|
|
|
def test_003_get_kernel_cmd(self):
|
|
assert self.node.ext.get_kernel_cmd() is None
|
|
|
|
@mock.patch('devops.driver.libvirt.Node.is_active')
|
|
def test_004_bootstrap_and_wait(self, is_active_mock):
|
|
is_active_mock.return_value = True
|
|
self.node.ext.bootstrap_and_wait()
|
|
self.wait_tcp_mock.assert_called_once_with(
|
|
host='10.109.0.2', port=22, timeout=600,
|
|
timeout_msg=mock.ANY)
|