~openstack-charmers-next/charms/wily/ceilometer-agent/trunk

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/contrib/openstack/utils.py

  • Committer: James Page
  • Date: 2016-01-19 17:02:47 UTC
  • mfrom: (74.2.1 trunk)
  • Revision ID: james.page@ubuntu.com-20160119170247-qurjagjn8rftcy6d
Resync helpers

Show diffs side-by-side

added added

removed removed

Lines of Context:
103
103
    ('2016.1', 'mitaka'),
104
104
])
105
105
 
106
 
# The ugly duckling
 
106
# The ugly duckling - must list releases oldest to newest
107
107
SWIFT_CODENAMES = OrderedDict([
108
 
    ('1.4.3', 'diablo'),
109
 
    ('1.4.8', 'essex'),
110
 
    ('1.7.4', 'folsom'),
111
 
    ('1.8.0', 'grizzly'),
112
 
    ('1.7.7', 'grizzly'),
113
 
    ('1.7.6', 'grizzly'),
114
 
    ('1.10.0', 'havana'),
115
 
    ('1.9.1', 'havana'),
116
 
    ('1.9.0', 'havana'),
117
 
    ('1.13.1', 'icehouse'),
118
 
    ('1.13.0', 'icehouse'),
119
 
    ('1.12.0', 'icehouse'),
120
 
    ('1.11.0', 'icehouse'),
121
 
    ('2.0.0', 'juno'),
122
 
    ('2.1.0', 'juno'),
123
 
    ('2.2.0', 'juno'),
124
 
    ('2.2.1', 'kilo'),
125
 
    ('2.2.2', 'kilo'),
126
 
    ('2.3.0', 'liberty'),
127
 
    ('2.4.0', 'liberty'),
128
 
    ('2.5.0', 'liberty'),
 
108
    ('diablo',
 
109
        ['1.4.3']),
 
110
    ('essex',
 
111
        ['1.4.8']),
 
112
    ('folsom',
 
113
        ['1.7.4']),
 
114
    ('grizzly',
 
115
        ['1.7.6', '1.7.7', '1.8.0']),
 
116
    ('havana',
 
117
        ['1.9.0', '1.9.1', '1.10.0']),
 
118
    ('icehouse',
 
119
        ['1.11.0', '1.12.0', '1.13.0', '1.13.1']),
 
120
    ('juno',
 
121
        ['2.0.0', '2.1.0', '2.2.0']),
 
122
    ('kilo',
 
123
        ['2.2.1', '2.2.2']),
 
124
    ('liberty',
 
125
        ['2.3.0', '2.4.0', '2.5.0']),
 
126
    ('mitaka',
 
127
        ['2.5.0']),
129
128
])
130
129
 
131
130
# >= Liberty version->codename mapping
132
131
PACKAGE_CODENAMES = {
133
132
    'nova-common': OrderedDict([
134
 
        ('12.0.0', 'liberty'),
135
 
        ('13.0.0', 'mitaka'),
 
133
        ('12.0', 'liberty'),
 
134
        ('13.0', 'mitaka'),
136
135
    ]),
137
136
    'neutron-common': OrderedDict([
138
 
        ('7.0.0', 'liberty'),
139
 
        ('8.0.0', 'mitaka'),
 
137
        ('7.0', 'liberty'),
 
138
        ('8.0', 'mitaka'),
140
139
    ]),
141
140
    'cinder-common': OrderedDict([
142
 
        ('7.0.0', 'liberty'),
143
 
        ('8.0.0', 'mitaka'),
 
141
        ('7.0', 'liberty'),
 
142
        ('8.0', 'mitaka'),
144
143
    ]),
145
144
    'keystone': OrderedDict([
146
 
        ('8.0.0', 'liberty'),
147
 
        ('9.0.0', 'mitaka'),
 
145
        ('8.0', 'liberty'),
 
146
        ('9.0', 'mitaka'),
148
147
    ]),
149
148
    'horizon-common': OrderedDict([
150
 
        ('8.0.0', 'liberty'),
151
 
        ('9.0.0', 'mitaka'),
 
149
        ('8.0', 'liberty'),
 
150
        ('9.0', 'mitaka'),
152
151
    ]),
153
152
    'ceilometer-common': OrderedDict([
154
 
        ('5.0.0', 'liberty'),
155
 
        ('6.0.0', 'mitaka'),
 
153
        ('5.0', 'liberty'),
 
154
        ('6.0', 'mitaka'),
156
155
    ]),
157
156
    'heat-common': OrderedDict([
158
 
        ('5.0.0', 'liberty'),
159
 
        ('6.0.0', 'mitaka'),
 
157
        ('5.0', 'liberty'),
 
158
        ('6.0', 'mitaka'),
160
159
    ]),
161
160
    'glance-common': OrderedDict([
162
 
        ('11.0.0', 'liberty'),
163
 
        ('12.0.0', 'mitaka'),
 
161
        ('11.0', 'liberty'),
 
162
        ('12.0', 'mitaka'),
164
163
    ]),
165
164
    'openstack-dashboard': OrderedDict([
166
 
        ('8.0.0', 'liberty'),
167
 
        ('9.0.0', 'mitaka'),
 
165
        ('8.0', 'liberty'),
 
166
        ('9.0', 'mitaka'),
168
167
    ]),
169
168
}
170
169
 
227
226
    error_out(e)
228
227
 
229
228
 
 
229
def get_os_version_codename_swift(codename):
 
230
    '''Determine OpenStack version number of swift from codename.'''
 
231
    for k, v in six.iteritems(SWIFT_CODENAMES):
 
232
        if k == codename:
 
233
            return v[-1]
 
234
    e = 'Could not derive swift version for '\
 
235
        'codename: %s' % codename
 
236
    error_out(e)
 
237
 
 
238
 
 
239
def get_swift_codename(version):
 
240
    '''Determine OpenStack codename that corresponds to swift version.'''
 
241
    codenames = [k for k, v in six.iteritems(SWIFT_CODENAMES) if version in v]
 
242
    if len(codenames) > 1:
 
243
        # If more than one release codename contains this version we determine
 
244
        # the actual codename based on the highest available install source.
 
245
        for codename in reversed(codenames):
 
246
            releases = UBUNTU_OPENSTACK_RELEASE
 
247
            release = [k for k, v in six.iteritems(releases) if codename in v]
 
248
            ret = subprocess.check_output(['apt-cache', 'policy', 'swift'])
 
249
            if codename in ret or release[0] in ret:
 
250
                return codename
 
251
    elif len(codenames) == 1:
 
252
        return codenames[0]
 
253
    return None
 
254
 
 
255
 
230
256
def get_os_codename_package(package, fatal=True):
231
257
    '''Derive OpenStack release codename from an installed package.'''
232
258
    import apt_pkg as apt
251
277
        error_out(e)
252
278
 
253
279
    vers = apt.upstream_version(pkg.current_ver.ver_str)
254
 
    match = re.match('^(\d+)\.(\d+)\.(\d+)', vers)
 
280
    if 'swift' in pkg.name:
 
281
        # Fully x.y.z match for swift versions
 
282
        match = re.match('^(\d+)\.(\d+)\.(\d+)', vers)
 
283
    else:
 
284
        # x.y match only for 20XX.X
 
285
        # and ignore patch level for other packages
 
286
        match = re.match('^(\d+)\.(\d+)', vers)
 
287
 
255
288
    if match:
256
289
        vers = match.group(0)
257
290
 
263
296
        # < Liberty co-ordinated project versions
264
297
        try:
265
298
            if 'swift' in pkg.name:
266
 
                swift_vers = vers[:5]
267
 
                if swift_vers not in SWIFT_CODENAMES:
268
 
                    # Deal with 1.10.0 upward
269
 
                    swift_vers = vers[:6]
270
 
                return SWIFT_CODENAMES[swift_vers]
 
299
                return get_swift_codename(vers)
271
300
            else:
272
 
                vers = vers[:6]
273
301
                return OPENSTACK_CODENAMES[vers]
274
302
        except KeyError:
275
303
            if not fatal:
287
315
 
288
316
    if 'swift' in pkg:
289
317
        vers_map = SWIFT_CODENAMES
 
318
        for cname, version in six.iteritems(vers_map):
 
319
            if cname == codename:
 
320
                return version[-1]
290
321
    else:
291
322
        vers_map = OPENSTACK_CODENAMES
292
 
 
293
 
    for version, cname in six.iteritems(vers_map):
294
 
        if cname == codename:
295
 
            return version
 
323
        for version, cname in six.iteritems(vers_map):
 
324
            if cname == codename:
 
325
                return version
296
326
    # e = "Could not determine OpenStack version for package: %s" % pkg
297
327
    # error_out(e)
298
328
 
458
488
    cur_vers = get_os_version_package(package)
459
489
    if "swift" in package:
460
490
        codename = get_os_codename_install_source(src)
461
 
        available_vers = get_os_version_codename(codename, SWIFT_CODENAMES)
 
491
        avail_vers = get_os_version_codename_swift(codename)
462
492
    else:
463
 
        available_vers = get_os_version_install_source(src)
 
493
        avail_vers = get_os_version_install_source(src)
464
494
    apt.init()
465
 
    return apt.version_compare(available_vers, cur_vers) == 1
 
495
    if "swift" in package:
 
496
        major_cur_vers = cur_vers.split('.', 1)[0]
 
497
        major_avail_vers = avail_vers.split('.', 1)[0]
 
498
        major_diff = apt.version_compare(major_avail_vers, major_cur_vers)
 
499
        return avail_vers > cur_vers and (major_diff == 1 or major_diff == 0)
 
500
    return apt.version_compare(avail_vers, cur_vers) == 1
466
501
 
467
502
 
468
503
def ensure_block_device(block_device):
591
626
    return yaml.load(projects_yaml)
592
627
 
593
628
 
594
 
def git_clone_and_install(projects_yaml, core_project, depth=1):
 
629
def git_clone_and_install(projects_yaml, core_project):
595
630
    """
596
631
    Clone/install all specified OpenStack repositories.
597
632
 
641
676
    for p in projects['repositories']:
642
677
        repo = p['repository']
643
678
        branch = p['branch']
 
679
        depth = '1'
 
680
        if 'depth' in p.keys():
 
681
            depth = p['depth']
644
682
        if p['name'] == 'requirements':
645
683
            repo_dir = _git_clone_and_install_single(repo, branch, depth,
646
684
                                                     parent_dir, http_proxy,
685
723
    """
686
724
    Clone and install a single git repository.
687
725
    """
688
 
    dest_dir = os.path.join(parent_dir, os.path.basename(repo))
689
 
 
690
726
    if not os.path.exists(parent_dir):
691
727
        juju_log('Directory already exists at {}. '
692
728
                 'No need to create directory.'.format(parent_dir))
693
729
        os.mkdir(parent_dir)
694
730
 
695
 
    if not os.path.exists(dest_dir):
696
 
        juju_log('Cloning git repo: {}, branch: {}'.format(repo, branch))
697
 
        repo_dir = install_remote(repo, dest=parent_dir, branch=branch,
698
 
                                  depth=depth)
699
 
    else:
700
 
        repo_dir = dest_dir
 
731
    juju_log('Cloning git repo: {}, branch: {}'.format(repo, branch))
 
732
    repo_dir = install_remote(repo, dest=parent_dir, branch=branch, depth=depth)
701
733
 
702
734
    venv = os.path.join(parent_dir, 'venv')
703
735