docs: def Create(name,template,group_id,network_id,cpu=None,memory=None,alias=None,password=None,ip_address=None,
  	           storage_type="standard",type="standard",primary_dns=None,secondary_dns=None,
  			   additional_disks=[],custom_fields=[],ttl=None,managed_os=False,description=None,
  			   source_server_password=None,cpu_autoscale_policy_id=None,anti_affinity_policy_id=None,
  			   packages=[],configuration_id=None,session=None):
  		"""Creates a new server.
  
  		https://www.centurylinkcloud.com/api-docs/v2/#servers-create-server
  
  		cpu and memory are optional and if not provided we pull from the default server size values associated with
  		the provided group_id.
  
  		Set ttl as number of seconds before server is to be terminated.  Must be >3600
  
  		>>> d = clc.v2.Datacenter()
  		>>> clc.v2.Server.Create(name="api2",cpu=1,memory=1,
  		                         group_id=d.Groups().Get("Default Group").id,
  	                             template=d.Templates().Search("centos-6-64")[0].id,
  						         network_id=d.Networks().networks[0].id).WaitUntilComplete()
  		0
  
  		"""
  
  		if not alias:  alias = clc.v2.Account.GetAlias(session=session)
  		if not description:  description = name
  
  		if type.lower() != "baremetal":
  			if not cpu or not memory:
  				group = clc.v2.Group(id=group_id,alias=alias,session=session)
  
  			if not cpu and group.Defaults("cpu"):
  				cpu = group.Defaults("cpu")
  			elif not cpu:
  				raise(clc.CLCException("No default CPU defined"))
  
  			if not memory and group.Defaults("memory"):
  				memory = group.Defaults("memory")
  			elif not memory:
  				raise(clc.CLCException("No default Memory defined"))
  
  		if type.lower() == "standard" and storage_type.lower() not in ("standard","premium"):
  			raise(clc.CLCException("Invalid type/storage_type combo"))
  		if type.lower() == "hyperscale" and storage_type.lower() != "hyperscale":
  			raise(clc.CLCException("Invalid type/storage_type combo"))
  		if type.lower() == "baremetal":
  			type = "bareMetal"
  
  		if ttl and ttl<=3600: raise(clc.CLCException("ttl must be greater than 3600 seconds"))
  
  		if ttl: ttl = clc.v2.time_utils.SecondsToZuluTS(int(time.time())+ttl)
  
  		# TODO - validate custom_fields as a list of dicts with an id and a value key
  		# TODO - validate template exists
  		# TODO - validate additional_disks as a list of dicts with a path, sizeGB, and type (partitioned,raw) keys
  		# TODO - validate addition_disks path not in template reserved paths
  		# TODO - validate antiaffinity policy id set only with type=hyperscale
  
  		payload = {
  			'name': name, 'description': description, 'groupId': group_id, 'primaryDNS': primary_dns, 'secondaryDNS': secondary_dns,
  			'networkId': network_id, 'password': password, 'type': type, 'customFields': custom_fields
  		}
  
  		if type == 'bareMetal':
  			payload.update({'configurationId': configuration_id, 'osType': template})
  		else:
  			payload.update({'sourceServerId': template, 'isManagedOS': managed_os, 'ipAddress': ip_address,
  				'sourceServerPassword': source_server_password, 'cpu': cpu, 'cpuAutoscalePolicyId': cpu_autoscale_policy_id,
  				'memoryGB': memory, 'storageType': storage_type, 'antiAffinityPolicyId': anti_affinity_policy_id,
  				'additionalDisks': additional_disks, 'ttl': ttl, 'packages': packages})
  
  		return clc.v2.Requests(clc.v2.API.Call('POST','servers/%s' % (alias), json.dumps(payload), session=session),
  							   alias=alias,
  							   session=session)