reduce ccsdk-ansible-server image footprint
[ccsdk/distribution.git] / ansible-server / src / main / ansible-server / AnsibleSql.py
diff --git a/ansible-server/src/main/ansible-server/AnsibleSql.py b/ansible-server/src/main/ansible-server/AnsibleSql.py
new file mode 100755 (executable)
index 0000000..ab58a96
--- /dev/null
@@ -0,0 +1,322 @@
+'''
+/*-
+* ============LICENSE_START=======================================================
+* ONAP : APPC
+* ================================================================================
+* Copyright (C) 2017 AT&T Intellectual Property.  All rights reserved.
+* ================================================================================
+* Copyright (C) 2017 Amdocs
+* =============================================================================
+* 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.
+* 
+* ECOMP is a trademark and service mark of AT&T Intellectual Property.
+* ============LICENSE_END=========================================================
+*/
+'''
+
+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()
+