dc2f3baa8d262d40a785ab90a9e73c6fb1797cce
[sdnvpn.git] / odl-pipeline / lib / deployment_cloner / deployment_cloner.py
1 #!/bin/python
2 from utils import utils_yaml
3 from utils.utils_log import for_all_methods, log_enter_exit
4 from utils.service import Service
5 from utils.node_manager import NodeManager
6 from utils.processutils import execute
7 from common import config as CONFIG
8
9
10 @for_all_methods(log_enter_exit)
11 class DeploymentCloner(Service):
12
13     undercloud_root_dir = '~/DeploymentCloner/'
14
15     def create_cli_parser(self, parser):
16         parser.add_argument('--undercloud-ip', help="ip of undercloud",
17                             required=True)
18         parser.add_argument('--dest-dir', help="where everything should go to",
19                             required=True)
20         return parser
21
22     def undercloud_dict(self, undercloud_ip):
23         return {'address': undercloud_ip,
24                 'user': 'stack'}
25
26     def run(self, sys_args, config):
27         dest_dir = sys_args.dest_dir if sys_args.dest_dir[:-1] == '/'\
28             else (sys_args.dest_dir + '/')
29         self.node_manager = NodeManager()
30         underlcloud = self.node_manager.add_node(
31             'undercloud',
32             self.undercloud_dict(sys_args.undercloud_ip))
33         # copy all files to undercloud
34         underlcloud.copy('to', '.', self.undercloud_root_dir)
35         # generate the undercloud yaml
36         underlcloud.execute('cd %s; ./tripleo_manager.sh --out ./cloner-info/'
37                             % self.undercloud_root_dir, log_true=True)
38         underlcloud.copy('from', dest_dir,
39                          self.undercloud_root_dir + '/cloner-info/')
40         node_yaml_path = dest_dir + '/cloner-info/' + CONFIG.NODE_YAML_PATH
41         node_yaml = utils_yaml.read_dict_from_yaml(node_yaml_path)
42         for name, node in node_yaml['servers'].iteritems():
43             node['vNode-name'] = self.get_virtual_node_name_from_mac(
44                 node['orig-ctl-mac'])
45         utils_yaml.write_dict_to_yaml(node_yaml, node_yaml_path)
46         # TODO copy qcow and tar it
47
48     def get_virtual_node_name_from_mac(self, mac):
49         vNode_names, _ = execute('virsh list|awk \'{print $2}\'', shell=True)
50         for node in vNode_names.split('\n'):
51             if 'baremetal' in node:
52                 admin_net_mac, _ = execute(
53                     'virsh domiflist %s |grep admin |awk \'{print $5}\''
54                     % node, shell=True)
55                 if admin_net_mac.replace('\n', '') == mac:
56                     return node
57         raise Exception('Could not find corresponding virtual node for MAC: %s'
58                         % mac)
59
60
61 def main():
62     main = DeploymentCloner()
63     main.start()
64
65 if __name__ == '__main__':
66     main()