1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
#!/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']
exit, out, err = cliapp.runcmd_unchecked(cmdline)
if exit != 0:
if err.startswith('The request you have made requires '
'authentication. (HTTP 401)'):
raise cliapp.AppException('Invalid OpenStack credentials.')
else:
raise cliapp.AppException(
'Failed to connect to OpenStack instance at %s: %s' %
(auth_url, err))
OpenStackCheckExtension().run()
|