~manjiri/charms/precise/contrail-collector/trunk

« back to all changes in this revision

Viewing changes to precise/contrail-openstack/hooks/charmhelpers/contrib/contrail/common.py

  • Committer: M G
  • Date: 2014-03-12 17:15:13 UTC
  • Revision ID: manjiri@juniper.net-20140312171513-e2pcjnurhw2bl1a6
dry run

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
    charm_dir,
21
21
)
22
22
 
 
23
dry_run = None
 
24
 
23
25
def fatal_cmd(cmd):
24
26
    subprocess.check_call(cmd)
25
27
#end fatal_cmd
30
32
 
31
33
def mkdir(loc):
32
34
    try:
33
 
        os.mkdir(loc)
 
35
        os.makedirs(loc)
34
36
    except OSError as exc:
35
37
        if not (exc.errno == errno.EEXIST and os.path.isdir(loc)):
36
 
            raise BaseException('mkdir {} failed'.format(loc))
 
38
            raise BaseException('makedirs {} failed'.format(loc))
37
39
#end mkdir
38
40
 
39
41
def fatal_dircmd(loc, cmd):
95
97
# TODO knob for data interface device, ip and gw
96
98
def data_interface():
97
99
    dev = 'eth1'
 
100
    if is_dry_run():
 
101
        juju_log("Dry run data_interface({})".format(dev))
 
102
        return dev, '2.2.2.2', '2.2.2.1'
98
103
 
99
104
    fname = os.path.join(etc_dir, 'network/interfaces')
100
105
    result = nonfatal_cmd(['grep', 'iface ' + dev, fname])
134
139
    fatal_dircmd(loc, cmd)
135
140
#end get_url
136
141
 
 
142
def container_package_config():
 
143
    url = config('container-package')
 
144
    if not url: 
 
145
        raise BaseException('No URL specified')
 
146
    if url == 'dry-run':
 
147
        return None
 
148
    return url
 
149
#end container_package_config
 
150
 
 
151
def is_dry_run():
 
152
    global dry_run
 
153
    if dry_run == None:
 
154
        if container_package_config():
 
155
            dry_run = False
 
156
        else:
 
157
            dry_run = True
 
158
            juju_log("Dry run enabled")
 
159
    return dry_run
 
160
#end is_dry_run
 
161
 
137
162
container_dir = '/contrail-container-package'
138
163
def get_container_package():
139
164
    '''Get the container package from the URL specified in config'''
140
165
 
141
 
    url = config('container-package')
 
166
    url = container_package_config()
 
167
    if not url:
 
168
        return
142
169
    juju_log('container-package {}'.format(url))
143
 
    if not url: 
144
 
        raise BaseException('No URL specified')
145
170
    mkdir(container_dir)
146
171
 
147
172
    # Avoid multiple copies with LXCs
181
206
#end patch_loc
182
207
 
183
208
def patch_it_up():
 
209
    if is_dry_run():
 
210
        juju_log("Dry run patch_it_up")
 
211
        return
184
212
    prefix = '/opt/contrail/'
185
213
    
186
214
    patched = already_dir + 'patched'
214
242
    if TESTBED:
215
243
        cmd.insert(0, 'TESTBED=' + TESTBED)
216
244
        cmd.insert(0, 'sudo')
 
245
    if is_dry_run():
 
246
        juju_log("Dry run {}".format(cmd))
 
247
        return
217
248
    fatal_dircmd(loc, cmd)
218
249
#end fab
219
250
 
255
286
    fatal_cmd(cmd)
256
287
 
257
288
def install_packages_from_container():
 
289
    if is_dry_run():
 
290
        global testbed_dir
 
291
        mkdir(testbed_dir)
 
292
        juju_log("Dry run install_packages_from_container")
 
293
        return
258
294
    unpack_container_package()
259
295
    create_install_repo()
260
296
#end install_packages_from_container
367
403
 
368
404
def role_state_loc(fname=''):
369
405
    return os.path.join(charm_dir(), 'role/' + fname)
 
406
#end role_state_loc
370
407
 
371
408
def clean_start():
372
409
    cmd = ['rm', '-rf', role_state_loc()]
373
410
    nonfatal_cmd(cmd)
374
411
    mkdir(role_state_loc())
 
412
    juju_log("role_state now clean {}".format(role_state_loc()))
 
413
#end clean_start
375
414
 
376
415
def pre_start(TESTBED):
377
416
    ''' clean -> starting or started -> starting or jamming -> started '''
395
434
        if TESTBED:
396
435
            with open(TESTBED, 'r') as inf:
397
436
                outf.write(inf.read()) # TESTBED >> starting
 
437
    juju_log("role_state {} -> {}".format(os.path.basename(old), 
 
438
                                          os.path.basename(new)))
398
439
#end pre_start
399
440
 
400
441
def post_start(jam='later'):
417
458
    if jam != 'later':
418
459
        with open(new, 'a') as outf:
419
460
            outf.write("\n^^^ %s\n" % str(datetime.now()))
 
461
    juju_log("role_state {} -> {}".format(os.path.basename(old), 
 
462
                                          os.path.basename(new)))
420
463
#end post_start
421
464
 
422
465
def be_jamming(role):
441
484
 
442
485
# See https://bugs.launchpad.net/juju-core/+bug/1244761
443
486
# Workaround: Do our very best not to cause reboot mid-hook
444
 
def reboot(skip=False):
 
487
def reboot(skip=True):
 
488
    if is_dry_run():
 
489
        skip = True
 
490
 
445
491
    child_pid = os.fork()
446
492
    if child_pid == 0:
447
493
        # child process
448
494
        if skip:
449
 
            sys.exit(os.execl('/bin/echo', 'echo', 'skip reboot'))
 
495
            sys.exit(os.execl('/bin/echo', 'echo', 'Child skip reboot'))
450
496
 
451
497
        time.sleep(10)
452
498
        # TODO fab compute_reboot
454
500
    else:
455
501
        # parent process
456
502
        # pid, status = os.waitpid(child_pid, 0)
457
 
        juju_log("Reboot scheduled via child pid {}".format(child_pid))
 
503
        juju_log("Reboot scheduled (skip={}) via child pid {}".format(
 
504
                skip, child_pid))
 
505
        return skip
458
506
#end reboot
459
507
 
460
508
class Role(object):
643
691
 
644
692
        if self.pfabs:
645
693
            post_start('later')
646
 
            # reboot()
 
694
            reboot()
647
695
            return False # reboot a-coming
648
696
        else:
649
697
            post_start('immediate')