summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Doffman <mark.doffman@codethink.co.uk>2015-04-14 20:23:30 (GMT)
committerMark Doffman <mark.doffman@codethink.co.uk>2015-04-17 16:55:47 (GMT)
commitce7ea2923f1dc8c8fbd5600f14e356ffed99072b (patch)
treea57acda310648685cbf4c7c4aa9d21bea974c754
parent2c013960069f9080589f2e61bd616a437e7a5264 (diff)
downloaddefinitions-baserock/markdoffman/google-compute-engine.tar.gz
Add strata, systems and cluster morpologies for google compute engine.baserock/markdoffman/google-compute-engine
Add the ability to create baserock images compatible with google compute engine. Add an example cluster morphology that does this.
-rw-r--r--clusters/google-compute-engine.morph14
-rw-r--r--google-compute-engine.configure29
-rwxr-xr-xgoogle-compute-engine.write64
-rw-r--r--google-compute-engine/etc/skel/.bash_logout7
-rw-r--r--google-compute-engine/etc/skel/.bashrc117
-rw-r--r--google-compute-engine/etc/skel/.profile22
-rw-r--r--google-compute-engine/manifest5
-rw-r--r--google-compute-engine/usr/lib/systemd/system/setmtu@.service10
-rw-r--r--strata/google-compute-engine.morph16
-rw-r--r--strata/google-compute-engine/google-daemon.morph5
-rw-r--r--strata/google-compute-engine/google-startup-scripts.morph5
-rw-r--r--systems/devel-system-x86_64-gce.morph62
12 files changed, 356 insertions, 0 deletions
diff --git a/clusters/google-compute-engine.morph b/clusters/google-compute-engine.morph
new file mode 100644
index 0000000..2b702db
--- /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 0000000..95af1bc
--- /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 0000000..a322641
--- /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 <http://www.gnu.org/licenses/>.
+
+
+'''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 0000000..de4f5f7
--- /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 0000000..679dbba
--- /dev/null
+++ b/google-compute-engine/etc/skel/.bashrc
@@ -0,0 +1,117 @@
+# ~/.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
+
+# If set, the pattern "**" used in a pathname expansion context will
+# match all files and zero or more directories and subdirectories.
+#shopt -s globstar
+
+# make less more friendly for non-text input files, see lesspipe(1)
+[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
+
+# set variable identifying the chroot you work in (used in the prompt below)
+if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
+ debian_chroot=$(cat /etc/debian_chroot)
+fi
+
+# set a fancy prompt (non-color, unless we know we "want" color)
+case "$TERM" in
+ xterm-color) color_prompt=yes;;
+esac
+
+# uncomment for a colored prompt, if the terminal has the capability; turned
+# off by default to not distract the user: the focus in a terminal window
+# should be on the output of commands, not on the prompt
+#force_color_prompt=yes
+
+if [ -n "$force_color_prompt" ]; then
+ if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
+ # We have color support; assume it's compliant with Ecma-48
+ # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
+ # a case would tend to support setf rather than setaf.)
+ color_prompt=yes
+ else
+ color_prompt=
+ fi
+fi
+
+if [ "$color_prompt" = yes ]; then
+ PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+else
+ PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+fi
+unset color_prompt force_color_prompt
+
+# If this is an xterm set the title to user@host:dir
+case "$TERM" in
+xterm*|rxvt*)
+ PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
+ ;;
+*)
+ ;;
+esac
+
+# enable color support of ls and also add handy aliases
+if [ -x /usr/bin/dircolors ]; then
+ test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
+ alias ls='ls --color=auto'
+ #alias dir='dir --color=auto'
+ #alias vdir='vdir --color=auto'
+
+ alias grep='grep --color=auto'
+ alias fgrep='fgrep --color=auto'
+ alias egrep='egrep --color=auto'
+fi
+
+# colored GCC warnings and errors
+#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
+
+# some more ls aliases
+alias ll='ls -alF'
+alias la='ls -A'
+alias l='ls -CF'
+
+# Add an "alert" alias for long running commands. Use like so:
+# sleep 10; alert
+alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
+
+# Alias definitions.
+# You may want to put all your additions into a separate file like
+# ~/.bash_aliases, instead of adding them here directly.
+# See /usr/share/doc/bash-doc/examples in the bash-doc package.
+
+if [ -f ~/.bash_aliases ]; then
+ . ~/.bash_aliases
+fi
+
+# enable programmable completion features (you don't need to enable
+# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
+# sources /etc/bash.bashrc).
+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 0000000..c9db459
--- /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 0000000..f806ecb
--- /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 0000000..0425025
--- /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 0000000..f0d11c1
--- /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 0000000..eee3ea0
--- /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 0000000..29cd832
--- /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 0000000..db7a70e
--- /dev/null
+++ b/systems/devel-system-x86_64-gce.morph
@@ -0,0 +1,62 @@
+name: devel-system-x86_64-generic
+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
+- google-compute-engine