This is an automated email from the ASF dual-hosted git repository. omartushevskyi pushed a commit to branch DLAB-1493 in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git
commit 75d55aad46cccf109edd9a73f160aa1cab59a689 Author: Oleh Martushevskyi <oleh_martushevs...@epam.com> AuthorDate: Thu Jan 30 15:21:27 2020 +0200 [DLAB-1493]: Added users_subnet_range functionality to GCP --- .../general/scripts/gcp/common_create_subnet.py | 108 +++++++++++++-------- .../src/general/scripts/gcp/project_prepare.py | 9 +- 2 files changed, 73 insertions(+), 44 deletions(-) diff --git a/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py b/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py index 7131764..d547458 100644 --- a/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py +++ b/infrastructure-provisioning/src/general/scripts/gcp/common_create_subnet.py @@ -36,57 +36,81 @@ parser.add_argument('--region', type=str, default='') parser.add_argument('--vpc_selflink', type=str, default='') parser.add_argument('--prefix', type=str, default='') parser.add_argument('--vpc_cidr', type=str, default='') +parser.add_argument('--user_subnets_range', type=str, default='') args = parser.parse_args() if __name__ == "__main__": - empty_vpc = False - private_subnet_size = ipaddress.ip_network(u'0.0.0.0/{}'.format(args.prefix)).num_addresses - subnets_cidr = [] - try: - subnets = GCPMeta().get_vpc(args.vpc_selflink.split('/')[-1])['subnetworks'] - except KeyError: - empty_vpc = True - subnets = [] - for subnet in subnets: - subnets_cidr.append(GCPMeta().get_subnet(subnet.split('/')[-1], args.region)['ipCidrRange']) - sortkey = lambda addr: \ - (int(addr.split("/")[0].split(".")[0]), - int(addr.split("/")[0].split(".")[1]), - int(addr.split("/")[0].split(".")[2]), - int(addr.split("/")[0].split(".")[3]), - int(addr.split("/")[1])) - sorted_subnets_cidr = sorted(subnets_cidr, key=sortkey) + if args.user_subnets_range == '' or args.ssn: + empty_vpc = False + private_subnet_size = ipaddress.ip_network(u'0.0.0.0/{}'.format(args.prefix)).num_addresses + subnets_cidr = [] + try: + subnets = GCPMeta().get_vpc(args.vpc_selflink.split('/')[-1])['subnetworks'] + except KeyError: + empty_vpc = True + subnets = [] + for subnet in subnets: + subnets_cidr.append(GCPMeta().get_subnet(subnet.split('/')[-1], args.region)['ipCidrRange']) + sortkey = lambda addr: \ + (int(addr.split("/")[0].split(".")[0]), + int(addr.split("/")[0].split(".")[1]), + int(addr.split("/")[0].split(".")[2]), + int(addr.split("/")[0].split(".")[3]), + int(addr.split("/")[1])) + sorted_subnets_cidr = sorted(subnets_cidr, key=sortkey) - if not empty_vpc: - last_ip = int(ipaddress.IPv4Address(sorted_subnets_cidr[0].split('/')[0].decode("utf-8"))) - else: - last_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0].decode("utf-8"))) - previous_subnet_size = private_subnet_size - for cidr in sorted_subnets_cidr: - first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0].decode("utf-8"))) - if first_ip - last_ip < private_subnet_size or previous_subnet_size < private_subnet_size: - subnet_size = ipaddress.ip_network(u'{}'.format(cidr)).num_addresses - last_ip = first_ip + subnet_size - 1 - previous_subnet_size = subnet_size + if not empty_vpc: + last_ip = int(ipaddress.IPv4Address(sorted_subnets_cidr[0].split('/')[0].decode("utf-8"))) else: - break + last_ip = int(ipaddress.IPv4Address(args.vpc_cidr.split('/')[0].decode("utf-8"))) + previous_subnet_size = private_subnet_size + for cidr in sorted_subnets_cidr: + first_ip = int(ipaddress.IPv4Address(cidr.split('/')[0].decode("utf-8"))) + if first_ip - last_ip < private_subnet_size or previous_subnet_size < private_subnet_size: + subnet_size = ipaddress.ip_network(u'{}'.format(cidr)).num_addresses + last_ip = first_ip + subnet_size - 1 + previous_subnet_size = subnet_size + else: + break - dlab_subnet_cidr = '' - if empty_vpc: - dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix) + dlab_subnet_cidr = '' + if empty_vpc: + dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip), args.prefix) + else: + if previous_subnet_size < private_subnet_size: + while True: + try: + dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix) + ipaddress.ip_network(dlab_subnet_cidr.decode('utf-8')) + break + except ValueError: + last_ip = last_ip + 2 + continue + else: + dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix) else: - if previous_subnet_size < private_subnet_size: - while True: - try: - dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix) - ipaddress.ip_network(dlab_subnet_cidr.decode('utf-8')) - break - except ValueError: - last_ip = last_ip + 2 - continue + pre_defined_subnet_list = [] + subnet_cidr = args.user_subnets_range.split('-')[0].replace(' ', '') + pre_defined_subnet_list.append(subnet_cidr) + while str(subnet_cidr) != args.user_subnets_range.split('-')[1].replace(' ', ''): + subnet = ipaddress.ip_network(u'{}'.format(subnet_cidr)) + num_addr = subnet.num_addresses + first_ip = int(ipaddress.IPv4Address(u'{}'.format(subnet.network_address))) + next_subnet = ipaddress.ip_network(u'{}/{}'.format(ipaddress.ip_address(first_ip + num_addr), + args.prefix)) + pre_defined_subnet_list.append(next_subnet.compressed) + subnet_cidr = next_subnet + existed_subnet_list = [] + response = GCPMeta().get_vpc(args.vpc_selflink.split('/')[-1])['subnetworks'] + for subnet in response: + existed_subnet_list.append(GCPMeta().get_subnet(subnet.split('/')[-1], args.region)['ipCidrRange']) + available_subnets = list(set(pre_defined_subnet_list) - set(existed_subnet_list)) + if not available_subnets: + print("There is no available subnet to create. Aborting...") + sys.exit(1) else: - dlab_subnet_cidr = '{0}/{1}'.format(ipaddress.ip_address(last_ip + 1), args.prefix) + dlab_subnet_cidr = available_subnets[0] if args.subnet_name != '': if GCPMeta().get_subnet(args.subnet_name, args.region): diff --git a/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py b/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py index 02b5561..b7f7833 100644 --- a/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py +++ b/infrastructure-provisioning/src/general/scripts/gcp/project_prepare.py @@ -100,6 +100,10 @@ if __name__ == "__main__": "endpoint_tag": project_conf['endpoint_tag'], "product": "dlab"} project_conf['allowed_ip_cidr'] = os.environ['conf_allowed_ip_cidr'] + if 'conf_user_subnets_range' in os.environ: + project_conf['user_subnets_range'] = os.environ['conf_user_subnets_range'] + else: + project_conf['user_subnets_range'] = '' # FUSE in case of absence of user's key try: @@ -119,9 +123,10 @@ if __name__ == "__main__": try: logging.info('[CREATE SUBNET]') print('[CREATE SUBNET]') - params = "--subnet_name {} --region {} --vpc_selflink {} --prefix {} --vpc_cidr {}" \ + params = "--subnet_name {} --region {} --vpc_selflink {} --prefix {} --vpc_cidr {} --user_subnets_range '{}'" \ .format(project_conf['private_subnet_name'], project_conf['region'], project_conf['vpc_selflink'], - project_conf['private_subnet_prefix'], project_conf['vpc_cidr']) + project_conf['private_subnet_prefix'], project_conf['vpc_cidr'], + project_conf['user_subnets_range']) try: local("~/scripts/{}.py {}".format('common_create_subnet', params)) project_conf['private_subnet_cidr'] = GCPMeta().get_subnet(project_conf['private_subnet_name'], --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@dlab.apache.org For additional commands, e-mail: commits-h...@dlab.apache.org