Compare commits

..

No commits in common. "42235b9d6214e0d2e4e1af4d43a8c20fa7ed9bca" and "99026776a67219ea896845c60e0e5ead0d970b28" have entirely different histories.

2 changed files with 39 additions and 61 deletions

View File

@ -6,8 +6,7 @@ if ! ( ENV['SCULLERY_BOX_NAME'] && ENV['SCULLERY_BOX_IMAGE'] ) || ! ( ENV['SCULL
exit 1 exit 1
end end
salt_bootstrap = ENV['SCULLERY_BOOTSTRAP'] salt_bootstrap = "test/bootstrap-salt-roots.sh"
salt_file_roots = 'file_roots:\n base:\n - /srv/salt\n - /srv/formulas\n'
Vagrant.configure("2") do |config| Vagrant.configure("2") do |config|
config.vm.provider "libvirt" config.vm.provider "libvirt"
@ -23,12 +22,10 @@ Vagrant.configure("2") do |config|
master_config.vm.provider :libvirt do |libvirt| master_config.vm.provider :libvirt do |libvirt|
libvirt.memory = 768 libvirt.memory = 768
end end
if salt_bootstrap
master_config.vm.provision "shell", path: salt_bootstrap master_config.vm.provision "shell", path: salt_bootstrap
end master_config.vm.provision "shell", inline: <<-SHELL
master_config.vm.provision "shell", env: {'SALT_FILE_ROOTS': salt_file_roots}, inline: <<-SHELL
printf 'auto_accept: True\n' > /etc/salt/master.d/notsecure.conf printf 'auto_accept: True\n' > /etc/salt/master.d/notsecure.conf
printf "$SALT_FILE_ROOTS" > /etc/salt/master.d/roots.conf printf 'file_roots:\n base:\n - /srv/salt\n - /srv/formulas\n' > /etc/salt/master.d/roots.conf
systemctl enable --now salt-master systemctl enable --now salt-master
SHELL SHELL
end end
@ -45,14 +42,9 @@ Vagrant.configure("2") do |config|
systemctl enable --now salt-minion systemctl enable --now salt-minion
SHELL SHELL
else else
minion_config.vm.provision "shell", env: {'SALT_FILE_ROOTS': salt_file_roots}, inline: <<-SHELL
printf "$SALT_FILE_ROOTS" > /etc/salt/minion.d/roots.conf
SHELL
if salt_bootstrap
minion_config.vm.provision "shell", path: salt_bootstrap minion_config.vm.provision "shell", path: salt_bootstrap
end end
end end
end end
end end
end
end end

78
scullery.py Executable file → Normal file
View File

@ -18,21 +18,26 @@ import logging
import os import os
import sys import sys
try:
import vagrant
except ImportError as myerror:
print('Could not load python-vagrant')
sys.exit(1)
argparser = ArgumentParser() argparser = ArgumentParser()
config = ConfigParser() config = ConfigParser()
env = os.environ.copy() env = os.environ.copy()
arggroup = argparser.add_mutually_exclusive_group() arggroup = argparser.add_mutually_exclusive_group()
argparser.add_argument('--debug', help='Print extremely verbose output', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO) argparser.add_argument('--debug', help='Print extremely verbose output', action='store_const', dest='loglevel', const=logging.DEBUG, default=logging.INFO)
argparser.add_argument('--config', help='Specify the configuration file to use', default='{}/scullery.ini'.format(os.getcwd())) argparser.add_argument('--config', help='Specify the configuration file to use', default='{}/scullery.ini'.format(os.path.abspath(os.path.dirname(__file__))))
argparser.add_argument('--env', help='Write environment file for direct use of Vagrant', action='store_true')
argparser.add_argument('--suite', help='Specify the suite to run', required=True) argparser.add_argument('--suite', help='Specify the suite to run', required=True)
arggroup.add_argument('--stop', help='Stop running machines', action='store_true') arggroup.add_argument('--stop', help='Stop running machines', action='store_true')
arggroup.add_argument('--test', help='Start machines and run tests', action='store_true') arggroup.add_argument('--test', help='Start machines and run tests', action='store_true')
arggroup.add_argument('--status', help='Get Vagrant deployment status', action='store_true') arggroup.add_argument('--status', help='Get Vagrant deployment status', action='store_true')
args = argparser.parse_args() args = argparser.parse_args()
configfile = args.config config.read(args.config)
vmprefix = 'scullery' vmprefix = 'scullery'
@ -71,25 +76,25 @@ def genvms(flavor, amount):
vms.append('{}-{}{}'.format(vmprefix, flavor, i)) vms.append('{}-{}{}'.format(vmprefix, flavor, i))
return vms return vms
def _setenv(envmap, dump=False): def vagrant_env(box_name, box_image, minions=None, masters=None, vagrantfile=None):
if dump:
log.debug('Writing environment variable file')
fh = open('.scullery_env', 'w') fh = open('.scullery_env', 'w')
for variable, value in envmap.items(): if vagrantfile is not None:
if value is not None: env['VAGRANT_VAGRANTFILE'] = vagrantfile
if isinstance(value, list): fh.write('VAGRANT_VAGRANTFILE={}\n'.format(vagrantfile))
value = ','.join(value) env['SCULLERY_BOX_NAME'] = box_name
env[variable] = value env['SCULLERY_BOX_IMAGE'] = box_image
if dump: fh.write('SCULLERY_BOX_NAME={}\nSCULLERY_BOX_IMAGE={}\n'.format(box_name, box_image))
fh.write(f'{variable}={value}\n') if masters is not None:
if dump: env_masters = ','.join(masters)
env['SCULLERY_MASTERS'] = env_masters
fh.write('SCULLERY_MASTERS={}\n'.format(env_masters))
if minions is not None:
env_minions = ','.join(minions)
env['SCULLERY_MINIONS'] = env_minions
fh.write('SCULLERY_MINIONS={}\n'.format(env_minions))
#log.debug('Environment is: {}'.format(str(env)))
fh.close() fh.close()
def vagrant_env(box_name, box_image, minions=None, masters=None, vagrantfile=None, bootstrap=None):
envmap = {'VAGRANT_VAGRANTFILE': vagrantfile, 'SCULLERY_BOX_NAME': box_name, 'SCULLERY_BOX_IMAGE': box_image,
'SCULLERY_MASTERS': masters, 'SCULLERY_MINIONS': minions, 'SCULLERY_BOOTSTRAP': bootstrap}
log.debug('Environment variable map: {}'.format(str(envmap)))
_setenv(envmap, args.env)
v.env = env v.env = env
def vagrant_isup(suite): def vagrant_isup(suite):
@ -112,12 +117,6 @@ def vagrant_isup(suite):
def main_interactive(): def main_interactive():
configmap = _config() configmap = _config()
box = configmap['box'] box = configmap['box']
box_name = box.get('name', None)
box_image = box.get('image', None)
box_file = box.get('file', '{}/Vagrantfile-Template'.format(os.path.abspath(os.path.dirname(__file__))))
if any([box_name, box_image, box_file]) is None:
_abort('Box configuration is incomplete')
box_bootstrap = box.get('bootstrap', None)
suites = configmap['suites'] suites = configmap['suites']
suite = args.suite suite = args.suite
if suite not in suites: if suite not in suites:
@ -129,12 +128,12 @@ def main_interactive():
minions = genvms('minion', suiteconf['minions']) minions = genvms('minion', suiteconf['minions'])
if suiteconf.get('masters', 0) > 0: if suiteconf.get('masters', 0) > 0:
masters = genvms('master', suiteconf['masters']) masters = genvms('master', suiteconf['masters'])
vagrant_env(box_name, box_image, minions, masters, box_file, box_bootstrap) vagrant_env(box['name'], box['image'], minions, masters, box['file'])
if args.status: if args.status:
log.info('Status report: {}'.format(v.status())) log.info('Status report: {}'.format(v.status()))
return True return True
status = vagrant_isup(suite) status = vagrant_isup(suite)
if status[0] is True and status[1] is None or args.stop: if status[0] is True and status[1] is None:
if args.stop is True: if args.stop is True:
log.info('Destroying machines ...') log.info('Destroying machines ...')
v.destroy() v.destroy()
@ -163,30 +162,17 @@ def main_interactive():
else: else:
_abort('Start failed') _abort('Start failed')
logging.basicConfig(format='%(asctime)s %(levelname)s - %(funcName)s: %(message)s', datefmt='%H:%M:%S')
log = logging.getLogger('scullery')
if __name__ == '__main__': if __name__ == '__main__':
logging.basicConfig(format='%(asctime)s %(levelname)s - %(funcName)s: %(message)s', datefmt='%H:%M:%S')
log = logging.getLogger('scullery')
log.setLevel(args.loglevel) log.setLevel(args.loglevel)
log.debug(args) log.debug(args)
if args.loglevel == logging.WARNING: if args.loglevel == logging.INFO:
quiet_stderr = True log_stderr = True
else: else:
quiet_stderr = False log_stderr = False
log.debug('Vagrant stderr: {}'.format(str(quiet_stderr))) v = _vagrant(log_stderr)
try:
import vagrant
except ImportError as myerror:
_abort('Could not load python-vagrant')
if os.path.isfile(configfile):
config.read(configfile)
else:
_abort('Unable to locate configuration file at {}'.format(configfile))
if __name__ == '__main__':
v = _vagrant(quiet_stderr)
main_interactive() main_interactive()
else: else:
v = _vagrant() v = _vagrant()