Add DNS nameservers to networks
This commit is contained in:
		| @@ -516,14 +516,14 @@ def net_list(limit=None): | ||||
|     pvc_common.stopZKConnection(zk_conn) | ||||
|     return flask.jsonify(retdata), retcode | ||||
|  | ||||
| def net_add(vni, description, nettype, domain, | ||||
| def net_add(vni, description, nettype, domain, name_servers, | ||||
|             ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|             dhcp4_flag, dhcp4_start, dhcp4_end): | ||||
|     """ | ||||
|     Add a virtual client network to the PVC cluster. | ||||
|     """ | ||||
|     zk_conn = pvc_common.startZKConnection(config['coordinators']) | ||||
|     retflag, retdata = pvc_network.add_network(zk_conn, vni, description, nettype, domain, | ||||
|     retflag, retdata = pvc_network.add_network(zk_conn, vni, description, nettype, domain, name_servers, | ||||
|                                               ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|                                               dhcp4_flag, dhcp4_start, dhcp4_end) | ||||
|     if retflag: | ||||
| @@ -537,7 +537,7 @@ def net_add(vni, description, nettype, domain, | ||||
|     } | ||||
|     return flask.jsonify(output), retcode | ||||
|  | ||||
| def net_modify(vni, description, domain, | ||||
| def net_modify(vni, description, domain, name_servers, | ||||
|                ip4_network, ip4_gateway, | ||||
|                ip6_network, ip6_gateway, | ||||
|                dhcp4_flag, dhcp4_start, dhcp4_end): | ||||
| @@ -545,7 +545,7 @@ def net_modify(vni, description, domain, | ||||
|     Modify a virtual client network in the PVC cluster. | ||||
|     """ | ||||
|     zk_conn = pvc_common.startZKConnection(config['coordinators']) | ||||
|     retflag, retdata = pvc_network.modify_network(zk_conn, vni, description, domain, | ||||
|     retflag, retdata = pvc_network.modify_network(zk_conn, vni, description, domain, name_servers, | ||||
|                                               ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|                                               dhcp4_flag, dhcp4_start, dhcp4_end) | ||||
|     if retflag: | ||||
|   | ||||
| @@ -413,6 +413,12 @@ def api_net_root(): | ||||
|         else: | ||||
|             domain = None | ||||
|  | ||||
|         # Get network name servers | ||||
|         if 'name_server' in flask.request.values: | ||||
|             name_servers = flask.request.values.getlist('name_server') | ||||
|         else: | ||||
|             name_servers = None | ||||
|  | ||||
|         # Get ipv4 network | ||||
|         if 'ip4_network' in flask.request.values: | ||||
|             ip4_network = flask.request.values['ip4_network'] | ||||
| @@ -455,7 +461,7 @@ def api_net_root(): | ||||
|         else: | ||||
|             dhcp4_end = None | ||||
|  | ||||
|         return pvcapi.net_add(vni, description, nettype, domain, | ||||
|         return pvcapi.net_add(vni, description, nettype, domain, name_servers, | ||||
|                               ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|                               dhcp4_flag, dhcp4_start, dhcp4_end) | ||||
|  | ||||
| @@ -479,6 +485,12 @@ def api_net_element(network): | ||||
|         else: | ||||
|             domain = None | ||||
|  | ||||
|         # Get network name servers | ||||
|         if 'name_server' in flask.request.values: | ||||
|             name_servers = flask.request.values.getlist('name_server') | ||||
|         else: | ||||
|             name_servers = None | ||||
|  | ||||
|         # Get ipv4 network | ||||
|         if 'ip4_network' in flask.request.values: | ||||
|             ip4_network = flask.request.values['ip4_network'] | ||||
| @@ -521,7 +533,7 @@ def api_net_element(network): | ||||
|         else: | ||||
|             dhcp4_end = None | ||||
|  | ||||
|         return pvcapi.net_modify(network, description, domain, | ||||
|         return pvcapi.net_modify(network, description, domain, name_servers, | ||||
|                                  ip4_network, ip4_gateway, | ||||
|                                  ip6_network, ip6_gateway, | ||||
|                                  dhcp4_flag, dhcp4_start, dhcp4_end) | ||||
|   | ||||
| @@ -727,6 +727,11 @@ def cli_network(): | ||||
|     default=None, | ||||
|     help='Domain name of the network.' | ||||
| ) | ||||
| @click.option( | ||||
|     '--dns-server', 'name_servers', | ||||
|     multiple=True, | ||||
|     help='DNS nameserver for network' | ||||
| ) | ||||
| @click.option( | ||||
|     '-i', '--ipnet', 'ip_network', | ||||
|     default=None, | ||||
| @@ -766,7 +771,7 @@ def cli_network(): | ||||
| @click.argument( | ||||
|     'vni' | ||||
| ) | ||||
| def net_add(vni, description, nettype, domain, ip_network, ip_gateway, ip6_network, ip6_gateway, dhcp_flag, dhcp_start, dhcp_end): | ||||
| def net_add(vni, description, nettype, domain, ip_network, ip_gateway, ip6_network, ip6_gateway, dhcp_flag, dhcp_start, dhcp_end, name_servers): | ||||
|     """ | ||||
|     Add a new virtual network with VXLAN identifier VNI to the cluster. | ||||
|  | ||||
| @@ -788,7 +793,7 @@ def net_add(vni, description, nettype, domain, ip_network, ip_gateway, ip6_netwo | ||||
|         exit(1) | ||||
|  | ||||
|     zk_conn = pvc_common.startZKConnection(zk_host) | ||||
|     retcode, retmsg = pvc_network.add_network(zk_conn, vni, description, nettype, domain, ip_network, ip_gateway, ip6_network, ip6_gateway, dhcp_flag, dhcp_start, dhcp_end) | ||||
|     retcode, retmsg = pvc_network.add_network(zk_conn, vni, description, nettype, domain, name_servers, ip_network, ip_gateway, ip6_network, ip6_gateway, dhcp_flag, dhcp_start, dhcp_end) | ||||
|     cleanup(retcode, retmsg, zk_conn) | ||||
|  | ||||
| ############################################################################### | ||||
| @@ -805,6 +810,11 @@ def net_add(vni, description, nettype, domain, ip_network, ip_gateway, ip6_netwo | ||||
|     default=None, | ||||
|     help='Domain name of the network.' | ||||
| ) | ||||
| @click.option( | ||||
|     '--dns-server', 'name_servers', | ||||
|     multiple=True, | ||||
|     help='DNS nameserver for network' | ||||
| ) | ||||
| @click.option( | ||||
|     '-i', '--ipnet', 'ip4_network', | ||||
|     default=None, | ||||
| @@ -844,7 +854,7 @@ def net_add(vni, description, nettype, domain, ip_network, ip_gateway, ip6_netwo | ||||
| @click.argument( | ||||
|     'vni' | ||||
| ) | ||||
| def net_modify(vni, description, domain, ip6_network, ip6_gateway, ip4_network, ip4_gateway, dhcp_flag, dhcp_start, dhcp_end): | ||||
| def net_modify(vni, description, domain, name_servers, ip6_network, ip6_gateway, ip4_network, ip4_gateway, dhcp_flag, dhcp_start, dhcp_end): | ||||
|     """ | ||||
|     Modify details of virtual network VNI. All fields optional; only specified fields will be updated. | ||||
|  | ||||
| @@ -853,7 +863,7 @@ def net_modify(vni, description, domain, ip6_network, ip6_gateway, ip4_network, | ||||
|     """ | ||||
|  | ||||
|     zk_conn = pvc_common.startZKConnection(zk_host) | ||||
|     retcode, retmsg = pvc_network.modify_network(zk_conn, vni, description=description, domain=domain, ip6_network=ip6_network, ip6_gateway=ip6_gateway, ip4_network=ip4_network, ip4_gateway=ip4_gateway, dhcp_flag=dhcp_flag, dhcp_start=dhcp_start, dhcp_end=dhcp_end) | ||||
|     retcode, retmsg = pvc_network.modify_network(zk_conn, vni, description=description, domain=domain, name_servers=name_servers, ip6_network=ip6_network, ip6_gateway=ip6_gateway, ip4_network=ip4_network, ip4_gateway=ip4_gateway, dhcp_flag=dhcp_flag, dhcp_start=dhcp_start, dhcp_end=dhcp_end) | ||||
|     cleanup(retcode, retmsg, zk_conn) | ||||
|  | ||||
| ############################################################################### | ||||
|   | ||||
| @@ -134,6 +134,7 @@ def getNetworkInformation(zk_conn, vni): | ||||
|     description = zkhandler.readdata(zk_conn, '/networks/{}'.format(vni)) | ||||
|     nettype = zkhandler.readdata(zk_conn, '/networks/{}/nettype'.format(vni)) | ||||
|     domain = zkhandler.readdata(zk_conn, '/networks/{}/domain'.format(vni)) | ||||
|     name_servers = zkhandler.readdata(zk_conn, '/networks/{}/name_servers'.format(vni)) | ||||
|     ip6_network = zkhandler.readdata(zk_conn, '/networks/{}/ip6_network'.format(vni)) | ||||
|     ip6_gateway = zkhandler.readdata(zk_conn, '/networks/{}/ip6_gateway'.format(vni)) | ||||
|     dhcp6_flag = zkhandler.readdata(zk_conn, '/networks/{}/dhcp6_flag'.format(vni)) | ||||
| @@ -149,6 +150,7 @@ def getNetworkInformation(zk_conn, vni): | ||||
|         'description': description, | ||||
|         'type': nettype, | ||||
|         'domain': domain, | ||||
|         'name_servers': name_servers.split(','), | ||||
|         'ip6': { | ||||
|             'network': ip6_network, | ||||
|             'gateway': ip6_gateway, | ||||
| @@ -223,7 +225,7 @@ def isValidIP(ipaddr): | ||||
| # Direct functions | ||||
| # | ||||
| def add_network(zk_conn, vni, description, nettype, | ||||
|                 domain, ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|                 domain, name_servers, ip4_network, ip4_gateway, ip6_network, ip6_gateway, | ||||
|                 dhcp4_flag, dhcp4_start, dhcp4_end): | ||||
|     # Ensure start and end DHCP ranges are set if the flag is set | ||||
|     if dhcp4_flag and ( not dhcp4_start or not dhcp4_end ): | ||||
| @@ -254,6 +256,7 @@ def add_network(zk_conn, vni, description, nettype, | ||||
|         '/networks/{}'.format(vni): description, | ||||
|         '/networks/{}/nettype'.format(vni): nettype, | ||||
|         '/networks/{}/domain'.format(vni): domain, | ||||
|         '/networks/{}/name_servers'.format(vni): ','.join(name_servers), | ||||
|         '/networks/{}/ip6_network'.format(vni): ip6_network, | ||||
|         '/networks/{}/ip6_gateway'.format(vni): ip6_gateway, | ||||
|         '/networks/{}/dhcp6_flag'.format(vni): dhcp6_flag, | ||||
| @@ -278,6 +281,8 @@ def modify_network(zk_conn, vni, **parameters): | ||||
|         zk_data.update({'/networks/{}'.format(vni): parameters['description']}) | ||||
|     if parameters['domain']: | ||||
|         zk_data.update({'/networks/{}/domain'.format(vni): parameters['domain']}) | ||||
|     if parameters['name_servers']: | ||||
|         zk_data.update({'/networks/{}/name_servers'.format(vni): ','.join(parameters['name_servers'])}) | ||||
|     if parameters['ip4_network']: | ||||
|         zk_data.update({'/networks/{}/ip4_network'.format(vni): parameters['ip4_network']}) | ||||
|     if parameters['ip4_gateway']: | ||||
| @@ -644,6 +649,7 @@ def format_info(network_information, long_output): | ||||
|     ainformation.append('{}Description:{}    {}'.format(ansiprint.purple(), ansiprint.end(), network_information['description'])) | ||||
|     if network_information['type'] == 'managed': | ||||
|         ainformation.append('{}Domain:{}         {}'.format(ansiprint.purple(), ansiprint.end(), network_information['domain'])) | ||||
|         ainformation.append('{}DNS Servers:{}    {}'.format(ansiprint.purple(), ansiprint.end(), ', '.join(network_information['name_servers']))) | ||||
|         if network_information['ip6']['network'] != "None": | ||||
|             ainformation.append('') | ||||
|             ainformation.append('{}IPv6 network:{}   {}'.format(ansiprint.purple(), ansiprint.end(), network_information['ip6']['network'])) | ||||
|   | ||||
| @@ -222,7 +222,11 @@ class DNSNetworkInstance(object): | ||||
|                 (domain_id, network_domain, 'nsX.{d} root.{d} 1 10800 1800 86400 86400'.format(d=self.config['upstream_domain']), 'SOA', 86400, 0) | ||||
|             ) | ||||
|  | ||||
|             ns_servers = ['pvc-ns.{}'.format(self.config['upstream_domain'])] | ||||
|             if self.network.name_servers: | ||||
|                 ns_servers = self.network.name_servers | ||||
|             else: | ||||
|                 ns_servers = ['pvc-dns.{}'.format(self.config['upstream_domain'])] | ||||
|  | ||||
|             for ns_server in ns_servers: | ||||
|                 sql_curs.execute( | ||||
|                     """ | ||||
|   | ||||
| @@ -90,6 +90,7 @@ class VXNetworkInstance(object): | ||||
|         self.old_description = None | ||||
|         self.description = None | ||||
|         self.domain = None | ||||
|         self.name_servers = None | ||||
|         self.ip6_gateway = zkhandler.readdata(self.zk_conn, '/networks/{}/ip6_gateway'.format(self.vni)) | ||||
|         self.ip6_network = zkhandler.readdata(self.zk_conn, '/networks/{}/ip6_network'.format(self.vni)) | ||||
|         self.ip6_cidrnetmask = zkhandler.readdata(self.zk_conn, '/networks/{}/ip6_network'.format(self.vni)).split('/')[-1] | ||||
| @@ -180,6 +181,17 @@ add rule inet filter forward ip6 saddr {netaddr6} counter jump {vxlannic}-out | ||||
|                 domain = data.decode('ascii') | ||||
|                 self.domain = domain | ||||
|  | ||||
|         @self.zk_conn.DataWatch('/networks/{}/name_servers'.format(self.vni)) | ||||
|         def watch_network_name_servers(data, stat, event=''): | ||||
|             if event and event.type == 'DELETED': | ||||
|                 # The key has been deleted after existing before; terminate this watcher | ||||
|                 # because this class instance is about to be reaped in Daemon.py | ||||
|                 return False | ||||
|  | ||||
|             if data and self.name_servers != data.decode('ascii'): | ||||
|                 name_servers = data.decode('ascii').split(',') | ||||
|                 self.name_servers = name_servers | ||||
|  | ||||
|         @self.zk_conn.DataWatch('/networks/{}/ip6_network'.format(self.vni)) | ||||
|         def watch_network_ip6_network(data, stat, event=''): | ||||
|             if event and event.type == 'DELETED': | ||||
|   | ||||
		Reference in New Issue
	
	Block a user