Merge "Add create vm script and foreman config"
[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 deployment --env %s --download --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                   or env[0][E['status']] == 'stopped'):
80                 break
81             else:
82                 time.sleep(SLEEP_TIME)
83         exec_cmd('rm %s' % LOG_FILE)
84
85         if ready:
86             log('Environment %s successfully deployed' % self.env_id)
87         else:
88             err('Deployment failed, environment %s is not operational'
89                 % self.env_id)
90
91     def verify_node_status(self):
92         node_list = parse(exec_cmd('fuel node list'))
93         failed_nodes = []
94         for node in node_list:
95             if node[N['status']] != 'ready':
96                 failed_nodes.append((node[N['id']], node[N['status']]))
97
98         if failed_nodes:
99             summary = ''
100             for node, status in failed_nodes:
101                 summary += '[node %s, status %s]\n' % (node, status)
102             err('Deployment failed: %s' % summary)
103
104     def health_check(self):
105         log('Now running sanity and smoke health checks')
106         log(exec_cmd('fuel health --env %s --check sanity,smoke --force'
107                      % self.env_id))
108         
109     def deploy(self):
110         self.config_opnfv()
111         self.run_deploy()
112         self.verify_node_status()
113         self.health_check()