aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Edwards <jeremyje@gmail.com>2015-09-03 00:25:06 -0700
committerJeremy Edwards <jeremyje@gmail.com>2015-09-03 00:25:06 -0700
commit616a5802c3ba161ce292061af684c9618586ddd3 (patch)
tree3ef24721597800e0f84ff40b6e62fe13b26234d5
parentc4f91336a15724300c670e142c8af707ce074bac (diff)
downloadcompute-archlinux-image-builder-616a5802c3ba161ce292061af684c9618586ddd3.tar.xz
Removed the staging phase because the script will only work on Arch Linux now. This will make it much simpler to maintain.
-rwxr-xr-xarch-staging.py282
1 files changed, 0 insertions, 282 deletions
diff --git a/arch-staging.py b/arch-staging.py
deleted file mode 100755
index fbbb7a2..0000000
--- a/arch-staging.py
+++ /dev/null
@@ -1,282 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-# Copyright 2014 Google Inc. All Rights Reserved.
-#
-# 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 argparse
-import os
-import logging
-import sys
-from datetime import date
-
-import utils
-
-COMPUTE_IMAGE_PACKAGES_GIT_URL = (
- 'https://github.com/GoogleCloudPlatform/compute-image-packages.git')
-IMAGE_FILE='disk.raw'
-SETUP_PACKAGES_ESSENTIAL = 'grep file'.split()
-SETUP_PACKAGES = ('pacman wget gcc make parted git setconf libaio sudo '
- 'fakeroot arch-install-scripts').split()
-IMAGE_PACKAGES = ('base tar wget '
- 'curl sudo mkinitcpio syslinux dhcp ethtool irqbalance '
- 'ntp psmisc openssh udev less bash-completion zip unzip '
- 'python2 python3').split()
-
-
-def main():
- args = ParseArgs()
- utils.SetupLogging(quiet=args.quiet, verbose=args.verbose)
- logging.info('Arch Linux Image Builder')
- logging.info('========================')
-
- workspace_dir = None
- image_file = None
- try:
- InstallPackagesForStagingEnvironment()
- image_path = CreateArchImage(args)
- image_name, image_filename, image_description = GetImageNameAndDescription(
- args.outfile)
- image_file = SaveImage(image_path, image_filename)
- if args.upload and image_file:
- UploadImage(image_file, args.upload, make_public=args.public)
- if args.register:
- AddImageToComputeEngineProject(
- image_name, args.upload, image_description)
- finally:
- if not args.nocleanup and workspace_dir:
- utils.DeleteDirectory(workspace_dir)
-
-
-def CreateArchImage(args):
- image_path = os.path.join(os.getcwd(), IMAGE_FILE)
- CreateBlankImage(image_path, size_gb=int(args.size_gb), fs_type=args.fs_type)
- mount_path = utils.CreateTempDirectory(base_dir='/')
- image_mapping = utils.ImageMapper(image_path, mount_path)
- try:
- image_mapping.Map()
- primary_mapping = image_mapping.GetFirstMapping()
- image_mapping_path = primary_mapping['path']
- FormatImage(image_mapping_path)
- try:
- image_mapping.Mount()
- utils.CreateDirectory('/run/shm')
- utils.CreateDirectory(os.path.join(mount_path, 'run', 'shm'))
- InstallArchLinux(mount_path)
- disk_uuid = SetupFileSystem(mount_path, image_mapping_path, args.fs_type)
- ConfigureArchInstall(
- args, mount_path, primary_mapping['parent'], disk_uuid)
- utils.DeleteDirectory(os.path.join(mount_path, 'run', 'shm'))
- PurgeDisk(mount_path)
- finally:
- image_mapping.Unmount()
- ShrinkDisk(image_mapping_path)
- finally:
- image_mapping.Unmap()
- utils.Run(['parted', image_path, 'set', '1', 'boot', 'on'])
- utils.Sync()
- return image_path
-
-
-def ConfigureArchInstall(args, mount_path, parent_path, disk_uuid):
- relative_builder_path = utils.CopyBuilder(mount_path)
- utils.LogStep('Download compute-image-packages')
- packages_dir = utils.CreateTempDirectory(mount_path)
- utils.Run(['git', 'clone', COMPUTE_IMAGE_PACKAGES_GIT_URL, packages_dir])
- utils.CreateDirectory(os.path.join(mount_path, ''))
- packages_dir = os.path.relpath(packages_dir, mount_path)
- params = {
- 'packages_dir': '/%s' % packages_dir,
- 'device': parent_path,
- 'disk_uuid': disk_uuid,
- 'accounts': args.accounts,
- 'debugmode': args.debug,
- 'quiet': args.quiet,
- 'verbose': args.verbose,
- 'packages': args.packages,
- 'size_gb': args.size_gb
- }
- config_arch_py = os.path.join(
- '/', relative_builder_path, 'arch-image.py')
- utils.RunChroot(mount_path,
- '%s "%s"' % (config_arch_py, utils.EncodeArgs(params)),
- use_custom_path=False)
- utils.DeleteDirectory(os.path.join(mount_path, relative_builder_path))
-
-
-def InstallPackagesForStagingEnvironment():
- utils.InstallPackages(SETUP_PACKAGES_ESSENTIAL)
- utils.InstallPackages(SETUP_PACKAGES)
- utils.RemoveBuildUser()
- utils.AurInstall(name='multipath-tools-git')
- utils.AurInstall(name='zerofree')
-
-
-def CreateBlankImage(image_path, size_gb=10, fs_type='ext4'):
- utils.LogStep('Create Image')
- utils.Run(['rm', '-f', image_path])
- utils.Run(['truncate', image_path, '--size=%sG' % size_gb])
- utils.Run(['parted', image_path, 'mklabel', 'msdos'])
- utils.Run(['parted', image_path, 'mkpart', 'primary',
- fs_type, '1', str(int(size_gb) * 1024)])
-
-
-def FormatImage(image_mapping_path):
- utils.LogStep('Format Image')
- utils.Run(['mkfs', image_mapping_path])
- utils.Sync()
-
-
-def InstallArchLinux(base_dir):
- utils.LogStep('Install Arch Linux')
- utils.Pacstrap(base_dir, IMAGE_PACKAGES)
-
-
-def SetupFileSystem(base_dir, image_mapping_path, fs_type):
- utils.LogStep('File Systems')
- _, fstab_contents, _ = utils.Run(['genfstab', '-p', base_dir],
- capture_output=True)
- utils.WriteFile(os.path.join(base_dir, 'etc', 'fstab'), fstab_contents)
- _, disk_uuid, _ = utils.Run(['blkid', '-s', 'UUID',
- '-o', 'value',
- image_mapping_path],
- capture_output=True)
- disk_uuid = disk_uuid.strip()
- utils.WriteFile(os.path.join(base_dir, 'etc', 'fstab'),
- 'UUID=%s / %s defaults 0 1' % (disk_uuid, fs_type))
- utils.Run(['tune2fs', '-i', '1', '-U', disk_uuid, image_mapping_path])
- return disk_uuid
-
-
-def PurgeDisk(mount_path):
- paths = ['/var/cache', '/var/log', '/var/lib/pacman/sync']
- for path in paths:
- utils.DeleteDirectory(os.path.join(mount_path, path))
-
-
-def ShrinkDisk(image_mapping_path):
- utils.LogStep('Shrink Disk')
- utils.Run(['zerofree', image_mapping_path])
-
-
-def SaveImage(arch_root, image_filename):
- utils.LogStep('Save Arch Linux Image in GCE format')
- source_image_raw = os.path.join(arch_root, 'disk.raw')
- image_raw = os.path.join(os.getcwd(), 'disk.raw')
- image_file = os.path.join(os.getcwd(), image_filename)
- utils.Run(['cp', '--sparse=always', source_image_raw, image_raw])
- utils.Run(['tar', '-Szcf', image_file, 'disk.raw'])
- return image_file
-
-
-def UploadImage(image_path, gs_path, make_public=False):
- utils.LogStep('Upload Image to Cloud Storage')
- utils.SecureDeleteFile('~/.gsutil/*.url')
- utils.Run(['gsutil', 'rm', gs_path])
- utils.Run(['gsutil', 'cp', image_path, gs_path])
- if make_public:
- utils.Run(['gsutil', 'acl', 'set', 'public-read', gs_path])
-
-
-def AddImageToComputeEngineProject(image_name, gs_path, description):
- utils.LogStep('Add image to project')
- utils.Run(['gcloud', 'compute', 'images', 'delete', image_name, '-q'])
- utils.Run(['gcloud', 'compute', 'images', 'create', image_name, '-q',
- '--source-uri', gs_path,
- '--description', description])
-
-
-def GetImageNameAndDescription(outfile_name):
- today = date.today()
- isodate = today.strftime("%Y-%m-%d")
- yyyymmdd = today.strftime("%Y%m%d")
- image_name = 'arch-v%s' % yyyymmdd
- if outfile_name:
- image_filename = outfile_name
- else:
- image_filename = '%s.tar.gz' % image_name
- description = 'Arch Linux x86-64 built on %s' % isodate
- return image_name, image_filename, description
-
-
-def ParseArgs():
- parser = argparse.ArgumentParser(
- description='Arch Linux Image Builder for Compute Engine')
- parser.add_argument('-p', '--packages',
- dest='packages',
- nargs='+',
- help='Additional packages to install via Pacman.')
- parser.add_argument('-v', '--verbose',
- dest='verbose',
- default=False,
- help='Verbose console output.',
- action='store_true')
- parser.add_argument('-q', '--quiet',
- dest='quiet',
- default=False,
- help='Suppress all console output.',
- action='store_true')
- parser.add_argument('--upload',
- dest='upload',
- default=None,
- help='Google Cloud Storage path to upload to.')
- parser.add_argument('--size_gb',
- dest='size_gb',
- default=10,
- help='Volume size of image (in GiB).')
- parser.add_argument('--accounts',
- dest='accounts',
- nargs='+',
- help='Space delimited list of user accounts to create on '
- 'the image. Format: username:password')
- parser.add_argument('--nocleanup',
- dest='nocleanup',
- default=False,
- help='Prevent cleaning up the image build workspace '
- 'after image has been created.',
- action='store_true')
- parser.add_argument('--outfile',
- dest='outfile',
- default=None,
- help='Name of the output image file.')
- parser.add_argument('--debug',
- dest='debug',
- default=False,
- help='Configure the image for debugging.',
- action='store_true')
- parser.add_argument('--public',
- dest='public',
- default=False,
- help='Make image file uploaded to Cloud Storage '
- 'available for everyone.',
- action='store_true')
- parser.add_argument('--register',
- dest='register',
- default=False,
- help='Add the image to Compute Engine project. '
- '(Upload to Cloud Storage required.)',
- action='store_true')
- parser.add_argument('--nopacmankeys',
- dest='nopacmankeys',
- default=False,
- help='Disables signature checking for pacman packages.',
- action='store_true')
- parser.add_argument('--fs_type',
- dest='fs_type',
- default='ext4',
- help='Verbose console output.',
- action='store_true')
- return parser.parse_args()
-
-main()