group-based-policy/gbpservice/contrib/nfp/tools/image_builder/disk_image_create.py

172 lines
6.3 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/../../../../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)
gbpservice_i18n_file = "%s/../../../../_i18n.py" % cur_dir
os.environ['PECAN_GIT_PATH'] = pecan_dir
os.environ['SERVICE_GIT_PATH'] = service_dir
os.environ['GBPSERVICE_I18N_FILE'] = gbpservice_i18n_file
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')
# root login enabled, set password environment varaible
if 'root-passwd' in dib['elements']:
os.environ['DIB_PASSWORD'] = dib['root_pswd']
# 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))
# wily support is removed from ubuntu 'current' release,
# download/copy to loation as expected by diskimage-builder
if conf['ubuntu_release']['release'] == "wily":
import subprocess
subprocess.getoutput("mkdir -p %s" % dib['cache_dir'])
wily_SHA256SUMS = "%s/SHA256SUMS.ubuntu.wily.amd64" % dib['cache_dir']
if not os.path.isfile(wily_SHA256SUMS):
ret = subprocess.call(["wget", "http://cloud-images-archive.ubuntu.com/releases/wily/release-20160715/SHA1SUMS", "-r", "-O", wily_SHA256SUMS])
if ret:
print("ERROR: failed to download ubuntu wily image SHA256SUMS")
return
if ((not os.path.isfile(dib['cache_dir'] + '/wily-server-cloudimg-amd64-root.tar.gz')) or (not dib['offline'])):
# wget the tar file and SHASUM file and save to dib['cache_dir']
wily_image = "%s/wily-server-cloudimg-amd64-root.tar.gz" % dib['cache_dir']
ret = subprocess.call(["wget", "http://cloud-images-archive.ubuntu.com/releases/wily/release-20160715/ubuntu-15.10-server-cloudimg-amd64-root.tar.gz", "-r", "-O", wily_image])
if ret:
print("ERROR: failed to download ubuntu wily image")
return
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)