Merge "Add .gitignore for Vim tmp files"
[genesis.git] / fuel / deploy / cloud / deployment.py
1 import common
2 import os
3 import shutil
4 import glob
5 import yaml
6 import io
7 import time
8
9 N = common.N
10 E = common.E
11 R = common.R
12 RO = common.RO
13 exec_cmd = common.exec_cmd
14 run_proc = common.run_proc
15 parse = common.parse
16 err = common.err
17 log = common.log
18
19
20 class Deployment(object):
21
22     def __init__(self, dea, yaml_config_dir, env_id, node_id_roles_dict):
23         self.dea = dea
24         self.yaml_config_dir = yaml_config_dir
25         self.env_id = env_id
26         self.node_id_roles_dict = node_id_roles_dict
27
28     def download_deployment_info(self):
29         log('Download deployment info for environment %s' % self.env_id)
30         deployment_dir = '%s/deployment_%s' \
31                          % (self.yaml_config_dir, self.env_id)
32         if os.path.exists(deployment_dir):
33             shutil.rmtree(deployment_dir)
34         exec_cmd('fuel --env %s deployment --default --dir %s'
35                  % (self.env_id, self.yaml_config_dir))
36
37     def upload_deployment_info(self):
38         log('Upload deployment info for environment %s' % self.env_id)
39         exec_cmd('fuel --env %s deployment --upload --dir %s'
40                  % (self.env_id, self.yaml_config_dir))
41
42     def config_opnfv(self):
43         log('Configure OPNFV settings on environment %s' % self.env_id)
44         opnfv_compute = self.dea.get_opnfv('compute')
45         opnfv_controller = self.dea.get_opnfv('controller')
46         self.download_deployment_info()
47         for node_file in glob.glob('%s/deployment_%s/*.yaml'
48                                    % (self.yaml_config_dir, self.env_id)):
49              with io.open(node_file) as stream:
50                  node = yaml.load(stream)
51              if node['role'] == 'compute':
52                 node.update(opnfv_compute)
53              else:
54                 node.update(opnfv_controller)
55              with io.open(node_file, 'w') as stream:
56                  yaml.dump(node, stream, default_flow_style=False)
57         self.upload_deployment_info()
58
59     def run_deploy(self):
60         WAIT_LOOP = 180
61         SLEEP_TIME = 60
62         LOG_FILE = 'cloud.log'
63
64         log('Starting deployment of environment %s' % self.env_id)
65         run_proc('fuel --env %s deploy-changes | strings | tee %s'
66                  % (self.env_id, LOG_FILE))
67
68         ready = False
69         for i in range(WAIT_LOOP):
70             env = parse(exec_cmd('fuel env --env %s' % self.env_id))
71             log('Environment status: %s' % env[0][E['status']])
72             r, _ = exec_cmd('tail -2 %s | head -1' % LOG_FILE, False)
73             if r:
74                 log(r)
75             if env[0][E['status']] == 'operational':
76                 ready = True
77                 break
78             elif env[0][E['status']] == 'error':
79                 break
80             else:
81                 time.sleep(SLEEP_TIME)
82         exec_cmd('rm %s' % LOG_FILE)
83
84         if ready:
85             log('Environment %s successfully deployed' % self.env_id)
86         else:
87             err('Deployment failed, environment %s is not operational'
88                 % self.env_id)
89
90     def verify_node_status(self):
91         node_list = parse(exec_cmd('fuel node list'))
92         failed_nodes = []
93         for node in node_list:
94             if node[N['status']] != 'ready':
95                 failed_nodes.append((node[N['id']], node[N['status']]))
96
97         if failed_nodes:
98             summary = ''
99             for node, status in failed_nodes:
100                 summary += '[node %s, status %s]\n' % (node, status)
101             err('Deployment failed: %s' % summary)
102
103     def health_check(self):
104         log('Now running sanity and smoke health checks')
105         exec_cmd('fuel health --env %s --check sanity,smoke --force'
106                  % self.env_id)
107         log('Health checks passed !')
108
109     def deploy(self):
110         self.config_opnfv()
111         self.run_deploy()
112         self.verify_node_status()
113         self.health_check()