Add new public_ip.

		Specify one or more ports using a list of dicts with the following keys:

			protocol - TCP, UDP, or ICMP
			port - int 0-65534
			port_to - (optional) if specifying a range of ports then the rqange end.  int 0-65534

		Optionally specify one or more source restrictions using a list of dicts with the following keys:

			cidr - string with CIDR notation for the subnet (e.g. "132.200.20.0/24")

		private_ip is the existing private IP address to NAT to (optional)

		# New public IP with single port
		>>> p = clc.v2.Server(alias='BTDI',id='WA1BTDIX03').PublicIPs()
		>>> p.Add(ports=[{"protocol": "TCP","port":5}]).WaitUntilComplete()
		0

		# New public IP with port range
		>>> p.Add([{"protocol": "UDP","port":10,"port_to":50}]).WaitUntilComplete()
		0

		# Map existing private IP to single port
		>>> p.Add(ports=[{"protocol": "TCP","port":22}],k
		          source_restrictions=[{'cidr': "132.200.20.0/24"}],
				  private_ip="10.80.148.13").WaitUntilComplete()
		0

		* Note this API is subject to revision to make ports and source restrictions access to parallel
		  that used for accessors.

		* public_ips.public_ips will not be updated to reflect this addition. Recreate object after request completes
		  to access new info including getting the IP itself

def Add(self,ports,source_restrictions=None,private_ip=None):
		"""Add new public_ip.

		Specify one or more ports using a list of dicts with the following keys:

			protocol - TCP, UDP, or ICMP
			port - int 0-65534
			port_to - (optional) if specifying a range of ports then the rqange end.  int 0-65534

		Optionally specify one or more source restrictions using a list of dicts with the following keys:

			cidr - string with CIDR notation for the subnet (e.g. "132.200.20.0/24")

		private_ip is the existing private IP address to NAT to (optional)

		# New public IP with single port
		>>> p = clc.v2.Server(alias='BTDI',id='WA1BTDIX03').PublicIPs()
		>>> p.Add(ports=[{"protocol": "TCP","port":5}]).WaitUntilComplete()
		0

		# New public IP with port range
		>>> p.Add([{"protocol": "UDP","port":10,"port_to":50}]).WaitUntilComplete()
		0

		# Map existing private IP to single port
		>>> p.Add(ports=[{"protocol": "TCP","port":22}],k
		          source_restrictions=[{'cidr': "132.200.20.0/24"}],
				  private_ip="10.80.148.13").WaitUntilComplete()
		0

		* Note this API is subject to revision to make ports and source restrictions access to parallel
		  that used for accessors.

		* public_ips.public_ips will not be updated to reflect this addition. Recreate object after request completes
		  to access new info including getting the IP itself

		"""

		payload = {'ports': []}
		for port in ports:
			if 'port_to' in port:  payload['ports'].append({'protocol':port['protocol'], 'port':port['port'], 'portTo':port['port_to']})
			else:  payload['ports'].append({'protocol':port['protocol'], 'port':port['port']})
		if source_restrictions:  payload['sourceRestrictions'] = source_restrictions
		if private_ip:  payload['internalIPAddress'] = private_ip

		return(clc.v2.Requests(clc.v2.API.Call('POST','servers/%s/%s/publicIPAddresses' % (self.server.alias,self.server.id),
		                                       json.dumps(payload),session=self.session),
		                       alias=self.server.alias,session=self.session))