diff options
author | ecnoel <eric.noel@att.com> | 2017-07-06 09:02:01 -0500 |
---|---|---|
committer | Patrick Brady <pb071s@att.com> | 2017-07-07 15:43:57 -0700 |
commit | c8bb28a6d336ce5cd932878789027ac495d9cb66 (patch) | |
tree | b059c1e71acf05b2d4569ada442c4778b57de1f5 /appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py | |
parent | 5c387465adbc2b87bcbea5279b12c197608667be (diff) |
[feature/APPC-7] ansible server commit
Change-Id: I87b4843ca5d646e390d985be27aa1e3b94491d07
Signed-off-by: ecnoel <eric.noel@att.com>
Signed-off-by: Patrick Brady <pb071s@att.com>
Diffstat (limited to 'appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py')
-rw-r--r-- | appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py b/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py new file mode 100644 index 000000000..675000428 --- /dev/null +++ b/appc-adapters/appc-ansible-adapter/appc-ansible-example-server/AnsibleSql.py @@ -0,0 +1,319 @@ +''' +/*- +* ============LICENSE_START======================================================= +* APPC +* ================================================================================ +* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. +* ================================================================================ +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +* ============LICENSE_END========================================================= +* ECOMP is a trademark and service mark of AT&T Intellectual Property. +*/ +''' + +import pymysql, sys +from os import listdir +from os.path import isfile, join + +class mySql(): + + def __init__(self, myhost, myuser, mypasswd, mydb): + self.con = True + self.error = '' + self.db = None + try: + self.db = pymysql.connect(host=myhost, + user=myuser, + passwd=mypasswd, + db=mydb) + self.cur = self.db.cursor() + except Exception as e: + self.error = e[1] + self.con = False + + def Query (self, myquery, val = None): + results = None + try: + if val: + self.cur.execute(myquery, val) + else: + self.cur.execute(myquery) + self.db.commit() + results = self.cur.fetchall() + except Exception, e: + results = repr(e) + return results + + def Close (self): + if self.db: + self.db.close() + +def loadPlaybook (sqlintf, value, version, ext = '.yml'): + + errorCode = 0 + diag = '' + + # Test if primary key already defined + query = "SELECT name FROM playbook WHERE name='" + value +"'" + results = sqlintf.Query (query) + if len(results) > 0: + pass + else: + query = "INSERT INTO playbook (name) VALUES ('" + value + "')" + results = sqlintf.Query (query) + if len(results) > 0: + errorCode = 1 + diag = results + + # Load playbook + file = open(playbook_path + value + ext, 'r') + load_file = file.read() + + if not errorCode: + sql = "UPDATE playbook SET value=%s, version=%s, type=%s WHERE name=%s" + + results = sqlintf.Query(sql, (load_file, version, ext, value)) + + if len (results) > 0: + # Error loading playbook + errorCode = 1 + diag = results + + return errorCode, diag + +def loadCredentials (sqlintf, hostgroup, hostname, cred): + errorCode = 0 + diag = '' + + # Load credentials + + query = "SELECT hostname,hostgroup FROM inventory WHERE hostname='" + hostname +"'" + results = sqlintf.Query (query) + + if hostname in str (results): + + results_hostgroups = results[0][1] + + if hostgroup in results_hostgroups.split(','): + query = "UPDATE inventory SET hostname='" + hostname + "',credentials='" +\ + cred +\ + "' WHERE hostname='" + hostname + "'" + else: + + results_hostgroups = results_hostgroups + ',' + hostgroup + + query = "UPDATE inventory SET hostname='" + hostname + "',credentials='" +\ + cred + "',hostgroup='" + results_hostgroups + \ + "' WHERE hostname='" + hostname + "'" + + results = sqlintf.Query (query) + + else: + + query = "INSERT INTO inventory (hostgroup, hostname, credentials) VALUES ('" + \ + hostgroup + "','" + hostname + "','" + cred + "')" + results = sqlintf.Query (query) + + if len (results) > 0: + # Error loading playbook + errorCode = 1 + diag = results + + return errorCode, diag + + +def readPlaybook (sqlintf, value, version=None): + + errorCode = 0 + diag = '' + + print "***> in AnsibleSql.readPlaybook" + + if not version: + query = "SELECT MAX(version) FROM playbook WHERE name like'" + value + "%'" + print " Query:", query + results = sqlintf.Query (query) + version = results[0][0] + + print " Provided playbook name:", value + print " Used version:", version + + results = [] + if version: + query = "SELECT value,type FROM playbook WHERE name='" + value + "@" + version + "'" + results = sqlintf.Query (query) + + print "Query:", query + print "Results:", results + + if len(results) == 0: + errorCode = 1 + else: + if len(results[0]) == 0: + errorCode = 1 + diag = results[0] + else: + diag = results[0] + + return value, version, errorCode, diag + +def readCredentials (sqlintf, tag): + errorCode = [] + diag = [] + + print "***> in AnsibleSql.readCredential" + + # Load credentials + + for rec in tag: + + # Try hostgroup + query = "SELECT hostgroup, hostname, credentials FROM inventory WHERE hostgroup LIKE '%" + \ + rec +"%'" + query_results = sqlintf.Query (query) + + results = () + for q in query_results: + if rec in q[0].split(','): + l = list(q) + l[0] = rec + q = tuple(l) + results = (q,) + results + + if len(results) == 0: + # Try hostname + query = "SELECT hostgroup, hostname, credentials FROM inventory WHERE hostname='" + \ + rec +"'" + results = sqlintf.Query (query) + + print " Query:", query + print " Results:", len(results), results + + if len(results) == 0: + errorCode = 1 + hostgroup = rec + hostname = rec + credentials = 'ansible_connection=ssh ansible_ssh_user=na ansible_ssh_private_key_file=na\n' + diag.append([hostgroup, hostname, credentials]) + else: + errorCode = 0 + for i in range(len (results)): + for h in results[i][0].split(','): + hostgroup = h + hostname = results[i][1] + credentials = results[i][2] + diag.append([hostgroup, hostname, credentials]) + + return errorCode, diag + + +if __name__ == '__main__': + + ################################################################ + # Change below + ################################################################ + host="localhost" # your host, usually localhost + user="mysql_user_id" # your username + passwd="password_4_mysql_user_id" # your password + db="ansible" # name of the data base + + playbook_path = "/home/ubuntu/RestServerOpenSource/" + inventory = "/home/ubuntu/RestServerOpenSource/Ansible_inventory" + ################################################################ + + onlyfiles = [f for f in listdir(playbook_path) + if isfile(join(playbook_path, f))] + + sqlintf = mySql (host, user, passwd, db) + + # Load playbooks + + print "Loading playbooks" + for file in onlyfiles: + if "yml" in file: + + name = file.split (".yml")[0] + print " Loading:", name + version = name.split("@")[1] + errorCode, diag = loadPlaybook (sqlintf, name, version, '.yml') + if errorCode: + print " Results: Failed - ", diag + else: + print " Results: Success" + + print "\nLoading inventory" + + # Load inventory + + hostgroup = None + inv = {} + file = open(inventory, 'r') + + for line in file: + + if '[' in line and ']' in line: + hostgroup = line.strip().replace('[','').replace(']','') + inv[hostgroup] = {} + elif hostgroup and len(line.strip())>0: + host = line.strip().split(" ")[0] + credentials = line.replace(host,"") + inv[hostgroup][host] = credentials + + file.close() + + for hostgroup in inv: + print " Loading:", hostgroup + hostfqdn = '' + cred = '' + for hostname in inv[hostgroup]: + cred = inv[hostgroup][hostname] + errorCode, diag = loadCredentials (sqlintf, hostgroup, hostname, cred) + if errorCode: + print " Results: Failed - ", diag + else: + print " Results: Success" + + print "\nReading playbook" + + # Read playbook + + if not sqlintf.con: + print "Cannot connect to MySql:", sqlintf.error + sys.exit() + + name = "ansible_sleep" + print "Reading playbook:", name + value, version, errorCode, diag = readPlaybook (sqlintf, name) + if errorCode: + print "Results: Failed - ", diag + else: + print "Results: Success" + print value + print version + print diag + + print "\nReading inventory" + + # Read inventory + + tag = ["your_inventory_test_group_name"] + print "Reading inventory tag:", tag + errorCode, diag = readCredentials (sqlintf, tag) + if errorCode: + print "Results: Failed - ", diag + else: + print "Results: Success" + print diag + + sqlintf.Close() + |