Creating virtual machines
POST /servers
Create a virtual machine.
The progress of this operation depends on the location of the requested image, network I/O, host load, selected flavor, and other factors.
To check the progress of the request, make a GET /servers/{id}
request. This call returns a progress attribute, which is a percentage
value from 0 to 100.
When you create a server, the response shows only the server ID, its
links, and the admin password. You can get additional attributes
through subsequent GET
requests on the server.
Include the block_device_mapping_v2
parameter in the create
request body to boot a server from a volume.
Include the key_name
parameter in the create request body to add a
key pair to the server when you create it. Creating key pairs is described in Creating and importing SSH keys.
Starting with the microversion 2.37, the networks
field is required.
Preconditions:
- The user must have sufficient server quota to create the number of servers requested.
- The connection to the image service must be valid.
Asynchronous postconditions:
- With correct permissions, you can see the server status as
ACTIVE
through API calls. - With correct access, you can see the created server in the compute node that OpenStack Compute manages.
Troubleshooting:
- If the server status remains
BUILDING
or shows another error status, the request failed. Ensure you meet the preconditions then investigate the compute node. - The server is not created in the compute node that OpenStack Compute manages.
- The compute node needs enough free resource to match the resource of the server creation request.
- Ensure that the scheduler selection filter can fulfill the request with the available compute nodes that match the selection criteria of the filter.
Source: https://docs.openstack.org/api-ref/compute/?expanded=create-server-detail#create-server
Request
Parameters
Name | In | Type | Description |
---|---|---|---|
server
|
body | object | A server object. |
flavorRef
|
body | string | The flavor reference, as an ID (including a UUID) or full URL, for the flavor for your server instance. |
name
|
body | string | The server name. |
networks
|
body | array |
A list of If multiple networks are defined, the order in which they appear in the
guest operating system will not necessarily reflect the order in which they
are given in the server boot request. Guests should therefore not depend
on device order to deduce any information about their network devices.
Instead, device role tags should be used: introduced in 2.32, broken in
2.37, and re-introduced and fixed in 2.42, the A bug has caused the Starting with microversion 2.37, this field is required and the special
string values |
networks.uuid (Optional) |
body | string |
To provision the server instance with a NIC for a network, specify the UUID of
the network in the Starting with microversion 2.37, this value is strictly enforced to be in UUID format. |
networks.port (Optional) |
body | string | To provision the server instance with a NIC for an already existing port,
specify the port-id in the port attribute in a networks object.
The port status must be DOWN . Required if you omit the uuid
attribute. Requested security groups are not applied to pre-existing ports. |
networks.fixed_ips (Optional) |
body | array | Fixed IP addresses. If you request a specific fixed IP address without
a network’s uuid or net_id , the request returns a Bad Request (400)
response code. |
networks.ip_address (Optional) |
body | string | The IP address. |
networks.ip_version (Optional) |
body | integer | The IP protocol version. Valid value is 4 or
6 . Default is 4 . |
networks.port_security_enabled
|
body | boolean |
The port security status of the network. Valid values are
enabled ( New in version 2.42 |
networks.security_groups
|
body | array |
The IDs of security groups applied to the port. New in version 2.67 |
networks.tag (Optional) |
body | string |
A device role tag that can be applied to a network interface. The guest OS of a server that has devices tagged in this manner can access hardware metadata about the tagged devices from the metadata API and on the config drive, if enabled. Due to a bug, network interface tags are accepted between 2.32 and 2.36 inclusively, and subsequently starting with version 2.42. New in version 2.32 |
accessIPv4 (Optional) |
body | string | IPv4 address that should be used to access this server. |
accessIPv6 (Optional) |
body | string | IPv6 address that should be used to access this server. |
adminPass (Optional) |
body | string | The administrative password of the server. If you omit this parameter, the operation generates a new password. |
availability_zone (Optional) |
body | string |
The availability zone from which to launch the server. When you provision resources, you specify from which availability zone you want your instance to be built. Typically, an admin user will use availability zones to arrange OpenStack compute hosts into logical groups. An availability zone provides a form of physical isolation and redundancy from other availability zones. For instance, if some racks in your data center are on a separate power source, you can put servers in those racks in their own availability zone. Availability zones can also help separate different classes of hardware. By segregating resources into availability zones, you can ensure that your application resources are spread across disparate machines to achieve high availability in the event of hardware or other failure. See Availability Zones (AZs) for more information. You can list the available availability zones by calling the
|
block_device_mapping_v2 (Optional) |
body | array |
Enables fine grained control of the block device mapping for an instance. This is typically used for booting servers from volumes. An example format would look as follows: "block_device_mapping_v2": [{ "boot_index": "0", "uuid": "ac408821-c95a-448f-9292-73986c790911", "source_type": "image", "volume_size": "25", "destination_type": "volume", "delete_on_termination": true, "tag": "disk1", "disk_bus": "scsi"}] In microversion 2.32, A bug has caused the |
block_device_mapping_v2.boot_index
|
body | integer | Defines the order in which a hypervisor tries devices when it attempts to boot
the guest from storage. Give each device a unique boot index starting from 0 .
To disable a device from booting, set the boot index to a negative value or use
the default boot index value, which is None . The simplest usage is, set the
boot index of the boot device to 0 and use the default boot index value, None ,
for any other devices. Some hypervisors might not support booting from multiple
devices; these hypervisors consider only the device with a boot index of 0 . Some
hypervisors support booting from multiple devices but only if the devices are
of different types. For example, a disk and CD-ROM. |
block_device_mapping_v2.delete_on_termination (Optional) |
body | boolean | To delete the boot volume when the server is destroyed, specify true .
Otherwise, specify false . Default: false |
block_device_mapping_v2.destination_type (Optional) |
body | string |
Defines where the block device mapping will reside. Valid values are:
|
block_device_mapping_v2.device_name (Optional) |
body | string | A path to the device for the volume that you want to use to boot the server. Note that as of the 12.0.0 Liberty release, the Nova libvirt driver no longer honors a user-supplied device name. This is the same behavior as if the device name parameter is not supplied on the request. |
block_device_mapping_v2.device_type (Optional) |
body | string | The device type. For example, disk , cdrom . |
block_device_mapping_v2.disk_bus (Optional) |
body | string | Disk bus type, some hypervisors (currently only libvirt) support
specify this parameter. Some example disk_bus values can be: fdc ,
ide , sata , scsi , usb , virtio , xen , lxc
and uml . Support for each bus type depends on the virtualization driver
and underlying hypervisor. |
block_device_mapping_v2.guest_format (Optional) |
body | string |
Specifies the guest server disk file system format, such as Swap block device mappings have the following restrictions:
|
block_device_mapping_v2.no_device (Optional) |
body | boolean | It is no device if True . |
block_device_mapping_v2.source_type (Optional) |
body | string |
The source type of the block device. Valid values are:
This parameter is required unless See Block Device Mapping in Nova for more details on valid source and destination types. |
block_device_mapping_v2.uuid (Optional) |
body | string | This is the uuid of source resource. The uuid points to different resources
based on the source_type . For example, if source_type is image ,
the block device is created based on the specified image which is retrieved
from the image service. Similarly, if source_type is snapshot then
the uuid refers to a volume snapshot in the block storage service. If
source_type is volume then the uuid refers to a volume in the block
storage service. |
block_device_mapping_v2.volume_size (Optional) |
body | integer |
The size of the volume (in GiB). This is integer value from range 1 to 2147483647 which can be requested as integer and string. This parameter must be specified in the following cases:
|
block_device_mapping_v2.tag (Optional) |
body | string |
A device role tag that can be applied to a block device. The guest OS of a server that has devices tagged in this manner can access hardware metadata about the tagged devices from the metadata API and on the config drive, if enabled. Due to a bug, block device tags are accepted in version 2.32 and subsequently starting with version 2.42. New in version 2.32 |
block_device_mapping_v2.volume_type (Optional) |
body | string |
The device
New in version 2.67 |
config_drive (Optional) |
body | boolean | Indicates whether a config drive enables metadata injection. The config_drive
setting provides information about a drive that the instance can mount at boot
time. The instance reads files from the drive to get information that is normally
available through the metadata service. This metadata is different from the user
data. Not all cloud providers enable the config_drive . Read more in the
OpenStack End User Guide. |
imageRef (Optional) |
body | string | The UUID of the image to use for your server instance. This is not required in case of boot from volume. In all other cases it is required and must be a valid UUID otherwise API will return 400. |
key_name (Optional) |
body | string |
Key pair name. The |
metadata (Optional) |
body | object | Metadata key and value pairs. The maximum size of the metadata key and value is 255 bytes each. |
OS-DCF:diskConfig (Optional) |
body | string |
Controls how the API partitions the disk when you create, rebuild, or resize servers.
A server inherits the
|
personality (Optional) |
body | array |
The file path and contents, text only, to inject into the server at launch. The maximum size of the file path data is 255 bytes. The maximum limit is the number of allowed bytes in the decoded, rather than encoded, data. Available until version 2.56 |
user_data (Optional) |
body | string |
Configuration information or scripts to use upon launch. Must be Base64 encoded. Restricted to 65535 bytes. The |
description (Optional) |
body | string |
A free form description of the server. Limited to 255 characters in length. Before microversion 2.19 this was set to the server name. New in version 2.19 |
tags (Optional) |
body | array |
A list of tags. Tags have the following restrictions:
New in version 2.52 |
trusted_image_certificates (Optional) |
body | array |
A list of trusted certificate IDs, which are used during image signature verification to verify the signing certificate. The list is restricted to a maximum of 50 IDs. This parameter is optional in server create requests if allowed by policy, and is not supported for volume-backed instances. New in version 2.63 |
host (Optional) |
body | string |
The name of the compute service host on which the server is to be created. The API will return 400 if no compute services are found with the given host name. By default, it can be specified by administrators only. New in version 2.74 |
hypervisor_hostname (Optional) |
body | string |
The hostname of the hypervisor on which the server is to be created. The API will return 400 if no hypervisors are found with the given hostname. By default, it can be specified by administrators only. New in version 2.74 |
os:scheduler_hints (Optional) |
body | object |
The dictionary of data to send to the scheduler. Alternatively, you can specify
This is a top-level key in the request body, not part of the
There are a few caveats with scheduler hints:
For these reasons, it is important to consult each cloud’s user documentation to know what is available for scheduler hints. |
os:scheduler_hints.build_near_host_ip (Optional) |
body | string | Schedule the server on a host in the network specified with this parameter
and a CIDR (os:scheduler_hints.cidr ).
It is available when SimpleCIDRAffinityFilter is available
on cloud side. |
os:scheduler_hints.cidr (Optional) |
body | string | Schedule the server on a host in the network specified with an IP address
(os:scheduler_hints:build_near_host_ip ) and this parameter.
If os:scheduler_hints:build_near_host_ip is specified and
this paramete is omitted, /24 is used.
It is available when SimpleCIDRAffinityFilter is available
on cloud side. |
os:scheduler_hints.different_cell (Optional) |
body | array | A list of cell routes or a cell route (string).
Schedule the server in a cell that is not specified.
It is available when DifferentCellFilter is available on cloud side
that is cell v1 environment. |
os:scheduler_hints.different_host (Optional) |
body | array | A list of server UUIDs or a server UUID.
Schedule the server on a different host from a set of servers.
It is available when DifferentHostFilter is available on cloud side. |
os:scheduler_hints.group (Optional) |
body | string | The server group UUID. Schedule the server according to a policy of
the server group (anti-affinity , affinity , soft-anti-affinity
or soft-affinity ).
It is available when ServerGroupAffinityFilter ,
ServerGroupAntiAffinityFilter , ServerGroupSoftAntiAffinityWeigher ,
ServerGroupSoftAffinityWeigher are available on cloud side. |
os:scheduler_hints.query (Optional) |
body | string |
Schedule the server by using a custom filter in JSON format. For example: "query": "[\">=\",\"$free_ram_mb\",1024]" It is available when |
os:scheduler_hints.same_host (Optional) |
body | array | A list of server UUIDs or a server UUID.
Schedule the server on the same host as another server in a set of
servers.
It is available when SameHostFilter is available on cloud side. |
os:scheduler_hints.target_cell (Optional) |
body | string | A target cell name. Schedule the server in a host in the cell specified.
It is available when TargetCellFilter is available on cloud side
that is cell v1 environment. |
Example
Create a VM with the specified flavor, from the specified image. Create two NICs in the specified networks, assign one IP address manually and the other one automatically from the IPv4 subnet. The placement will be inherited from the image.
# curl -ks -H 'Content-Type: application/json' -H 'X-OpenStack-Nova-API-Version: 2.67' -H 'X-Auth-Token: gAAAAA<...>' -d ' { "server": { "name": "vm2", "flavorRef": "100", "networks": [ { "uuid": "0bb6b7a7-da8d-432c-b8d5-12139f7924d1", "fixed_ips": [{"ip_address": "192.168.128.10"}], "port_security_enabled": true, "security_groups": ["5c2f26d9-c599-41db-b67b-b47811b58e28"] }, { "uuid": "17062703-8551-46e3-bf37-5509d9f93462", "fixed_ips": [{"ip_version": 4}], "port_security_enabled": true, "security_groups": ["5c2f26d9-c599-41db-b67b-b47811b58e28"] } ], "block_device_mapping_v2": [ { "boot_index": "0", "uuid": "c92d820c-50dc-4fd1-a0bc-2f1071487b67", "source_type": "image", "volume_size": "1", "destination_type": "volume", "delete_on_termination": true } ] } }' https://<node_IP_addr>:8774/v2.1/f5d834d636c642c7bfe8af86139c6f26/servers
Response
Parameters
Name | In | Type | Description |
---|---|---|---|
Location
|
header | string | The location URL of the server, HTTP header “Location: <server location URL>” will be returned. |
server
|
body | object | A server object. |
id
|
body | string | The UUID of the server. |
links
|
body | array | Links to the resources in question. See API Guide / Links and References for more info. |
adminPass (Optional) |
body | string | The administrative password for the server. If you set enable_instance_password configuration
option to False , the API wouldn’t return the adminPass field in response. |
security_groups
|
body | array | One or more security groups objects. |
security_groups.name
|
body | string |
The security group name. |
OS-DCF:diskConfig
|
body | string |
Disk configuration. The value is either:
|
Status codes
Success
Code | Reason |
---|---|
202 - Accepted
|
Request was accepted for processing, but the processing has not been completed. A ‘location’ header is included in the response which contains a link to check the progress of the request. |
Error
Code | Reason |
---|---|
400 - Bad Request
|
Some content in the request was invalid. |
401 - Unauthorized
|
User must authenticate before making a request. |
403 - Forbidden
|
Policy does not allow current user to do this operation. |
404 - Not Found
|
The requested resource could not be found. |
409 - Conflict
|
This operation conflicted with another operation on this resource. |
Example
{ "server": { "security_groups": [ { "name": "default" } ], "OS-DCF:diskConfig": "MANUAL", "id": "c3f154f1-c656-49b4-a6c0-4dd1e088817c", "links": [ { "href": "https://<node_IP_addr>:8774/v2.1/f5d834d636c642c7bfe8af86139c6f26/servers/c3f154f1-c656-49b4-a6c0-4dd1e088817c", "rel": "self" }, { "href": "https://<node_IP_addr>:8774/f5d834d636c642c7bfe8af86139c6f26/servers/c3f154f1-c656-49b4-a6c0-4dd1e088817c", "rel": "bookmark" } ], "adminPass": "54e8z6YWPoEp" } }