Move userdata templating to salt.utils.cloud

This commit is contained in:
Erik Johnson 2017-03-31 13:46:10 -05:00
parent b440d0c679
commit 6a6ef0adf8
5 changed files with 68 additions and 128 deletions

View file

@ -872,9 +872,6 @@ def request_instance(call=None, kwargs=None): # pylint: disable=unused-argument
userdata_file = config.get_cloud_config_value(
'userdata_file', vm_, __opts__, search_global=False, default=None
)
userdata_template = config.get_cloud_config_value(
'userdata_template', vm_, __opts__, search_global=False, default=None
)
if userdata_file is None:
userdata = config.get_cloud_config_value(
'userdata', vm_, __opts__, search_global=False, default=None
@ -884,36 +881,13 @@ def request_instance(call=None, kwargs=None): # pylint: disable=unused-argument
with salt.utils.fopen(userdata_file, 'r') as fh_:
userdata = fh_.read()
if userdata is not None:
# Use the cloud profile's userdata_template, otherwise get it from the
# master configuration file.
renderer = __opts__.get('userdata_template') \
if userdata_template is None
else userdata_template
if renderer is not None:
render_opts = __opts__.copy()
render_opts.update(vm_)
rend = salt.loader.render(render_opts, {})
blacklist = __opts__['renderer_blacklist']
whitelist = __opts__['renderer_whitelist']
userdata = compile_template(
':string:',
rend,
renderer,
blacklist,
whitelist,
input_data=userdata,
)
userdata = salt.utils.cloud.userdata_template(__opts__, vm_, userdata)
if userdata is not None:
try:
# template renderers like "jinja" should return a StringIO
os_kwargs['custom_data'] = \
''.join(base64.b64encode(userdata).readlines())
except AttributeError:
try:
os_kwargs['custom_data'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s')
os_kwargs['custom_data'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s', exc)
iface_data = create_interface(kwargs=vm_)
vm_['iface_id'] = iface_data['id']

View file

@ -93,8 +93,6 @@ import salt.utils
from salt._compat import ElementTree as ET
import salt.utils.http as http
import salt.utils.aws as aws
import salt.loader
from salt.template import compile_template
# Import salt.cloud libs
import salt.utils.cloud
@ -1681,9 +1679,6 @@ def request_instance(vm_=None, call=None):
userdata_file = config.get_cloud_config_value(
'userdata_file', vm_, __opts__, search_global=False, default=None
)
userdata_template = config.get_cloud_config_value(
'userdata_template', vm_, __opts__, search_global=False, default=None
)
if userdata_file is None:
userdata = config.get_cloud_config_value(
'userdata', vm_, __opts__, search_global=False, default=None
@ -1694,36 +1689,13 @@ def request_instance(vm_=None, call=None):
with salt.utils.fopen(userdata_file, 'r') as fh_:
userdata = fh_.read()
if userdata is not None:
# Use the cloud profile's userdata_template, otherwise get it from the
# master configuration file.
renderer = __opts__.get('userdata_template') \
if userdata_template is None
else userdata_template
if renderer is not None:
render_opts = __opts__.copy()
render_opts.update(vm_)
rend = salt.loader.render(render_opts, {})
blacklist = __opts__['renderer_blacklist']
whitelist = __opts__['renderer_whitelist']
userdata = compile_template(
':string:',
rend,
renderer,
blacklist,
whitelist,
input_data=userdata,
)
userdata = salt.utils.cloud.userdata_template(__opts__, vm_, userdata)
if userdata is not None:
try:
# template renderers like "jinja" should return a StringIO
params[spot_prefix + 'UserData'] = \
''.join(base64.b64encode(userdata).readlines())
except AttributeError:
try:
params[spot_prefix + 'UserData'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s')
params[spot_prefix + 'UserData'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s', exc)
vm_size = config.get_cloud_config_value(
'size', vm_, __opts__, search_global=False

View file

@ -647,42 +647,15 @@ def request_instance(vm_=None, call=None):
userdata_file = config.get_cloud_config_value(
'userdata_file', vm_, __opts__, search_global=False, default=None
)
userdata_template = config.get_cloud_config_value(
'userdata_template', vm_, __opts__, search_global=False, default=None
)
if userdata_file is not None:
with salt.utils.fopen(userdata_file, 'r') as fp_:
userdata = fp_.read()
# Use the cloud profile's userdata_template, otherwise get it from the
# master configuration file.
renderer = __opts__.get('userdata_template') \
if userdata_template is None
else userdata_template
if renderer is not None:
render_opts = __opts__.copy()
render_opts.update(vm_)
rend = salt.loader.render(render_opts, {})
blacklist = __opts__['renderer_blacklist']
whitelist = __opts__['renderer_whitelist']
userdata = compile_template(
':string:',
rend,
renderer,
blacklist,
whitelist,
input_data=userdata,
userdata = salt.utils.cloud.userdata_template(
__opts__, vm_, fp_.read()
)
try:
# template renderers like "jinja" should return a StringIO
kwargs['userdata'] = ''.join(base64.b64encode(userdata).readlines())
except AttributeError:
try:
kwargs['userdata'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s')
kwargs['userdata'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s', exc)
kwargs['config_drive'] = config.get_cloud_config_value(
'config_drive', vm_, __opts__, search_global=False

View file

@ -528,42 +528,15 @@ def request_instance(vm_=None, call=None):
userdata_file = config.get_cloud_config_value(
'userdata_file', vm_, __opts__, search_global=False, default=None
)
userdata_template = config.get_cloud_config_value(
'userdata_template', vm_, __opts__, search_global=False, default=None
)
if userdata_file is not None:
with salt.utils.fopen(userdata_file, 'r') as fp_:
userdata = fp_.read()
# Use the cloud profile's userdata_template, otherwise get it from the
# master configuration file.
renderer = __opts__.get('userdata_template') \
if userdata_template is None
else userdata_template
if renderer is not None:
render_opts = __opts__.copy()
render_opts.update(vm_)
rend = salt.loader.render(render_opts, {})
blacklist = __opts__['renderer_blacklist']
whitelist = __opts__['renderer_whitelist']
userdata = compile_template(
':string:',
rend,
renderer,
blacklist,
whitelist,
input_data=userdata,
userdata = salt.utils.cloud.userdata_template(
__opts__, vm_, fp_.read()
)
try:
# template renderers like "jinja" should return a StringIO
kwargs['ex_userdata'] = ''.join(base64.b64encode(userdata).readlines())
except AttributeError:
try:
kwargs['ex_userdata'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s')
kwargs['ex_userdata'] = base64.b64encode(userdata)
except Exception as exc:
log.exception('Failed to encode userdata: %s', exc)
config_drive = config.get_cloud_config_value(
'config_drive', vm_, __opts__, default=None, search_global=False

View file

@ -55,6 +55,8 @@ except ImportError:
import salt.crypt
import salt.client
import salt.config
import salt.loader
import salt.template
import salt.utils
import salt.utils.event
from salt.utils import vt
@ -3207,3 +3209,49 @@ def check_key_path_and_mode(provider, key_path):
return False
return True
def userdata_template(opts, vm_, userdata):
'''
Use the configured templating engine to template the userdata file
'''
# No userdata, no need to template anything
if userdata is None:
return userdata
userdata_template = salt.config.get_cloud_config_value(
'userdata_template', vm_, opts, search_global=False, default=None
)
# Use the cloud profile's userdata_template, otherwise get it from the
# master configuration file.
renderer = opts.get('userdata_template') \
if userdata_template is None \
else userdata_template
if renderer is None:
return userdata
else:
render_opts = opts.copy()
render_opts.update(vm_)
rend = salt.loader.render(render_opts, {})
blacklist = opts['renderer_blacklist']
whitelist = opts['renderer_whitelist']
templated = salt.template.compile_template(
':string:',
rend,
renderer,
blacklist,
whitelist,
input_data=userdata,
)
if not isinstance(templated, six.string_types):
# template renderers like "jinja" should return a StringIO
try:
templated = ''.join(templated.readlines())
except AttributeError:
log.warning(
'Templated userdata resulted in non-string result (%s), '
'converting to string', templated
)
templated = str(templated)
return templated