summaryrefslogtreecommitdiffstats
path: root/doctor_tests/scenario/network_failure.py
blob: b55440edeee560dc73bcc0f1f27535d7739a4b8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
##############################################################################
# Copyright (c) 2017 ZTE Corporation and others.
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Apache License, Version 2.0
# which accompanies this distribution, and is available at
# http://www.apache.org/licenses/LICENSE-2.0
##############################################################################
from doctor_tests.identity_auth import get_session
from doctor_tests.os_clients import nova_client
from doctor_tests.common.utils import get_doctor_test_root_dir
from doctor_tests.common.utils import SSHClient

LINK_DOWN_SCRIPT = """
#!/bin/bash -x
dev=$(sudo ip a | awk '/ {compute_ip}\//{{print $NF}}')
sleep 1
sudo ip link set $dev down
echo "doctor set link down at" $(date "+%s.%N")
sleep 10
sudo ip link set $dev up
sleep 1
"""


class NetworkFault(object):

    def __init__(self, conf, installer, log):
        self.conf = conf
        self.log = log
        self.installer = installer
        self.nova = nova_client(self.conf.nova_version, get_session())
        self.test_dir = get_doctor_test_root_dir()
        self.host = None
        self.GetLog = False
        self.disable_network_log = None

    def start(self, host):
        self.log.info('fault inject start......')
        self._set_link_down(host.ip)
        self.host = host
        self.log.info('fault inject end......')

    def cleanup(self):
        self.log.info('fault inject cleanup......')
        self.get_disable_network_log()

    def get_disable_network_log(self):
        if self.GetLog:
            self.log.info('Already get the disable_netork.log '
                          'from down_host......')
            return self.disable_network_log
        if self.host is not None:
            client = SSHClient(
                self.host.ip,
                self.installer.node_user_name,
                key_filename=self.installer.get_ssh_key_from_installer(),
                look_for_keys=True,
                log=self.log)

            self.disable_network_log = '{0}/{1}'.format(self.test_dir,
                                                        'disable_network.log')
            client.scp('disable_network.log',
                       self.disable_network_log,
                       method='get')
            self.log.info('Get the disable_netork.log from'
                          'down_host(host_name:%s, host_ip:%s)'
                          % (self.host.name, self.host.ip))
        self.GetLog = True
        return self.disable_network_log

    def _set_link_down(self, compute_ip):
        file_name = '{0}/{1}'.format(self.test_dir, 'disable_network.sh')
        with open(file_name, 'w') as file:
            file.write(LINK_DOWN_SCRIPT.format(compute_ip=compute_ip))
        client = SSHClient(
            compute_ip,
            self.installer.node_user_name,
            key_filename=self.installer.get_ssh_key_from_installer(),
            look_for_keys=True,
            log=self.log)
        client.scp(file_name, 'disable_network.sh')
        command = 'bash disable_network.sh > disable_network.log 2>&1 &'
        client.ssh(command)