Break deployment procedure into two steps

Step 1: setup configmaps and run bootstrap jobs
Step 2: run service

Partially-implements: blueprint kolla-kubernetes-cli
Co-authored-by: Ryan Hallisey <rhallise@redhat.com>
Change-Id: Ie074f21984ac89291e11e7b4798f3a18a8cc200e
This commit is contained in:
Liyi Meng 2016-05-24 23:14:17 +02:00 committed by Ryan Hallisey
parent b24d7f0e93
commit 1b65bc4a5d
4 changed files with 82 additions and 14 deletions

View File

@ -21,6 +21,18 @@ CONF = cfg.CONF
LOG = log.getLogger(__name__)
class Bootstrap(command.Command):
"""Rolling out configurations and bootstrap a service."""
def get_parser(self, prog_name):
parser = super(Bootstrap, self).get_parser(prog_name)
parser.add_argument('service')
return parser
def take_action(self, parsed_args):
service.bootstrap_service(parsed_args.service)
class Run(command.Command):
"""Run a service."""

View File

@ -34,11 +34,12 @@ PROJECT_ROOT = os.path.abspath(os.path.join(
os.path.dirname(os.path.realpath(__file__)), '../..'))
def _create_working_directory():
def _create_working_directory(target='services'):
ts = time.time()
ts = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d_%H-%M-%S_')
temp_dir = tempfile.mkdtemp(prefix='kolla-' + ts)
working_dir = os.path.join(temp_dir, 'kubernetes')
working_dir = os.path.join(working_dir, target)
os.makedirs(working_dir)
return working_dir
@ -108,6 +109,23 @@ def _load_variables_from_file(project_name):
return jvars
def _build_bootstrap(working_dir, service_name, variables=None):
for filename in service_definition.find_bootstrap_files(service_name):
proj_filename = filename.split('/')[-1].replace('.j2', '')
proj_name = filename.split('/')[-2]
LOG.debug(
'proj_filename : %s proj_name: %s' % (proj_filename, proj_name))
variables = _load_variables_from_file(proj_name)
content = yaml.load(
jinja_utils.jinja_render(filename, variables))
with open(os.path.join(working_dir, proj_filename), 'w') as f:
LOG.debug('_build_bootstrap : file : %s' %
os.path.join(working_dir, proj_filename))
f.write(yaml.dump(content, default_flow_style=False))
def _build_runner(working_dir, service_name, pod_list, variables=None):
for filename in service_definition.find_service_files(service_name):
proj_filename = filename.split('/')[-1].replace('.j2', '')
@ -125,6 +143,12 @@ def _build_runner(working_dir, service_name, pod_list, variables=None):
f.write(yaml.dump(content, default_flow_style=False))
def bootstrap_service(service_name, variables=None):
working_dir = _create_working_directory('bootstrap')
_build_bootstrap(working_dir, service_name, variables=variables)
_bootstrap_instance(working_dir, service_name)
def run_service(service_name, variables=None):
working_dir = _create_working_directory()
pod_list = service_definition.get_pod_definition(service_name)
@ -136,12 +160,13 @@ def kill_service(service_name, variables=None):
working_dir = _create_working_directory()
pod_list = service_definition.get_pod_definition(service_name)
_build_runner(working_dir, service_name, pod_list, variables=variables)
_build_bootstrap(working_dir, service_name, variables=variables)
_delete_instance(working_dir, service_name, pod_list)
def _deploy_instance(directory, service_name, pod_list):
def _bootstrap_instance(directory, service_name):
server = "--server=" + CONF.kolla_kubernetes.host
pod_list = service_definition.get_pod_definition(service_name)
for pod in pod_list:
container_list = service_definition.get_container_definition(pod)
for container in container_list:
@ -151,6 +176,31 @@ def _deploy_instance(directory, service_name, pod_list):
for f in
file_utils.get_service_config_files(container)]
# TODO(rhallisey): improve error handling to check if configmap
# already exists
LOG.info('Command : %r' % cmd)
subprocess.call(cmd)
cmd = [CONF.kolla_kubernetes.kubectl_path, server, "create", "-f",
directory]
LOG.info('Command : %r' % cmd)
subprocess.call(cmd)
def _deploy_instance(directory, service_name, pod_list):
server = "--server=" + CONF.kolla_kubernetes.host
pod_list = service_definition.get_pod_definition(service_name)
for pod in pod_list:
container_list = service_definition.get_container_definition(pod)
for container in container_list:
cmd = [CONF.kolla_kubernetes.kubectl_path, server, "create",
"configmap", '%s-configmap' % container]
cmd = cmd + ['--from-file=%s' % f
for f in
file_utils.get_service_config_files(container)]
# TODO(rhallisey): improve error handling to check if configmap
# already exists
LOG.info('Command : %r' % cmd)
subprocess.call(cmd)

View File

@ -90,6 +90,22 @@ def get_services_directory():
os.path.join(file_utils.find_base_dir(), 'services'))
def find_bootstrap_files(service_name):
bootstrap_dir = os.path.join(get_services_directory(), '../bootstrap/')
LOG.debug('Looking for bootstrap files in %s', bootstrap_dir)
if not os.path.exists(bootstrap_dir):
LOG.info('No bootstrap job for service %s', service_name)
return []
short_name = service_name.split('/')[-1]
files = []
for root, dirs, names in os.walk(bootstrap_dir):
for name in names:
if short_name in name:
files.append(os.path.join(root, name))
return files
def find_service_files(service_name):
service_dir = get_services_directory()
LOG.debug('Looking for services files in %s', service_dir)
@ -98,12 +114,6 @@ def find_service_files(service_name):
raise exception.KollaNotFoundException(service_dir,
entity='service directory')
bootstrap_dir = os.path.join(service_dir, '../bootstrap/')
LOG.debug('Looking for bootstrap files in %s', service_dir)
if not os.path.exists(bootstrap_dir):
raise exception.KollaNotFoundException(bootstrap_dir,
entity='bootstrap directory')
short_name = service_name.split('/')[-1]
files = []
for root, dirs, names in os.walk(service_dir):
@ -111,11 +121,6 @@ def find_service_files(service_name):
if short_name in name:
files.append(os.path.join(root, name))
for root, dirs, names in os.walk(bootstrap_dir):
for name in names:
if short_name in name:
files.append(os.path.join(root, name))
if not files:
raise exception.KollaNotFoundException(service_dir,
entity='service definition')

View File

@ -31,6 +31,7 @@ console_scripts =
kolla-kubernetes = kolla_kubernetes.cmd.shell:main
kolla_kubernetes.cli =
bootstrap = kolla_kubernetes.cli.service:Bootstrap
run = kolla_kubernetes.cli.service:Run
kill = kolla_kubernetes.cli.service:Kill