Add support to launch node for attaching volumes
We are using cinder block devices more and more. Update launch node so that it can attach a preexisting cinder volume against a new nova server on first boot. This will allow puppet or other config management to format and mount that block device into the VMs filesystem. Change-Id: Ic121cdc06dcbea0e38e8d0ff8946e999af3d727e
This commit is contained in:

committed by
Jeremy Stanley

parent
71111e603b
commit
f490260de7
@@ -52,8 +52,8 @@ def get_client():
|
|||||||
return client
|
return client
|
||||||
|
|
||||||
|
|
||||||
def bootstrap_server(
|
def bootstrap_server(server, admin_pass, key, cert, environment, name,
|
||||||
server, admin_pass, key, cert, environment, name, puppetmaster):
|
puppetmaster, volume):
|
||||||
ip = utils.get_public_ip(server)
|
ip = utils.get_public_ip(server)
|
||||||
if not ip:
|
if not ip:
|
||||||
raise Exception("Unable to find public ip of server")
|
raise Exception("Unable to find public ip of server")
|
||||||
@@ -88,6 +88,11 @@ def bootstrap_server(
|
|||||||
'make_swap.sh')
|
'make_swap.sh')
|
||||||
ssh_client.ssh('bash -x make_swap.sh')
|
ssh_client.ssh('bash -x make_swap.sh')
|
||||||
|
|
||||||
|
if volume:
|
||||||
|
ssh_client.scp(os.path.join(SCRIPT_DIR, '..', 'mount_volume.sh'),
|
||||||
|
'mount_volume.sh')
|
||||||
|
ssh_client.ssh('bash -x mount_volume.sh')
|
||||||
|
|
||||||
ssh_client.scp(os.path.join(SCRIPT_DIR, '..', 'install_puppet.sh'),
|
ssh_client.scp(os.path.join(SCRIPT_DIR, '..', 'install_puppet.sh'),
|
||||||
'install_puppet.sh')
|
'install_puppet.sh')
|
||||||
ssh_client.ssh('bash -x install_puppet.sh')
|
ssh_client.ssh('bash -x install_puppet.sh')
|
||||||
@@ -124,7 +129,7 @@ def bootstrap_server(
|
|||||||
|
|
||||||
|
|
||||||
def build_server(
|
def build_server(
|
||||||
client, name, image, flavor, cert, environment, puppetmaster):
|
client, name, image, flavor, cert, environment, puppetmaster, volume):
|
||||||
key = None
|
key = None
|
||||||
server = None
|
server = None
|
||||||
|
|
||||||
@@ -148,8 +153,14 @@ def build_server(
|
|||||||
try:
|
try:
|
||||||
admin_pass = server.adminPass
|
admin_pass = server.adminPass
|
||||||
server = utils.wait_for_resource(server)
|
server = utils.wait_for_resource(server)
|
||||||
|
if volume:
|
||||||
|
vobj = client.volumes.create_server_volume(
|
||||||
|
server.id, volume, None)
|
||||||
|
if not vobj:
|
||||||
|
raise Exception("Couldn't attach volume")
|
||||||
|
|
||||||
bootstrap_server(server, admin_pass, key, cert, environment, name,
|
bootstrap_server(server, admin_pass, key, cert, environment, name,
|
||||||
puppetmaster)
|
puppetmaster, volume)
|
||||||
print('UUID=%s\nIPV4=%s\nIPV6=%s\n' % (server.id,
|
print('UUID=%s\nIPV4=%s\nIPV6=%s\n' % (server.id,
|
||||||
server.accessIPv4,
|
server.accessIPv4,
|
||||||
server.accessIPv6))
|
server.accessIPv6))
|
||||||
@@ -181,6 +192,9 @@ def main():
|
|||||||
"hostname.example.com.pem)")
|
"hostname.example.com.pem)")
|
||||||
parser.add_argument("--server", dest="server", help="Puppetmaster to use.",
|
parser.add_argument("--server", dest="server", help="Puppetmaster to use.",
|
||||||
default="ci-puppetmaster.openstack.org")
|
default="ci-puppetmaster.openstack.org")
|
||||||
|
parser.add_argument("--volume", dest="volume",
|
||||||
|
help="UUID of volume to attach to the new server.",
|
||||||
|
default=None)
|
||||||
options = parser.parse_args()
|
options = parser.parse_args()
|
||||||
|
|
||||||
client = get_client()
|
client = get_client()
|
||||||
@@ -220,7 +234,7 @@ def main():
|
|||||||
print "Found image", image
|
print "Found image", image
|
||||||
|
|
||||||
build_server(client, options.name, image, flavor, cert,
|
build_server(client, options.name, image, flavor, cert,
|
||||||
options.environment, options.server)
|
options.environment, options.server, options.volume)
|
||||||
dns.print_dns(client, options.name)
|
dns.print_dns(client, options.name)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
36
mount_volume.sh
Normal file
36
mount_volume.sh
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014 Hewlett-Packard Development Company, L.P.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Sigh. nova volume-attach is not immediate, but there is no status to track
|
||||||
|
sleep 120
|
||||||
|
|
||||||
|
if [ -b /dev/vdc ]; then
|
||||||
|
DEV='/dev/vdc'
|
||||||
|
elif [ -b /dev/xvdb ]; then
|
||||||
|
DEV='/dev/xvdb'
|
||||||
|
else
|
||||||
|
echo "Could not mount volume"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if ! blkid | grep $DEV | grep ext4 ; then
|
||||||
|
mkfs.ext4 ${DEV}
|
||||||
|
fi
|
||||||
|
perl -nle "m,${DEV}, || print" -i /etc/fstab
|
||||||
|
if [ ! -d /srv ] ; then
|
||||||
|
mkdir -p /srv
|
||||||
|
fi
|
||||||
|
echo "${DEV} /srv ext4 errors=remount-ro,barrier=0 0 2" >> /etc/fstab
|
||||||
|
mount -a
|
Reference in New Issue
Block a user