From c1ecc8e874d9b47a0b9c61306919a3361b1fb4d2 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Thu, 22 May 2014 15:34:09 +0100 Subject: [PATCH] add(coreos-base/oem-cloudstack): CloudStack support Provide initial support for CloudStack. --- .../oem-cloudstack/files/cloud-config.yml | 33 +++++++++++++++++++ .../files/cloudstack-coreos-cloudinit | 9 +++++ .../oem-cloudstack/files/cloudstack-dhcp | 23 +++++++++++++ .../oem-cloudstack/files/cloudstack-ssh-key | 9 +++++ .../files/coreos-setup-environment | 32 ++++++++++++++++++ .../oem-cloudstack-0.0.1-r1.ebuild | 1 + .../oem-cloudstack-0.0.1.ebuild | 31 +++++++++++++++++ 7 files changed, 138 insertions(+) create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloud-config.yml create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-coreos-cloudinit create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-dhcp create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-ssh-key create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/coreos-setup-environment create mode 120000 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1-r1.ebuild create mode 100644 sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1.ebuild diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloud-config.yml b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloud-config.yml new file mode 100644 index 0000000000..5f3a3c17f1 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloud-config.yml @@ -0,0 +1,33 @@ +#cloud-config + +coreos: + units: + - name: cloudstack-ssh-key.service + command: restart + runtime: yes + content: | + [Unit] + Description=Sets SSH key from metadata + + [Service] + Type=oneshot + StandardOutput=journal+console + ExecStart=/usr/share/oem/bin/cloudstack-ssh-key + - name: cloudstack-cloudinit.service + command: restart + runtime: yes + content: | + [Unit] + Description=Cloudinit from CloudStack-style metadata + Requires=coreos-setup-environment.service + After=coreos-setup-environment.service + + [Service] + Type=oneshot + EnvironmentFile=/etc/environment + ExecStart=/usr/share/oem/bin/cloudstack-coreos-cloudinit + oem: + id: cloudstack + name: CloudStack + home-url: http://cloudstack.apache.org/ + bug-report-url: https://github.com/coreos/coreos-overlay diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-coreos-cloudinit b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-coreos-cloudinit new file mode 100644 index 0000000000..67f178c01a --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-coreos-cloudinit @@ -0,0 +1,9 @@ +#!/bin/bash + +. /usr/share/oem/bin/cloudstack-dhcp + +DHCP_SERVER=$(get_dhcp_ip) +USERDATA_URL="http://${DHCP_SERVER}/latest/user-data" + +block-until-url "${USERDATA_URL}" +coreos-cloudinit --from-url="${USERDATA_URL}" diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-dhcp b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-dhcp new file mode 100644 index 0000000000..b6bcee3c62 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-dhcp @@ -0,0 +1,23 @@ +#!/bin/bash + +get_dhcp_ip() { + local leases_dir="/run/systemd/network/leases" + while true; do + if [[ "$(find "${leases_dir}" -type f -size +1c)" ]]; then + break + fi + sleep .5 + done + + for leasefile in "${leases_dir}/"*; do + dhcp_server_ip=$(cat $leasefile | awk -F= '/SERVER_ADDRESS/ { print $2 }') + if [[ -n "${dhcp_server_ip}" ]]; then + metadata_url="http://${dhcp_server_ip}/latest/meta-data/" + curl --fail -s "${metadata_url}" >/dev/null + if [[ $? -eq 0 ]]; then + echo $dhcp_server_ip + break + fi + fi + done +} diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-ssh-key b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-ssh-key new file mode 100644 index 0000000000..5dfdaebb0e --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/cloudstack-ssh-key @@ -0,0 +1,9 @@ +#!/bin/bash + +. /usr/share/oem/bin/cloudstack-dhcp + +DHCP_SERVER=$(get_dhcp_ip) +KEY_URL="http://${DHCP_SERVER}/latest/meta-data/public-keys" + +block-until-url "${KEY_URL}" +curl --fail -s "${KEY_URL}" | update-ssh-keys -a cloudstack diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/coreos-setup-environment b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/coreos-setup-environment new file mode 100644 index 0000000000..70540418ca --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/files/coreos-setup-environment @@ -0,0 +1,32 @@ +#!/bin/bash + +ENV=$1 + +if [[ -z "$ENV" ]]; then + echo "usage: $0 /etc/environment" >&2 + exit 1 +fi + +# Make sure that the file is writable +touch $ENV +if [[ $? -ne 0 ]]; then + echo "$0: unable to modify ${ENV}" >&2 + exit 1 +fi + +sed -i -e '/^COREOS_PUBLIC_IPV4=/d' \ + -e '/^COREOS_PRIVATE_IPV4=/d' \ + "${ENV}" + +. /usr/share/oem/bin/cloudstack-dhcp + +DHCP_SERVER=$(get_dhcp_ip) +METADATA_URL="http://${DHCP_SERVER}/latest/meta-data/" + +block-until-url "${METADATA_URL}" + +PUBLIC_IP=$(curl --fail -s "${METADATA_URL}public-ipv4") +echo COREOS_PUBLIC_IPV4=${PUBLIC_IP} >> $ENV + +PRIVATE_IP=$(curl --fail -s "${METADATA_URL}local-ipv4") +echo COREOS_PRIVATE_IPV4=${PRIVATE_IP} >> $ENV diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1-r1.ebuild b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1-r1.ebuild new file mode 120000 index 0000000000..9492e515ee --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1-r1.ebuild @@ -0,0 +1 @@ +oem-cloudstack-0.0.1.ebuild \ No newline at end of file diff --git a/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1.ebuild b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1.ebuild new file mode 100644 index 0000000000..5797613c03 --- /dev/null +++ b/sdk_container/src/third_party/coreos-overlay/coreos-base/oem-cloudstack/oem-cloudstack-0.0.1.ebuild @@ -0,0 +1,31 @@ +# +# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. +# Copyright (c) 2014 CoreOS, Inc.. All rights reserved. +# Distributed under the terms of the GNU General Public License v2 +# $Header:$ +# + +EAPI=5 + +DESCRIPTION="OEM suite for CloudStack images" +HOMEPAGE="" +SRC_URI="" + +LICENSE="Apache-2.0" +SLOT="0" +KEYWORDS="amd64 x86" +IUSE="" + +# no source directory +S="${WORKDIR}" + +src_install() { + into "/usr/share/oem" + dobin ${FILESDIR}/cloudstack-dhcp + dobin ${FILESDIR}/cloudstack-ssh-key + dobin ${FILESDIR}/cloudstack-coreos-cloudinit + dobin ${FILESDIR}/coreos-setup-environment + + insinto "/usr/share/oem" + doins ${FILESDIR}/cloud-config.yml +}