From ba8e2119c6fc5e4d9023fae558b6ec93a749af3d Mon Sep 17 00:00:00 2001 From: Mark Doffman Date: Tue, 14 Apr 2015 20:23:30 +0000 Subject: Add strata, systems and cluster morpologies for google compute engine. Add the ability to create baserock images compatible with google compute engine. Add an example cluster morphology that does this. Change-Id: I3ecaef8c760fe2c539969d2f86fc704b3232e5bb --- clusters/google-compute-engine.morph | 14 +++++ google-compute-engine.configure | 29 ++++++++++ google-compute-engine.write | 64 ++++++++++++++++++++++ google-compute-engine/etc/skel/.bash_logout | 7 +++ google-compute-engine/etc/skel/.bashrc | 41 ++++++++++++++ google-compute-engine/etc/skel/.profile | 22 ++++++++ google-compute-engine/manifest | 5 ++ .../usr/lib/systemd/system/setmtu@.service | 10 ++++ strata/google-compute-engine.morph | 16 ++++++ strata/google-compute-engine/google-daemon.morph | 5 ++ .../google-startup-scripts.morph | 5 ++ systems/devel-system-x86_64-gce.morph | 63 +++++++++++++++++++++ 12 files changed, 281 insertions(+) create mode 100644 clusters/google-compute-engine.morph create mode 100644 google-compute-engine.configure create mode 100755 google-compute-engine.write create mode 100644 google-compute-engine/etc/skel/.bash_logout create mode 100644 google-compute-engine/etc/skel/.bashrc create mode 100644 google-compute-engine/etc/skel/.profile create mode 100644 google-compute-engine/manifest create mode 100644 google-compute-engine/usr/lib/systemd/system/setmtu@.service create mode 100644 strata/google-compute-engine.morph create mode 100644 strata/google-compute-engine/google-daemon.morph create mode 100644 strata/google-compute-engine/google-startup-scripts.morph create mode 100644 systems/devel-system-x86_64-gce.morph diff --git a/clusters/google-compute-engine.morph b/clusters/google-compute-engine.morph new file mode 100644 index 00000000..2b702dbf --- /dev/null +++ b/clusters/google-compute-engine.morph @@ -0,0 +1,14 @@ +name: release +kind: cluster +description: | + Deploy a GCE system + +systems: +- morph: systems/devel-system-x86_64-gce.morph + deploy: + devel-system-x86_64-gce: + type: google-compute-engine + location: devel-system-x86_64-gce.tar.gz + DISK_SIZE: 4G + INSTALL_FILES: google-compute-engine/manifest + KERNEL_ARGS: console=tty0 console=ttyS0 diff --git a/google-compute-engine.configure b/google-compute-engine.configure new file mode 100644 index 00000000..95af1bcf --- /dev/null +++ b/google-compute-engine.configure @@ -0,0 +1,29 @@ +#!/bin/sh +# Copyright (C) 2013-2014 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +set -e + +ROOT="$1" + +ln -s ../../../../usr/lib/systemd/system/google-accounts-manager.service "$ROOT"/etc/systemd/system/multi-user.target.wants/google-accounts-manager.service +ln -s ../../../../usr/lib/systemd/system/google-address-manager.service "$ROOT"/etc/systemd/system/multi-user.target.wants/google-address-manager.service +ln -s ../../../../usr/lib/systemd/system/google-startup-scripts.service "$ROOT"/etc/systemd/system/multi-user.target.wants/google-startup-scripts.service +ln -s ../../../../usr/lib/systemd/system/google.service "$ROOT"/etc/systemd/system/multi-user.target.wants/google.service +# Needed as Google's network really doesn't like a 1500 MTU, makes ssh impossible. +ln -s ../../../../usr/lib/systemd/system/setmtu@.service "$ROOT"/etc/systemd/system/multi-user.target.wants/setmtu@eth0.service + +# Server on public ip probably shouldn't have passwordless root, user accounts and ssh login handled by google-daemon. +sed -i "1s/.*/root\:!!\:\:\:\:\:\:\:/" "$ROOT"/etc/shadow diff --git a/google-compute-engine.write b/google-compute-engine.write new file mode 100755 index 00000000..a3226416 --- /dev/null +++ b/google-compute-engine.write @@ -0,0 +1,64 @@ +#!/usr/bin/python +# Copyright (C) 2012-2015 Codethink Limited +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; version 2 of the License. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . + + +'''A Morph deployment write extension for compressed raw disk images + that are compatible with google compute engine.''' + + +import cliapp +import os +import sys +import time +import tempfile +import shutil + +import morphlib.writeexts + +from subprocess import call + +class GoogleComputeEngineWriteExtension(morphlib.writeexts.WriteExtension): + + def process_args(self, args): + if len(args) != 2: + raise cliapp.AppException('Wrong number of command line args') + + DISK_NAME = 'disk.raw' + + temp_root, location = args + + try: + temp_dir = tempfile.mkdtemp() + disk_location = os.path.join(temp_dir, DISK_NAME) + + with self.created_disk_image(disk_location): + self.format_btrfs(disk_location) + self.create_system(temp_root, disk_location) + + self.status(msg='Compressing disk image') + call(["tar", '-czf', location, '-C', temp_dir, DISK_NAME]) + + self.status(msg='Compressed disk image has been created at %s' % location) + except Exception: + self.status(msg='Failure to deploy system to %s' % location) + raise + finally: + try: + shutil.rmtree(temp_dir) + except OSError as exc: + if exc.errno != errno.ENOENT: + raise + +GoogleComputeEngineWriteExtension().run() diff --git a/google-compute-engine/etc/skel/.bash_logout b/google-compute-engine/etc/skel/.bash_logout new file mode 100644 index 00000000..de4f5f75 --- /dev/null +++ b/google-compute-engine/etc/skel/.bash_logout @@ -0,0 +1,7 @@ +# ~/.bash_logout: executed by bash(1) when login shell exits. + +# when leaving the console clear the screen to increase privacy + +if [ "$SHLVL" = 1 ]; then + [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q +fi diff --git a/google-compute-engine/etc/skel/.bashrc b/google-compute-engine/etc/skel/.bashrc new file mode 100644 index 00000000..4ab3831b --- /dev/null +++ b/google-compute-engine/etc/skel/.bashrc @@ -0,0 +1,41 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +case $- in + *i*) ;; + *) return;; +esac + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +PS1='\u@\h:\w\$ ' + +# Alias definitions. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# Completion +if ! shopt -oq posix; then + if [ -f /usr/share/bash-completion/bash_completion ]; then + . /usr/share/bash-completion/bash_completion + elif [ -f /etc/bash_completion ]; then + . /etc/bash_completion + fi +fi diff --git a/google-compute-engine/etc/skel/.profile b/google-compute-engine/etc/skel/.profile new file mode 100644 index 00000000..c9db4591 --- /dev/null +++ b/google-compute-engine/etc/skel/.profile @@ -0,0 +1,22 @@ +# ~/.profile: executed by the command interpreter for login shells. +# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login +# exists. +# see /usr/share/doc/bash/examples/startup-files for examples. +# the files are located in the bash-doc package. + +# the default umask is set in /etc/profile; for setting the umask +# for ssh logins, install and configure the libpam-umask package. +#umask 022 + +# if running bash +if [ -n "$BASH_VERSION" ]; then + # include .bashrc if it exists + if [ -f "$HOME/.bashrc" ]; then + . "$HOME/.bashrc" + fi +fi + +# set PATH so it includes user's private bin if it exists +if [ -d "$HOME/bin" ] ; then + PATH="$HOME/bin:$PATH" +fi diff --git a/google-compute-engine/manifest b/google-compute-engine/manifest new file mode 100644 index 00000000..f806ecb5 --- /dev/null +++ b/google-compute-engine/manifest @@ -0,0 +1,5 @@ +0040755 0 0 /etc/skel +0100644 0 0 /etc/skel/.bashrc +0100644 0 0 /etc/skel/.bash_logout +0100644 0 0 /etc/skel/.profile +0100644 0 0 /usr/lib/systemd/system/setmtu@.service diff --git a/google-compute-engine/usr/lib/systemd/system/setmtu@.service b/google-compute-engine/usr/lib/systemd/system/setmtu@.service new file mode 100644 index 00000000..0425025d --- /dev/null +++ b/google-compute-engine/usr/lib/systemd/system/setmtu@.service @@ -0,0 +1,10 @@ +[Unit] +Description=Set mtu on device +Before=network.target + +[Service] +Type=oneshot +ExecStart=/sbin/ip link set dev %i mtu 1460 + +[Install] +WantedBy=multi-user.target diff --git a/strata/google-compute-engine.morph b/strata/google-compute-engine.morph new file mode 100644 index 00000000..f0d11c16 --- /dev/null +++ b/strata/google-compute-engine.morph @@ -0,0 +1,16 @@ +name: google-compute-engine +kind: stratum +description: Packages to be installed on GCE images. +build-depends: +- morph: strata/core.morph +chunks: +- name: google-daemon + morph: strata/google-compute-engine/google-daemon.morph + repo: upstream:google-compute-image-packages + ref: 015c1c103b68a599d437a64f1d745e2b99e8c750 + unpetrify-ref: master +- name: google-startup-scripts + morph: strata/google-compute-engine/google-startup-scripts.morph + repo: upstream:google-compute-image-packages + ref: 015c1c103b68a599d437a64f1d745e2b99e8c750 + unpetrify-ref: master diff --git a/strata/google-compute-engine/google-daemon.morph b/strata/google-compute-engine/google-daemon.morph new file mode 100644 index 00000000..eee3ea03 --- /dev/null +++ b/strata/google-compute-engine/google-daemon.morph @@ -0,0 +1,5 @@ +name: google-daemon +kind: chunk +install-commands: +- cp -r google-daemon/* $DESTDIR +- rm $DESTDIR/README.md diff --git a/strata/google-compute-engine/google-startup-scripts.morph b/strata/google-compute-engine/google-startup-scripts.morph new file mode 100644 index 00000000..29cd8328 --- /dev/null +++ b/strata/google-compute-engine/google-startup-scripts.morph @@ -0,0 +1,5 @@ +name: google-startup-scripts +kind: chunk +install-commands: +- cp -r google-startup-scripts/* $DESTDIR +- rm $DESTDIR/README.md diff --git a/systems/devel-system-x86_64-gce.morph b/systems/devel-system-x86_64-gce.morph new file mode 100644 index 00000000..2b5503d5 --- /dev/null +++ b/systems/devel-system-x86_64-gce.morph @@ -0,0 +1,63 @@ +name: devel-system-x86_64-gce +kind: system +description: | + A system with useful tools for doing Baserock development. + + For use on 64-bit Intel x86 computers. +arch: x86_64 +strata: +- name: build-essential + morph: strata/build-essential.morph +- name: core + morph: strata/core.morph +- name: foundation + morph: strata/foundation.morph +- name: bsp-x86_64-generic + morph: strata/bsp-x86_64-generic.morph +- name: tools + morph: strata/tools.morph +- name: python-cliapp + morph: strata/python-cliapp.morph +- name: python-wsgi + morph: strata/python-wsgi.morph +- name: morph-utils + morph: strata/morph-utils.morph +- name: openstack-common + morph: strata/openstack-common.morph +- name: openstack-clients + morph: strata/openstack-clients.morph +- name: cloudinit-support + morph: strata/cloudinit-support.morph +- name: nodejs + morph: strata/nodejs.morph +- name: ruby + morph: strata/ruby.morph +- name: lorry + morph: strata/lorry.morph +- name: baserock-import + morph: strata/baserock-import.morph +- name: nfs + morph: strata/nfs.morph +- name: python-core + morph: strata/python-core.morph +- name: python-tools + morph: strata/python-tools.morph +- name: python-common + morph: strata/python-common.morph +- name: devtools + morph: strata/devtools.morph +- name: ansible + morph: strata/ansible.morph +- name: swift + morph: strata/swift.morph +- name: google-compute-engine + morph: strata/google-compute-engine.morph +configuration-extensions: +- set-hostname +- add-config-files +- simple-network +- nfsboot +- install-files +- cloud-init +- fstab +- google-compute-engine -- cgit v1.2.1