-
Notifications
You must be signed in to change notification settings - Fork 0
/
yamlCreator
154 lines (125 loc) · 7.47 KB
/
yamlCreator
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
import flask
from flask import Flask, jsonify, request, json, Response
import os
import yaml
import re
import logging
from logging.handlers import RotatingFileHandler
import base64
from versionvalidator import APIDraftVersionValidator
import uuid
from flask import send_file
import zipfile
app = Flask(__name__)
UPLOAD_FOLDER = '/apiYamls/'
ALLOWED_EXTENSIONS = set(['yaml'])
class YamlCreater :
def __init__(self):
self.propsFileDict=None
cwd, cfn = os.path.split(os.getcwd())
txnDir = cwd+UPLOAD_FOLDER+str(uuid.uuid1())
self.dirname=txnDir
self.dirnamercvd=txnDir+'/rcvd'
self.dirnamecreated=txnDir+'/created/'
os.makedirs(self.dirnamecreated)
os.makedirs(txnDir+'/zip')
self.fZip=txnDir+'/zip/Yamls.zip'
@app.route('/createYamls', methods = ['POST'])
def createEnvYamlFiles():
rh=YamlCreater()
pyld=None
statusCd=None
if 'apiFile' not in flask.request.files or 'propsFile' not in flask.request.files:
data = {'status':'Failure','error' : 'No Files.'}
pyld = json.dumps(data)
return Response(pyld, 400)
errs={}
logger.info('Inside createEnvYamlFiles')
apiFiles=flask.request.files.getlist("apiFile")
#Save and Load Props File into Obj
propsFile=flask.request.files.getlist("propsFile")[0]
propsFilePath=rh.storeFile(propsFile,rh.dirnamercvd)
propsFileDict=rh.getDeploymentPropsMap(propsFilePath)
for file in apiFiles:
file_errors=[]
logger.info("createEnvYamlFiles file recieved:"+file.filename)
if file and not rh.allowed_file(file.filename):
logger.error("Invalid API Yaml File Extn:"+file.filename)
errs[file.filename]='File Extension InValid'
elif file and rh.allowed_file(file.filename):
# Store API File
tplFilePath=rh.storeFile(file,rh.dirnamercvd)
#Load API into YamlO
with open(tplFilePath, 'r') as ymlof:
ymlo = yaml.load(ymlof)
#logger.info('ymlo loaded-->'+str(ymlo))
#For Each Env, Update Props Value and Save as new File
envs='SIT,UAT,PROD'
for env in envs.split(','):
envAPIPropKey='apiproperties~'+file.filename.split('.yaml')[0]+'~'+env
logger.info('Checking Prop Key '+envAPIPropKey+' in Props File:'+propsFile.filename)
if envAPIPropKey in propsFileDict :
logger.info(envAPIPropKey +'found in file'+propsFile.filename+' with value:'+propsFileDict[envAPIPropKey])
envPropsJSON=json.loads(propsFileDict[envAPIPropKey])
logger.info('envPropsJSON:'+str(envPropsJSON))
for prop in envPropsJSON:
logger.info(str(prop) + ' value for env'+env+' for API File '+ file.filename+' is '+str(envPropsJSON[prop]))
logger.info('from tpl yamlo'+str( ymlo['x-ibm-configuration'] ))
if prop not in ymlo['x-ibm-configuration']['properties']:
file_errors.append(str(prop)+'not defined in Yaml File'+file.filename)
else:
propVal=envPropsJSON[prop]
#logger.info('PROPS..-->'+str( ymlo['x-ibm-configuration']['properties'][prop]))
ymlo['x-ibm-configuration']['properties'][prop]['value']=str(propVal)
envAPIYamlFile=rh.dirnamecreated+file.filename+'_'+env+'.yaml'
with open(envAPIYamlFile, 'w') as fenvAPIYamlFile:
yaml.dump(ymlo, fenvAPIYamlFile,default_style='"')
if len(file_errors) > 0:
errs[file.filename]=file_errors
if len(errs) > 0:
#send Error Response
print('Erros-->'+str(errs))
else :
created=rh.createZipFile()
return send_file(rh.fZip,
mimetype = 'application/zip',
attachment_filename= 'Yamls.zip',
as_attachment = True)
def allowed_file(self,filename):
return '.' in filename and \
filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
def createZipFile(self):
zipf = zipfile.ZipFile(self.fZip,'w', zipfile.ZIP_DEFLATED)
logger.info('Creating zip from files in :'+self.dirnamecreated)
abs_src = os.path.abspath(self.dirnamecreated)
for dirname, subdirs, files in os.walk(self.dirnamecreated):
for filename in files:
logger.info('Adding File in Zip:'+str(filename))
absname = os.path.abspath(os.path.join(dirname, filename))
arcname = absname[len(abs_src) + 1:]
zipf.write(absname, arcname)
zipf.close()
return os.path.exists(self.fZip)
def storeFile(self,file,path):
if not os.path.exists(path):
os.makedirs(path)
filePath=os.path.join(path, file.filename)
file.save(filePath)
return filePath
def getDeploymentPropsMap(self,filePath):
self.propsFileDict = {}
with open(filePath, 'r') as f:
for line in f:
line = line.rstrip() #removes trailing whitespace and '\n' chars
if "=" not in line: continue #skips blanks and comments w/o =
if line.startswith("#"): continue #skips comments which contain
k, v = line.split("=", 1)
self.propsFileDict[k] = v
return self.propsFileDict
if __name__ == '__main__':
handler = RotatingFileHandler('createYaml.log', maxBytes=10000, backupCount=1)
handler.setLevel(logging.INFO)
logger = logging.getLogger('__name__')
logger.setLevel(logging.INFO)
logger.addHandler(handler)
app.run(host='0.0.0.0', port=5501)