43
43
'python-glanceclient': 'glance',
44
44
'python-swiftclient': 'swift',
45
45
'qemu-utils': 'qemu-img',
46
'python-netaddr': 'None',
46
'python-netaddr': 'ls', # need to mod to be able to specify None
52
# 'config': (('--config',),
53
# {'help': 'modev config to use', 'default': DEFAULT_CONFIG}),
54
# 'dry-run': (('-n', '--dry-run'),
55
# {'help': 'only report what would be done',
56
# 'action': 'store_true', 'default': False}),
57
# 'ipv6': (('-6', '--ipv6'),
58
# {'help': 'All netwroks are IPv6',
59
# 'action': 'store_true', 'default': False}),
53
'config': (('--config',),
54
{'help': 'modev config to use', 'default': DEFAULT_CONFIG}),
55
'dry-run': (('-n', '--dry-run'),
56
{'help': 'only report what would be done',
57
'action': 'store_true', 'default': False}),
58
'ipv6': (('-6', '--ipv6'),
59
{'help': 'All netwroks are IPv6',
60
'action': 'store_true', 'default': False}),
76
79
'help': 'add a new cluster network in a region',
78
81
# COMMON_FLAGS['config'],
79
(('--base-cidr','-cidr',),
82
(('--base-cidr', '-cidr',),
80
83
{'help': 'subnet definition \
81
84
(default {})'.format(DEFAULT_CLUSTER_SUBNET),
82
85
'action': 'store', 'default': DEFAULT_CLUSTER_SUBNET}),
84
87
# (('--cluster-controller-create'),
85
# {'help': 'create the maas cluster controller instance \
88
# {'help': 'create the maas cluster controller instance
86
89
# on this cluster',
87
90
# 'action': 'store', 'default': True}),
166
169
# {'help': 'pem file to use (don\'t create one)'}),
168
171
(('--net-router', '-nr'),
169
{'help': 'if you want to reuse an existing router'}),
172
{'help': 'if you want to reuse an existing router, this ' +
173
'can be an id or an existing region name'}),
171
175
(('--force', '-f'),
172
176
{'help': 'if leftover config files exists',
201
205
{'help': 'list region on the same cloud than this one'}),
209
'help': 'dump config of region',
211
(('--region-name', '-rn'),
212
{'help': 'The name of the region to use/create',
213
'action': 'store', 'default': DEFAULT_REGION}),
204
216
'region-purge': {
205
217
'help': 'purge everything in a region',
361
373
def is_modev_region(name=None):
362
return(os.path.exists(DEFAULT_CONF_DIR + '/' + name + '/'
374
return(os.path.exists(DEFAULT_CONF_DIR + '/' + str(name) + '/'
375
+ str(name) + '.conf'))
366
378
def get_modev_config():
367
#failsafe if file no properly configured:
379
# failsafe if file no properly configured:
368
380
modev_cfg = {'options': {'region': {'default': 'm0d'}}}
369
381
if os.path.exists(DEFAULT_CONFIG):
370
382
modev_file = open(DEFAULT_CONFIG, 'r')
389
402
'{}'.format(DEFAULT_CONFIG))
390
403
modev_region = DEFAULT_REGION
391
404
set_modev_region(modev_region)
406
if is_modev_region(modev_region) is False:
407
regions = list_modev_regions()
408
if len(regions) is 0:
409
set_modev_region(DEFAULT_REGION)
410
modev_region = DEFAULT_REGION
412
set_modev_region(regions[0])
413
modev_region = regions[0]
392
414
return(modev_region)
395
def update_modev_config(update=None):
417
def set_modev_region(name=None):
419
name = DEFAULT_REGION
396
420
if not os.path.exists(DEFAULT_CONF_DIR):
397
421
os.makedirs(DEFAULT_CONF_DIR)
398
422
modev_cfg = get_modev_config()
399
modev_cfg.update(update)
423
modev_cfg['options']['region']['default'] = name
400
424
set_modev_config(modev_cfg)
403
def set_modev_region(name=None):
405
name = DEFAULT_REGION
406
update_modev_config({'options': {'region': {'default': name}}})
409
427
def select_region(name=None, config=None):
410
428
modev_region = get_modev_region()
412
if modev_region is None:
430
if is_modev_region(modev_region) is False:
413
431
name = DEFAULT_REGION
415
433
name = modev_region
447
467
return region_objects
470
def neutron_get_region_router_id(name=None):
471
conf = get_region_config(name)
472
return(conf['router-id'])
475
def neutron_get_netname_from_cidr(rc=None, ncidr=None):
476
neutron = neutron_connect(rc)
477
net_name = neutron.list_subnets(cidr=str(ncidr))
478
net_name = net_name['subnets'][0]['network_id']
479
return(neutron.list_networks(id=net_name)['networks'][0][u'name'])
450
482
def neutron_get_cidrs(rc=None):
452
484
neutron = neutron_connect(rc)
453
485
for sub in neutron.list_subnets()['subnets']:
454
486
cidr_list.append(sub[u'cidr'])
455
return(netaddr.cidr_merge(cidr_list))
490
def neutron_get_region_cidrs(name=None):
491
name = select_region(name)
493
for sub in get_region_config(name)['subnets']:
494
neutron = neutron_connect(get_region_rc(name))
495
filter = str('id=' + '\'' + sub['subnet-id'] + '\'')
496
subs.append(neutron.list_subnets(filter)['subnets'][0]['cidr'])
458
500
def neutron_check_cidrs(rc=None, cidr=None):
459
501
neutron = neutron_connect(rc)
460
for ncidr in neutron_get_cidrs(rc):
461
for ip in ncidr.cidr:
463
net_name = neutron_get_netname_from_cidr(rc, ncidr.cidr)
464
return(True, str(ncidr), net_name)
502
return(check_cidr_in_cidrs(cidr, neutron_get_cidrs(rc), rc))
505
def check_cidr_in_cidrs(cidr=None, cidrs=None, rc=None):
506
cidr = netaddr.IPNetwork(cidr)
508
ncidr = netaddr.IPNetwork(ncidr)
509
if cidr.ip in ncidr.cidr or ncidr.ip in cidr.cidr:
510
net_name = neutron_get_netname_from_cidr(rc, ncidr.cidr)
511
return(True, str(ncidr), net_name)
465
512
return(False, None, None)
468
def neutron_get_netname_from_cidr(rc=None, ncidr=None):
469
neutron = neutron_connect(rc)
470
net_name = neutron.list_subnets(cidr=str(ncidr))
471
net_name = net_name['subnets'][0]['network_id']
472
return(neutron.list_networks(id=net_name)['networks'][0][u'name'])
475
def neutron_get_region_router_id(name=None):
476
conf = get_region_config(name)
477
return(conf['router-id'])
480
515
def neutron_get_router_cidrs(name=None, rc=None, router_id=None):
516
name = select_region(name)
482
neutron = neutron_connect(rc)
520
neutron = neutron_connect(get_region_rc(name))
522
neutron = neutron_connect(rc)
483
524
if router_id is None:
484
525
router_id = neutron_get_region_router_id(name)
485
527
for port in neutron.list_ports(device_id=router_id)['ports']:
487
529
for ip in port['fixed_ips']:
489
531
for sub_id in subnet_ids:
490
532
for sub in neutron.list_subnets(id=sub_id)['subnets']:
491
533
cidrs.append(sub['cidr'])
492
return(netaddr.cidr_merge(cidrs))
495
def neutron_check_router_cidrs(name=None, rc=None, cidr=None,
537
def neutron_check_router_cidrs(name=None, cidr=None, rc=None,
541
neutron = neutron_connect(get_region_rc(name))
543
neutron = neutron_connect(rc)
497
545
if router_id is None:
498
546
router_id = neutron_get_region_router_id(name)
499
neutron = neutron_connect(rc)
500
for ncidr in neutron_get_router_cidrs(name, rc, router_id):
501
for ip in ncidr.cidr:
503
net_name = neutron_get_netname_from_cidr(rc, ncidr.cidr)
504
return(True, str(ncidr), net_name)
505
return(False, None, None)
548
return(check_cidr_in_cidrs(cidr,
549
neutron_get_router_cidrs(name, rc,
553
def cidr_router_find_free(name=None):
554
name = select_region(name)
555
cidrs = neutron_get_router_cidrs(name)
557
test_cidr = DEFAULT_CLUSTER_SUBNET.split('.')
559
counter = int(test_cidr[2])
560
while(counter < 255):
563
test_cidr[2] = counter
567
# while( base_cidr <= 255 ):
573
def cidr_region_find_free(name=None):
577
def cidr_region_list(name=None):
578
name = select_region(name)
579
config = get_region_config(name)
582
def cidr_check_free(cidr=None, name=None, rc=None, router_id=None):
585
raise NameError('cidr must be given!')
587
if rc is None and name is not None:
588
rc = get_region_rc(name)
589
neutron = neutron_connect(rc)
591
neutron = neutron_connect(rc)
593
if router_id is None and name is not None:
594
router_id = neutron_get_region_router_id(name)
596
exist, ex_cidr, ex_name = \
597
neutron_check_router_cidrs(rc=rc, cidr=cidr, router_id=router_id)
599
print('This cidr is overlapping another one used on this ' +
600
'environment:\nexisting cidr: {} '.format(ex_cidr) +
601
'- network name: {}'.format(ex_name))
602
full_region = FIXED_PREFIX + name
603
neutron_purge(prefix=full_region, rc=rc)
609
def cidr_validate(cidr=None):
612
vcidr = netaddr.IPNetwork(cidr)
614
print('Could\'nt validate your cidr address, please verify ' +
615
'it must be something like:\n' +
616
'{}'.format(DEFAULT_ADM_SUBNET))
508
621
def neutron_update_ports(name=None):
548
661
# we can delete networks now
549
662
for network in region_net_list:
550
print('deleting network:' +
551
'name:"{}", id:"{}"'.format(network[u'name'],
664
print('deleting network:' +
665
'name:"{}", id:"{}"'.format(network[u'name'],
553
667
neutron.delete_network(network[u'id'])
555
router_list = neutron.list_routers()['routers']
556
for router in router_list:
669
# we delete routers now
670
for router in neutron.list_routers()['routers']:
557
671
if prefix in router[u'name']:
558
print('deleting router:' +
559
'name:"{}", id:"{}"'.format(router[u'name'],
561
neutron.delete_router(router[u'id'])
673
print('deleting router:' +
674
'name:"{}", id:"{}"'.format(router[u'name'],
677
neutron.delete_router(router[u'id'])
679
print('An other region use this router')
564
682
def main_check(args):
637
755
print('please provide an existing region, you can create it ' +
638
756
'with region-create command')
640
set_modev_region(args.region_name)
759
set_modev_region(select_region(args.region_name))
643
762
def main_region_create(args):
763
# Need to rework the all function....
765
# we read data from openrc file
766
if not os.path.isfile(args.openrc):
767
print('openrc file: "{}" don\'t exist!'.format(args.openrc))
644
770
region_name = select_region(args.region_name)
771
if region_name == DEFAULT_REGION and is_modev_region(region_name):
774
free_region = str('m' + str(i) + 'd')
775
if is_modev_region(free_region) is False:
776
region_name = free_region
779
if is_modev_region(region_name):
780
print('please specify a region name, seems like ' +
781
'you exhausted them all!')
648
cidr = netaddr.IPNetwork(args.base_cidr)
650
print('Could\'nt validate your cidr address, please verify ' +
651
'it must be something like:\n' +
652
'{}'.format(DEFAULT_ADM_SUBNET))
784
cidr = cidr_validate(args.base_cidr)
655
786
# we test if region isn't already configured
656
787
# create directory if necessary
744
870
# checking and using the one provided:
746
# using a former one, we chek if it exists:
747
router = neutron.list_routers(id=args.net_router)
872
# checking if we need to get router from an other region
873
if is_modev_region(args.net_router):
874
router_id = neutron_get_region_router_id(args.net_router)
875
print('Using router from region : ' +
876
'"{}" - id: "{}"'.format(args.net_router, router_id))
878
# using a former one, we chek if it exists:
879
router = neutron.list_routers(id=args.net_router)
749
if len(router['routers']) is 0:
750
print('This router Id doesn\'t exist!')
753
router_id = router['routers'][0]['id']
881
if len(router['routers']) is 0:
882
print('This router Id doesn\'t exist!')
885
router_id = router['routers'][0]['id']
886
print('Using router: "{}"'.format(router_id))
755
887
region_cfg.update({'router-id': router_id})
773
905
# creating network admin subnet:
774
906
# First we check that this cidr is available on the tenant network
776
exist, ex_cidr, ex_name = \
777
neutron_check_router_cidrs(rc=openrc_cfg, cidr=cidr,
780
print('This range is already used on this environment' +
781
'!:\nexisting cidr: {} '.format(ex_cidr) +
782
'- network name: {}'.format(ex_name))
783
neutron_purge(prefix=full_region, rc=openrc_cfg)
907
cidr_check_free(cidr, region_name, openrc_cfg, router_id)
786
909
if cidr.version == 4:
787
910
subnet = {'name': full_region + 'adm-snet',
791
914
subnet_id = subnet[u'subnet'][u'id']
792
915
region_cfg.update({'subnets': [{'name': 'subnet-adm-id',
793
916
'subnet-id': subnet_id,
794
'subnet-cidr': str(cidr)},]})
917
'subnet-cidr': str(cidr)}, ]})
795
918
elif cidr.version == 6:
796
919
print('IPV6 is not yet implemented, sorry!')
797
920
neutron_purge(prefix=full_region, rc=openrc_cfg)
840
963
def main_region_current(args):
841
964
region = get_modev_region()
842
965
if is_modev_region(region):
843
state = 'Config file exists, state OK'
966
print('Current selected region:\n{}'.format(region))
845
state = 'Config file is destroyed, state KO'
846
print('Current selected region:\n{}, {}'.format(region, state))
968
print('No region is currently configured!')
849
972
def main_region_list(args):
864
994
if 'modev' in name[u'name']:
865
995
# we retrieve the name of the region from network name
866
996
net_list.append(name[u'name'].split('_')[1])
997
for name in neutron.list_routers()['routers']:
998
if 'modev' in name[u'name']:
999
name = name[u'name'].split('_')[1]
1000
if name not in net_list:
1001
net_list.append(name)
867
1002
return(net_list)
870
def purge_openrc(rc=None):
1005
def purge_openrc(rc=None, verbose=False):
871
1006
for region in get_openrc_regions(rc):
872
neutron_purge(FIXED_PREFIX + region, rc)
1007
neutron_purge(FIXED_PREFIX + region, rc, verbose)
873
1008
rmdir(DEFAULT_CONF_DIR + region)
876
def purge_region(name=None):
1009
# To be sure to delete all routers (some can be mutualised)
1010
while(get_openrc_regions(rc)):
1011
print('purging leftovers')
1012
purge_openrc(rc, True)
1015
def purge_region(name=None, verbose=False):
877
1016
if name is None:
878
1017
raise NameError('Error, region can\'t be None, please report')
879
1018
region_rc = get_region_rc(name)
880
neutron_purge(FIXED_PREFIX + name, region_rc)
1019
neutron_purge(FIXED_PREFIX + name, region_rc, verbose)
881
1020
rmdir(DEFAULT_CONF_DIR + name)
886
1025
if args.all_regions:
887
1026
for region in list_modev_regions():
888
1027
region_rc = get_region_rc(region)
889
purge_openrc(region_rc)
1028
purge_openrc(region_rc, verbose=True)
890
1029
elif args.openrc:
891
1030
region_rc = load_openrc(openrc=args.openrc)
892
purge_openrc(region_rc)
1031
purge_openrc(region_rc, verbose=True)
894
1033
region = select_region(args.region_name)
895
1034
if args.same_cloud:
896
1035
region_rc = get_region_rc(region)
897
purge_openrc(region_rc)
1036
purge_openrc(region_rc, verbose=True)
1038
purge_region(region, verbose=True)
901
1040
print('You must specifies either : \nan openrc file (-rc)\n' +
902
1041
'a region name (-rn)\n--all-regions to remove anything')
945
1085
print('You can try command region-list')
948
neutron = neutron_connect(get_region_rc(name))
950
# Creating Neutron Network
1089
cidr = cidr_validate(args.base_cidr)
1090
# checking if given cidr is free on the region router
1091
exist, ex_cidr, ex_name = \
1092
neutron_check_router_cidrs(rc=openrc_cfg, cidr=cidr,
1093
router_id=router_id)
1095
cluster_cidr = cidr_find_free(name)
1097
# Neutron Network Setup
1098
neutron = neutron_connect(get_region_rc(name))
1100
# Check if it already exists
951
1101
c_name = FIXED_PREFIX + name + '_' + args.name + '_cluster'
952
1102
for cluster_net in region_cfg['config']['networks']:
953
1103
if cluster_net['name'] == c_name:
954
1104
print('A cluster with this name already exists!')
1107
# We create the network for this cluster
957
1108
network = {'name': c_name,
958
1109
'admin_state_up': True}
959
1110
network = neutron.create_network({'network': network})
960
1111
network_id = network[u'network'][u'id']
1112
# We add it to the region configuration
962
1113
region_cfg['config']['networks'].append({'name': c_name,
963
1114
'network-id': network_id})
964
update_region_file(name,region_cfg)
1116
# Creation of subnet for the cluster
1118
# Update the region file
1119
update_region_file(name, region_cfg)
966
1121
print('region to use:"{}"'.format(name))
967
print('name:{}\n'.format(args.name) +\
1122
print('name:{}\n'.format(args.name) +
968
1123
'base-cidr:{}\n'.format(args.base_cidr))