Files
group-based-policy/gbpservice/contrib/nfp/tools/image_builder/disk_image_create.py
Rajendra Machani 380519eb46 NFP (contrib) - Controller Image Build Scripts
This changeset contains the following,
(1) NFP controller image builder tool
    This supports both devstack and Redhat RPM installations.
(2) NFP setup script to configure the NFP on RPM installed setup.

Change-Id: I074d713ad94286240fdae1887b0d4acd28f66144
Implements: blueprint gbp-network-services-framework
2016-08-03 17:03:01 +05:30

148 lines
4.7 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import datetime
from oslo_serialization import jsonutils
import os
import subprocess
import sys
conf = {}
cur_dir = ''
docker_build_dir = None
def parse_json(j_file):
global conf
with open(j_file) as json_data:
conf = jsonutils.load(json_data)
return
def create_configurator_docker():
docker_images = cur_dir + '/docker-images/'
docker_images = os.path.realpath(docker_images)
# create a docker image
os.chdir(docker_build_dir)
# build configuratro docker
docker_args = ['docker', 'build', '-t', 'configurator-docker', '.']
ret = subprocess.call(docker_args)
if(ret):
print("Failed to build docker image [configurator-docker]")
return -1
if not os.path.isdir(docker_images):
os.mkdir(docker_images)
os.chdir(docker_images)
del(docker_args)
# save the docker image
docker_args = ['docker', 'save', '-o', 'configurator-docker',
'configurator-docker']
ret = subprocess.call(docker_args)
if(ret):
print("Failed to save docker image [configurator-docker]")
return -1
# set environment variable, needed by 'extra-data.d'
os.environ['DOCKER_IMAGES'] = docker_images
return 0
def dib():
global docker_build_dir
dib = conf['dib']
elems = cur_dir + '/elements/'
# set the elements path in environment variable
os.environ['ELEMENTS_PATH'] = elems
# set the Ubuntu Release for the build in environment variable
os.environ['DIB_RELEASE'] = conf['ubuntu_release']['release']
# basic elements
dib_args = ['disk-image-create', 'base', 'vm', 'ubuntu']
image_name = conf['ubuntu_release']['release']
# element for creating configurator image
if 'nfp-reference-configurator' in dib['elements']:
image_name = 'nfp_reference_service'
service_dir = "%s/../../../../tests/contrib/nfp_service/" % cur_dir
service_dir = os.path.realpath(service_dir)
pecan_dir = "%s/../../../../nfp/" % cur_dir
pecan_dir = os.path.realpath(pecan_dir)
os.environ['PECAN_GIT_PATH'] = pecan_dir
os.environ['SERVICE_GIT_PATH'] = service_dir
if 'devuser' in dib['elements']:
os.environ['DIB_DEV_USER_USERNAME'] = 'ubuntu'
os.environ['DIB_DEV_USER_SHELL'] = '/bin/bash'
os.environ['SSH_RSS_KEY'] = (
"%s/%s" % (cur_dir, image_name))
os.environ['DIB_DEV_USER_AUTHORIZED_KEYS'] = (
"%s.pub" % os.environ['SSH_RSS_KEY'])
elif 'configurator' in dib['elements']:
if not docker_build_dir:
docker_build_dir = cur_dir
if(create_configurator_docker()):
return (False, None)
# for bigger size images
if "--no-tmpfs" not in dib_args:
dib_args.append('--no-tmpfs')
# append docker-opt element
if "docker-opt" not in dib_args:
dib_args.append("docker-opt")
for element in dib['elements']:
image_name = image_name + '_' + element
dib_args.append(element)
# offline mode, assuming the image cache (tar) already exists
if(dib['offline']):
dib_args.append('--offline')
# set the image build cache dir
dib_args.append('--image-cache')
dib_args.append(dib['cache_dir'])
# set image size
dib_args.append('--image-size')
dib_args.append(str(dib['image_size']))
timestamp = datetime.datetime.now().strftime('%I%M%p-%d-%m-%Y')
image_name = image_name + '_' + timestamp
dib_args.append('-o')
if 'nfp-reference-configurator' in dib['elements']:
image_name = 'nfp_reference_service'
dib_args.append(str(image_name))
os.chdir(cur_dir)
out_dir = 'output'
if not os.path.isdir(out_dir):
os.makedirs(out_dir)
os.chdir(out_dir)
print("DIB-ARGS: ", dib_args)
ret = subprocess.call(dib_args)
if not ret:
output_path = os.path.realpath('./')
print("Output path: ", output_path)
output_image = output_path + '/' + image_name + '.qcow2'
print("Image location: %s" % output_image)
with open("%s/last_built_image_path" % output_path, "w") as f:
f.write(output_image)
return (True, output_image)
return (False, None)