blob: 17504b3e576cf201c092c5e614ef53f72bc01646 [file] [log] [blame]
S.Çağlar Onur3e92b4d2015-02-09 13:34:11 -05001#!/usr/bin/env python
Sapan Bhatia88181f22014-11-19 15:25:38 -05002import jinja2
3import tempfile
4import os
5import json
Sapan810240c2014-12-02 23:50:37 -05006import pdb
7import string
8import random
Sapan Bhatia58da6612015-01-23 16:15:37 +00009import re
Scott Bakerdec77b52015-05-04 18:20:14 -070010import traceback
11import subprocess
Sapan Bhatia84cdde72015-04-15 13:31:12 -040012from xos.config import Config, XOS_DIR
Scott Baker7069c162015-02-04 16:59:45 -080013
Sapan Bhatia88181f22014-11-19 15:25:38 -050014try:
15 step_dir = Config().observer_steps_dir
Sapan810240c2014-12-02 23:50:37 -050016 sys_dir = Config().observer_sys_dir
Sapan Bhatia88181f22014-11-19 15:25:38 -050017except:
Scott Baker7069c162015-02-04 16:59:45 -080018 step_dir = XOS_DIR + '/observer/steps'
Sapan810240c2014-12-02 23:50:37 -050019 sys_dir = '/opt/opencloud'
Sapan Bhatia88181f22014-11-19 15:25:38 -050020
21os_template_loader = jinja2.FileSystemLoader( searchpath=step_dir)
22os_template_env = jinja2.Environment(loader=os_template_loader)
23
24def parse_output(msg):
25 lines = msg.splitlines()
26 results = []
27 print msg
28
29 for l in lines:
Sapan810240c2014-12-02 23:50:37 -050030 magic_str = 'ok: [127.0.0.1] => '
31 magic_str2 = 'changed: [127.0.0.1] => '
Sapan Bhatia88181f22014-11-19 15:25:38 -050032 if (l.startswith(magic_str)):
Sapan810240c2014-12-02 23:50:37 -050033 w = len(magic_str)
34 str = l[w:]
35 d = json.loads(str)
36 results.append(d)
37 elif (l.startswith(magic_str2)):
38 w = len(magic_str2)
39 str = l[w:]
40 d = json.loads(str)
41 results.append(d)
Sapan Bhatia88181f22014-11-19 15:25:38 -050042
43
44 return results
Sapan810240c2014-12-02 23:50:37 -050045
46def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
47 return ''.join(random.choice(chars) for _ in range(size))
48
Sapan Bhatia58da6612015-01-23 16:15:37 +000049def shellquote(s):
50 return "'" + s.replace("'", "'\\''") + "'"
51
Scott Bakerdec77b52015-05-04 18:20:14 -070052def run_template(name, opts,path='', expected_num=None, ansible_config=None, ansible_hosts=None, run_ansible_script=None):
Sapan Bhatia88181f22014-11-19 15:25:38 -050053 template = os_template_env.get_template(name)
54 buffer = template.render(opts)
Sapan810240c2014-12-02 23:50:37 -050055
Sapan810240c2014-12-02 23:50:37 -050056 try:
57 objname = opts['ansible_tag']
58 except:
59 objname= id_generator()
Sapan Bhatia58da6612015-01-23 16:15:37 +000060
Sapan810240c2014-12-02 23:50:37 -050061 os.system('mkdir -p %s'%'/'.join([sys_dir,path]))
62 fqp = '/'.join([sys_dir,path,objname])
63
Sapan Bhatia6d6b76c2015-03-13 18:43:46 -040064
Sapan810240c2014-12-02 23:50:37 -050065 f = open(fqp,'w')
Sapan Bhatia88181f22014-11-19 15:25:38 -050066 f.write(buffer)
67 f.flush()
Sapan810240c2014-12-02 23:50:37 -050068
Scott Bakerdec77b52015-05-04 18:20:14 -070069 # This is messy -- there's no way to specify ansible config file from
70 # the command line, but we can specify it using the environment.
71 env = os.environ.copy()
72 if ansible_config:
73 env["ANSIBLE_CONFIG"] = ansible_config
74 if ansible_hosts:
75 env["ANSIBLE_HOSTS"] = ansible_hosts
76
Sapan Bhatiac7a09c82015-04-15 13:31:37 -040077 if (not Config().observer_pretend):
Scott Bakerdec77b52015-05-04 18:20:14 -070078 if not run_ansible_script:
Scott Baker2f8608b2015-05-04 18:30:09 -070079 run_ansible_script = os.path.join(XOS_DIR, "observer/run_ansible")
Scott Bakerdec77b52015-05-04 18:20:14 -070080
81 #run = os.popen(XOS_DIR + '/observer/run_ansible %s'%shellquote(fqp), env=env)
82 run = subprocess.Popen("%s %s" % (run_ansible_script, shellquote(fqp)), shell=True, stdout=subprocess.PIPE, env=env).stdout
Sapan Bhatia01dd5d22015-03-13 18:51:02 -040083 msg = run.read()
84 status = run.close()
Sapan Bhatia88181f22014-11-19 15:25:38 -050085
Sapan Bhatia01dd5d22015-03-13 18:51:02 -040086
87 else:
88 msg = open(fqp+'.out').read()
Scott Bakerdec77b52015-05-04 18:20:14 -070089
Sapan Bhatia6d6b76c2015-03-13 18:43:46 -040090 try:
91 ok_results = parse_output(msg)
Scott Bakerdec77b52015-05-04 18:20:14 -070092 if (expected_num is not None) and (len(ok_results) != expected_num):
93 raise ValueError('Unexpected num %s!=%d' % (str(expected_num), len(ok_results)) )
Sapan Bhatia6d6b76c2015-03-13 18:43:46 -040094 except ValueError,e:
Scott Bakerdec77b52015-05-04 18:20:14 -070095 all_fatal = [e.message] + re.findall(r'^msg: (.*)',msg,re.MULTILINE)
Sapan Bhatia6d6b76c2015-03-13 18:43:46 -040096 all_fatal2 = re.findall(r'^ERROR: (.*)',msg,re.MULTILINE)
Sapan Bhatia01dd5d22015-03-13 18:51:02 -040097
Sapan Bhatia01dd5d22015-03-13 18:51:02 -040098 all_fatal.extend(all_fatal2)
Sapan Bhatiab2cef882014-12-21 02:33:13 -050099 try:
Sapan Bhatia6d6b76c2015-03-13 18:43:46 -0400100 error = ' // '.join(all_fatal)
101 except:
102 pass
103 raise Exception(error)
Sapan Bhatiab2cef882014-12-21 02:33:13 -0500104
Sapan Bhatia88181f22014-11-19 15:25:38 -0500105 return ok_results
106
Scott Bakerdec77b52015-05-04 18:20:14 -0700107def run_template_ssh(name, opts, path='', expected_num=None):
108 instance_id = opts["instance_id"]
109 sliver_name = opts["sliver_name"]
110 hostname = opts["hostname"]
111 private_key = opts["private_key"]
112
113 (private_key_handle, private_key_pathname) = tempfile.mkstemp()
114 (config_handle, config_pathname) = tempfile.mkstemp()
115 (hosts_handle, hosts_pathname) = tempfile.mkstemp()
116
117 try:
Scott Bakerf16ed222015-05-06 15:47:15 -0700118 proxy_command = "ProxyCommand ssh -q -i %s -o StrictHostKeyChecking=no %s@%s" % (private_key_pathname, instance_id, hostname)
Scott Bakerdec77b52015-05-04 18:20:14 -0700119
120 os.write(private_key_handle, private_key)
121 os.close(private_key_handle)
122
123 os.write(config_handle, "[ssh_connection]\n")
Scott Bakerf16ed222015-05-06 15:47:15 -0700124 os.write(config_handle, 'ssh_args = -o "%s" -o StrictHostKeyChecking=no\n' % proxy_command)
Scott Bakerdec77b52015-05-04 18:20:14 -0700125 os.write(config_handle, 'scp_if_ssh = True\n')
126 os.close(config_handle)
127
128 os.write(hosts_handle, "[%s]\n" % sliver_name)
129 os.write(hosts_handle, "%s ansible_ssh_private_key_file=%s\n" % (hostname, private_key_pathname))
130 os.close(hosts_handle)
131
132 print "ANSIBLE_CONFIG=%s" % config_pathname
133 print "ANSIBLE_HOSTS=%s" % hosts_pathname
134
135 return run_template(name, opts, path, expected_num, ansible_config = config_pathname, ansible_hosts = hosts_pathname, run_ansible_script="/opt/xos/observer/run_ansible_verbose")
136
137 finally:
138 #os.remove(private_key_pathname)
139 #os.remove(config_pathname)
140 #os.remove(hosts_pathname)
141 pass
142
143
144
Sapan Bhatia88181f22014-11-19 15:25:38 -0500145def main():
Sapan810240c2014-12-02 23:50:37 -0500146 run_template('ansible/sync_user_deployments.yaml',{ "endpoint" : "http://172.31.38.128:5000/v2.0/",
147 "name" : "Sapan Bhatia",
148 "email": "gwsapan@gmail.com",
149 "password": "foobar",
150 "admin_user":"admin",
151 "admin_password":"6a789bf69dd647e2",
152 "admin_tenant":"admin",
153 "tenant":"demo",
154 "roles":['user','admin'] })