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):
		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)
		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)