~freyes/charms/trusty/nova-cloud-controller/lp1387073backport

« back to all changes in this revision

Viewing changes to hooks/nova_cc_utils.py

  • Committer: james.page at ubuntu
  • Date: 2015-04-20 08:39:44 UTC
  • mfrom: (150.2.7 nova-cloud-controller)
  • Revision ID: james.page@ubuntu.com-20150420083944-x5vi75f5wrgapqc1
[coreycb,r=james-page] Add deploy from source support

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
import os
 
2
import shutil
2
3
import subprocess
3
4
import ConfigParser
4
5
 
19
20
    get_host_ip,
20
21
    get_hostname,
21
22
    get_os_codename_install_source,
 
23
    git_install_requested,
 
24
    git_clone_and_install,
 
25
    git_src_dir,
22
26
    is_ip,
23
27
    os_release,
24
28
    save_script_rc as _save_script_rc)
31
35
)
32
36
 
33
37
from charmhelpers.core.hookenv import (
 
38
    charm_dir,
34
39
    config,
35
40
    log,
36
41
    relation_get,
42
47
)
43
48
 
44
49
from charmhelpers.core.host import (
 
50
    adduser,
 
51
    add_group,
 
52
    add_user_to_group,
 
53
    mkdir,
45
54
    service,
46
55
    service_start,
47
56
    service_stop,
48
57
    service_running,
49
 
    lsb_release
 
58
    lsb_release,
50
59
)
51
60
 
 
61
from charmhelpers.core.templating import render
 
62
 
52
63
from charmhelpers.contrib.network.ip import (
53
64
    is_ipv6
54
65
)
72
83
    'python-memcache',
73
84
]
74
85
 
 
86
BASE_GIT_PACKAGES = [
 
87
    'libxml2-dev',
 
88
    'libxslt1-dev',
 
89
    'python-dev',
 
90
    'python-pip',
 
91
    'python-setuptools',
 
92
    'zlib1g-dev',
 
93
]
 
94
 
 
95
LATE_GIT_PACKAGES = [
 
96
    'novnc',
 
97
    'spice-html5',
 
98
    'websockify',
 
99
]
 
100
 
 
101
# ubuntu packages that should not be installed when deploying from git
 
102
GIT_PACKAGE_BLACKLIST = [
 
103
    'neutron-server',
 
104
    'neutron-plugin-ml2',
 
105
    'nova-api-ec2',
 
106
    'nova-api-os-compute',
 
107
    'nova-api-os-volume',
 
108
    'nova-cert',
 
109
    'nova-conductor',
 
110
    'nova-consoleauth',
 
111
    'nova-novncproxy',
 
112
    'nova-objectstore',
 
113
    'nova-scheduler',
 
114
    'nova-spiceproxy',
 
115
    'nova-xvpvncproxy',
 
116
    'python-keystoneclient',
 
117
    'python-six',
 
118
    'quantum-server',
 
119
]
 
120
 
75
121
BASE_SERVICES = [
76
122
    'nova-api-ec2',
77
123
    'nova-api-os-compute',
377
423
        packages.extend(pkgs)
378
424
    if console_attributes('packages'):
379
425
        packages.extend(console_attributes('packages'))
 
426
 
 
427
    if git_install_requested():
 
428
        packages = list(set(packages))
 
429
        packages.extend(BASE_GIT_PACKAGES)
 
430
        # don't include packages that will be installed from git
 
431
        for p in GIT_PACKAGE_BLACKLIST:
 
432
            if p in packages:
 
433
                packages.remove(p)
 
434
 
380
435
    return list(set(packages))
381
436
 
382
437
 
974
1029
                   ' main')
975
1030
        apt_update()
976
1031
        apt_install('haproxy/trusty-backports', fatal=True)
 
1032
 
 
1033
 
 
1034
def git_install(projects_yaml):
 
1035
    """Perform setup, and install git repos specified in yaml parameter."""
 
1036
    if git_install_requested():
 
1037
        git_pre_install()
 
1038
        git_clone_and_install(projects_yaml, core_project='nova')
 
1039
        git_post_install(projects_yaml)
 
1040
 
 
1041
 
 
1042
def git_pre_install():
 
1043
    """Perform pre-install setup."""
 
1044
    dirs = [
 
1045
        '/var/lib/nova',
 
1046
        '/var/lib/nova/buckets',
 
1047
        '/var/lib/nova/CA',
 
1048
        '/var/lib/nova/CA/INTER',
 
1049
        '/var/lib/nova/CA/newcerts',
 
1050
        '/var/lib/nova/CA/private',
 
1051
        '/var/lib/nova/CA/reqs',
 
1052
        '/var/lib/nova/images',
 
1053
        '/var/lib/nova/instances',
 
1054
        '/var/lib/nova/keys',
 
1055
        '/var/lib/nova/networks',
 
1056
        '/var/lib/nova/tmp',
 
1057
        '/var/lib/neutron',
 
1058
        '/var/lib/neutron/lock',
 
1059
        '/var/log/nova',
 
1060
        '/etc/neutron',
 
1061
        '/etc/neutron/plugins',
 
1062
        '/etc/neutron/plugins/ml2',
 
1063
    ]
 
1064
 
 
1065
    adduser('nova', shell='/bin/bash', system_user=True)
 
1066
    subprocess.check_call(['usermod', '--home', '/var/lib/nova', 'nova'])
 
1067
    add_group('nova', system_group=True)
 
1068
    add_user_to_group('nova', 'nova')
 
1069
 
 
1070
    adduser('neutron', shell='/bin/bash', system_user=True)
 
1071
    add_group('neutron', system_group=True)
 
1072
    add_user_to_group('neutron', 'neutron')
 
1073
 
 
1074
    for d in dirs:
 
1075
        mkdir(d, owner='nova', group='nova', perms=0755, force=False)
 
1076
 
 
1077
 
 
1078
def git_post_install(projects_yaml):
 
1079
    """Perform post-install setup."""
 
1080
    src_etc = os.path.join(git_src_dir(projects_yaml, 'nova'), 'etc/nova')
 
1081
    configs = [
 
1082
        {'src': src_etc,
 
1083
         'dest': '/etc/nova'},
 
1084
    ]
 
1085
 
 
1086
    for c in configs:
 
1087
        if os.path.exists(c['dest']):
 
1088
            shutil.rmtree(c['dest'])
 
1089
        shutil.copytree(c['src'], c['dest'])
 
1090
 
 
1091
    render('git/nova_sudoers', '/etc/sudoers.d/nova_sudoers', {}, perms=0o440)
 
1092
 
 
1093
    nova_cc = 'nova-cloud-controller'
 
1094
    nova_user = 'nova'
 
1095
    start_dir = '/var/lib/nova'
 
1096
    nova_conf = '/etc/nova/nova.conf'
 
1097
    nova_ec2_api_context = {
 
1098
        'service_description': 'Nova EC2 API server',
 
1099
        'service_name': nova_cc,
 
1100
        'user_name': nova_user,
 
1101
        'start_dir': start_dir,
 
1102
        'process_name': 'nova-api-ec2',
 
1103
        'executable_name': '/usr/local/bin/nova-api-ec2',
 
1104
        'config_files': [nova_conf],
 
1105
    }
 
1106
    nova_api_os_compute_context = {
 
1107
        'service_description': 'Nova OpenStack Compute API server',
 
1108
        'service_name': nova_cc,
 
1109
        'user_name': nova_user,
 
1110
        'start_dir': start_dir,
 
1111
        'process_name': 'nova-api-os-compute',
 
1112
        'executable_name': '/usr/local/bin/nova-api-os-compute',
 
1113
        'config_files': [nova_conf],
 
1114
    }
 
1115
    nova_cells_context = {
 
1116
        'service_description': 'Nova cells',
 
1117
        'service_name': nova_cc,
 
1118
        'user_name': nova_user,
 
1119
        'start_dir': start_dir,
 
1120
        'process_name': 'nova-cells',
 
1121
        'executable_name': '/usr/local/bin/nova-cells',
 
1122
        'config_files': [nova_conf],
 
1123
    }
 
1124
    nova_cert_context = {
 
1125
        'service_description': 'Nova cert',
 
1126
        'service_name': nova_cc,
 
1127
        'user_name': nova_user,
 
1128
        'start_dir': start_dir,
 
1129
        'process_name': 'nova-cert',
 
1130
        'executable_name': '/usr/local/bin/nova-cert',
 
1131
        'config_files': [nova_conf],
 
1132
    }
 
1133
    nova_conductor_context = {
 
1134
        'service_description': 'Nova conductor',
 
1135
        'service_name': nova_cc,
 
1136
        'user_name': nova_user,
 
1137
        'start_dir': start_dir,
 
1138
        'process_name': 'nova-conductor',
 
1139
        'executable_name': '/usr/local/bin/nova-conductor',
 
1140
        'config_files': [nova_conf],
 
1141
    }
 
1142
    nova_consoleauth_context = {
 
1143
        'service_description': 'Nova console auth',
 
1144
        'service_name': nova_cc,
 
1145
        'user_name': nova_user,
 
1146
        'start_dir': start_dir,
 
1147
        'process_name': 'nova-consoleauth',
 
1148
        'executable_name': '/usr/local/bin/nova-consoleauth',
 
1149
        'config_files': [nova_conf],
 
1150
    }
 
1151
    nova_console_context = {
 
1152
        'service_description': 'Nova console',
 
1153
        'service_name': nova_cc,
 
1154
        'user_name': nova_user,
 
1155
        'start_dir': start_dir,
 
1156
        'process_name': 'nova-console',
 
1157
        'executable_name': '/usr/local/bin/nova-console',
 
1158
        'config_files': [nova_conf],
 
1159
    }
 
1160
    nova_novncproxy_context = {
 
1161
        'service_description': 'Nova NoVNC proxy',
 
1162
        'service_name': nova_cc,
 
1163
        'user_name': nova_user,
 
1164
        'start_dir': start_dir,
 
1165
        'process_name': 'nova-novncproxy',
 
1166
        'executable_name': '/usr/local/bin/nova-novncproxy',
 
1167
        'config_files': [nova_conf],
 
1168
    }
 
1169
    nova_objectstore_context = {
 
1170
        'service_description': 'Nova object store',
 
1171
        'service_name': nova_cc,
 
1172
        'user_name': nova_user,
 
1173
        'start_dir': start_dir,
 
1174
        'process_name': 'nova-objectstore',
 
1175
        'executable_name': '/usr/local/bin/nova-objectstore',
 
1176
        'config_files': [nova_conf],
 
1177
    }
 
1178
    nova_scheduler_context = {
 
1179
        'service_description': 'Nova scheduler',
 
1180
        'service_name': nova_cc,
 
1181
        'user_name': nova_user,
 
1182
        'start_dir': start_dir,
 
1183
        'process_name': 'nova-scheduler',
 
1184
        'executable_name': '/usr/local/bin/nova-scheduler',
 
1185
        'config_files': [nova_conf],
 
1186
    }
 
1187
    nova_spiceproxy_context = {
 
1188
        'service_description': 'Nova spice proxy',
 
1189
        'service_name': nova_cc,
 
1190
        'user_name': nova_user,
 
1191
        'start_dir': start_dir,
 
1192
        'process_name': 'nova-spicehtml5proxy',
 
1193
        'executable_name': '/usr/local/bin/nova-spicehtml5proxy',
 
1194
        'config_files': [nova_conf],
 
1195
    }
 
1196
    nova_xvpvncproxy_context = {
 
1197
        'service_description': 'Nova XVPVNC proxy',
 
1198
        'service_name': nova_cc,
 
1199
        'user_name': nova_user,
 
1200
        'start_dir': start_dir,
 
1201
        'process_name': 'nova-xvpvncproxy',
 
1202
        'executable_name': '/usr/local/bin/nova-xvpvncproxy',
 
1203
        'config_files': [nova_conf],
 
1204
    }
 
1205
 
 
1206
    # NOTE(coreycb): Needs systemd support
 
1207
    templates_dir = 'hooks/charmhelpers/contrib/openstack/templates'
 
1208
    templates_dir = os.path.join(charm_dir(), templates_dir)
 
1209
    render('git.upstart', '/etc/init/nova-api-ec2.conf',
 
1210
           nova_ec2_api_context, perms=0o644,
 
1211
           templates_dir=templates_dir)
 
1212
    render('git.upstart', '/etc/init/nova-api-os-compute.conf',
 
1213
           nova_api_os_compute_context, perms=0o644,
 
1214
           templates_dir=templates_dir)
 
1215
    render('git.upstart', '/etc/init/nova-cells.conf',
 
1216
           nova_cells_context, perms=0o644,
 
1217
           templates_dir=templates_dir)
 
1218
    render('git.upstart', '/etc/init/nova-cert.conf',
 
1219
           nova_cert_context, perms=0o644,
 
1220
           templates_dir=templates_dir)
 
1221
    render('git.upstart', '/etc/init/nova-conductor.conf',
 
1222
           nova_conductor_context, perms=0o644,
 
1223
           templates_dir=templates_dir)
 
1224
    render('git.upstart', '/etc/init/nova-consoleauth.conf',
 
1225
           nova_consoleauth_context, perms=0o644,
 
1226
           templates_dir=templates_dir)
 
1227
    render('git.upstart', '/etc/init/nova-console.conf',
 
1228
           nova_console_context, perms=0o644,
 
1229
           templates_dir=templates_dir)
 
1230
    render('git.upstart', '/etc/init/nova-novncproxy.conf',
 
1231
           nova_novncproxy_context, perms=0o644,
 
1232
           templates_dir=templates_dir)
 
1233
    render('git.upstart', '/etc/init/nova-objectstore.conf',
 
1234
           nova_objectstore_context, perms=0o644,
 
1235
           templates_dir=templates_dir)
 
1236
    render('git.upstart', '/etc/init/nova-scheduler.conf',
 
1237
           nova_scheduler_context, perms=0o644,
 
1238
           templates_dir=templates_dir)
 
1239
    render('git.upstart', '/etc/init/nova-spiceproxy.conf',
 
1240
           nova_spiceproxy_context, perms=0o644,
 
1241
           templates_dir=templates_dir)
 
1242
    render('git.upstart', '/etc/init/nova-xvpvncproxy.conf',
 
1243
           nova_xvpvncproxy_context, perms=0o644,
 
1244
           templates_dir=templates_dir)
 
1245
 
 
1246
    apt_update()
 
1247
    apt_install(LATE_GIT_PACKAGES, fatal=True)