#!/usr/bin/python # Copyright (C) 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. '''Preparatory checks for Morph 'openstack' write extension''' import cliapp import os import urlparse import morphlib.writeexts class OpenStackCheckExtension(morphlib.writeexts.WriteExtension): def process_args(self, args): if len(args) != 1: raise cliapp.AppException('Wrong number of command line args') self.require_btrfs_in_deployment_host_kernel() upgrade = self.get_environment_boolean('UPGRADE') if upgrade: raise cliapp.AppException( 'Use the `ssh-rsync` write extension to deploy upgrades to an ' 'existing remote system.') location = args[0] self.check_location(location) os_params = self.get_openstack_parameters() self.check_openstack_parameters(location, os_params) def get_openstack_parameters(self): '''Check the environment variables needed and returns all. The environment variables are described in the class documentation. ''' keys = ('OPENSTACK_USER', 'OPENSTACK_TENANT', 'OPENSTACK_IMAGENAME', 'OPENSTACK_PASSWORD') for key in keys: if key not in os.environ: raise cliapp.AppException(key + ' was not given') return (os.environ[key] for key in keys) def check_location(self, location): x = urlparse.urlparse(location) if x.scheme not in ['http', 'https']: raise cliapp.AppException('URL schema must be http or https in %s' \ % location) if (x.path != '/v2.0' and x.path != '/v2.0/'): raise cliapp.AppException('API version must be v2.0 in %s'\ % location) def check_openstack_parameters(self, auth_url, os_params): '''Check OpenStack credentials using glance image-list''' self.status(msg='Checking OpenStack credentials...') username, tenant_name, image_name, password = os_params cmdline = ['glance', '--os-username', username, '--os-tenant-name', tenant_name, '--os-password', password, '--os-auth-url', auth_url, 'image-list'] try: cliapp.runcmd(cmdline) except cliapp.AppException: raise cliapp.AppException('Wrong OpenStack credentals.') OpenStackCheckExtension().run()