You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by om...@apache.org on 2020/01/30 13:21:38 UTC

[incubator-dlab] 01/01: [DLAB-1493]: Added users_subnet_range functionality to GCP

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 <Ol...@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-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org