0ab4a7de54717059b5c87b303944171240b44480
[ccsdk/distribution.git] / ansible-server / src / main / ansible-server / BuildPlaybookParams.py
1 '''
2 /*-
3 * ============LICENSE_START=======================================================
4 * ONAP : APPC
5 * ================================================================================
6 * Copyright (C) 2017-2019 AT&T Intellectual Property.  All rights reserved.
7 * ================================================================================
8 * Copyright (C) 2017 Amdocs
9 * =============================================================================
10 * Licensed under the Apache License, Version 2.0 (the "License");
11 * you may not use this file except in compliance with the License.
12 * You may obtain a copy of the License at
13 *
14 *      http://www.apache.org/licenses/LICENSE-2.0
15 *
16 * Unless required by applicable law or agreed to in writing, software
17 * distributed under the License is distributed on an "AS IS" BASIS,
18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19 * See the License for the specific language governing permissions and
20 * limitations under the License.
21
22 * ============LICENSE_END=========================================================
23 */
24 '''
25
26 from os import listdir
27 from os.path import isfile, join
28 import os.path
29 import shutil
30 import subprocess
31
32 import cherrypy
33
34
35 def buildInventorySysCall(ansible_path, ansible_inv, node_list, playbook_dir, target_inv, hostgrouplist, hostnamelist,
36                           inventory_names=None):
37     if not node_list:
38         local_node_list = "host"
39         local_credentials = "localhost    ansible_connection=local"
40
41         f = open(playbook_dir + "/" + target_inv, "w")
42         f.write("[" + local_node_list + "]\n")
43         f.write(local_credentials)
44         f.close()
45     else:
46         # Get credentials from file
47         data_inventory_orig = {}
48         data_inventory_target = {}
49         curr_group = None
50
51         cherrypy.log("***> " + ansible_path + "/" + ansible_inv)
52         f = open(ansible_path + "/" + ansible_inv, "r")
53         for line in f:
54             line = line.rstrip()
55
56             if len(line) > 0:
57                 if '#' not in line:
58                     if "[" in line and "]" in line:
59                         data_inventory_orig[line] = []
60                         curr_group = line
61                     else:
62                         data_inventory_orig[curr_group].append(line)
63         f.close()
64
65         if inventory_names is None:
66             for node in node_list:
67                 processSingleNode(node, data_inventory_orig, data_inventory_target)
68         else:
69             for nodes_section in node_list:
70                 if ('floating_ip_address-vip' in nodes_section) & ('ne_id_vip' in nodes_section):
71                     if inventory_names == "VNFC" or inventory_names == "VM":
72                         node = nodes_section['ne_id_vip']
73                         processSingleNode(node, data_inventory_orig, data_inventory_target)
74                 for vm in nodes_section['vm-info']:
75                     node = vm['ne_id']
76                     if inventory_names == "VNFC" or inventory_names == "VM":
77                         processSingleNode(node, data_inventory_orig, data_inventory_target)
78
79         f = open(playbook_dir + "/" + target_inv, "w")
80         for key in data_inventory_target:
81             f.write(key + "\n")
82             for rec in data_inventory_target[key]:
83                 hostgrouplist.append(key.replace("[", '').replace("]", ''))
84                 hostnamelist.append(rec.split(' ')[0])
85                 f.write(rec + "\n")
86         f.close()
87
88
89 def processSingleNode(node, data_inventory_orig, data_inventory_target):
90     fail_flag = True
91     if "[" + node + "]" in data_inventory_orig:
92         if "[" + node + "]" not in data_inventory_target:
93             cherrypy.log("RESET", "[" + node + "]")
94             data_inventory_target["[" + node + "]"] = []
95         else:
96             cherrypy.log("OK", "[" + node + "]")
97         fail_flag = False
98         for cred in data_inventory_orig["[" + node + "]"]:
99             data_inventory_target["[" + node + "]"].append(cred)
100     else:
101         for key in data_inventory_orig:
102             if node + " " in " ".join(data_inventory_orig[key]):
103                 if key not in data_inventory_target:
104                     data_inventory_target[key] = []
105                 for cred in data_inventory_orig[key]:
106                     if node + " " in cred:
107                         data_inventory_target[key].append(cred)
108                         fail_flag = False
109
110     if fail_flag:
111         data_inventory_target["[" + node + "]"] = \
112             [node + " ansible_connection=ssh ansible_ssh_user=na ansible_ssh_private_key_file=na"]
113
114
115 def getPlaybookFile(ansible_path, playbook_name, playbook_type, playbook_dir):
116     # Get playbooks from files
117
118     version = None
119     target_playbook_name = None
120
121     if '@' in playbook_name:
122         version = playbook_name.split("@")[1]
123         version = version.replace('.yml', '')
124         version = version.replace('.tar.gz', '')
125
126     onlyfiles = [f for f in listdir(ansible_path) if isfile(join(ansible_path, f))]
127
128     version_max = '0.00'
129     version_target = ''
130
131     for filename in onlyfiles:
132         if playbook_type in filename:
133             temp_version = filename.split("@")[1]
134             temp_version = temp_version.replace('.yml', '')
135             temp_version = temp_version.replace('.tar.gz', '')
136             if version_max < temp_version:
137                 version_max = temp_version
138
139             if version is not None:
140                 if version in playbook_name:
141                     version_target = version
142                     target_playbook_name = filename
143
144     if target_playbook_name is None:
145         for filename in onlyfiles:
146             if playbook_type in filename and version_max in filename:
147                 target_playbook_name = filename
148                 version_target = version_max
149
150     if target_playbook_name:
151         src = ansible_path + "/" + target_playbook_name
152         if not os.path.exists(src):
153             return ''
154
155         if ".tar.gz" in target_playbook_name:
156             dest = playbook_dir + "/" + playbook_type + ".tar.gz"
157             shutil.copy2(src, dest)
158             subprocess.call(['tar', '-xvzf', dest, "-C", playbook_dir])
159         else:
160             dest = playbook_dir + "/" + playbook_type + ".yml"
161             shutil.copy2(src, dest)
162
163     return version_target