Hybrid

Destination availability

Since 7.1.0
GET/servers/{serverId}/migrate/hybrid/destinations/{destinationId}

Resource, storage and networking detail for one destination, plus ready-to-send start bodies.

Request

Authorization
Provide your bearer token in the Authorization header when making requests to protected resources.
Example: Authorization: Bearer ********************
Path Params#
serverIdinteger#required

A valid server ID as shown in VirtFusion.

Example: 1
destinationIdinteger#required

The destination hypervisor ID.

Query Params#
storageProfileinteger#

Storage profile to evaluate against (defaults to the server's primary disk profile)

Example: 1

Request Code Samples

curl --location --request GET 'https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1' \
--header 'Authorization: Bearer <token>' \
--header 'Accept: application/json'
wget --quiet --output-document=- \
  --method=GET \
  --header='Authorization: Bearer <token>' \
  --header='Accept: application/json' \
  'https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1'
http GET 'https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1' \
  'Authorization: Bearer <token>' \
  'Accept: application/json'
const response = await fetch("https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1", {
    method: "GET",
    headers: {
        "Authorization": "Bearer <token>",
        "Accept": "application/json",
    },
});

const data = await response.json();
console.log(response.status, data);
import axios from "axios";

const response = await axios({
    method: "get",
    url: "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1",
    headers: {
        "Authorization": "Bearer <token>",
        "Accept": "application/json",
    },
});

console.log(response.status, response.data);
const https = require("https");

const req = https.request({
    hostname: "cp.domain.com",
    path: "/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1",
    method: "GET",
    headers: {
        "Authorization": "Bearer <token>",
        "Accept": "application/json",
    },
}, (res) => {
    let data = "";
    res.on("data", (chunk) => (data += chunk));
    res.on("end", () => console.log(res.statusCode, JSON.parse(data)));
});

req.on("error", (err) => console.error(err));
req.end();
import requests

url = "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1"
headers = {
    "Authorization": "Bearer <token>",
    "Accept": "application/json",
}

response = requests.request("GET", url, headers=headers)

print(response.status_code)
print(response.json())
import http.client
import json

conn = http.client.HTTPSConnection("cp.domain.com")
headers = {
    "Authorization": "Bearer <token>",
    "Accept": "application/json",
}

conn.request("GET", "/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1", None, headers)
response = conn.getresponse()

print(response.status)
print(json.loads(response.read()))
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => '',
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 0,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_HTTPHEADER => array(
        'Authorization: Bearer <token>',
        'Accept: application/json'
    ),
));

$response = curl_exec($curl);
curl_close($curl);

echo $response;
<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client();

$response = $client->request('GET', 'https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1', [
    'headers' => [
        'Authorization' => 'Bearer <token>',
        'Accept' => 'application/json',
    ],
]);

echo $response->getStatusCode() . "\n";
echo $response->getBody();
package main

import (
    "fmt"
    "io"
    "net/http"
)

func main() {
    url := "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1"
    req, _ := http.NewRequest("GET", url, nil)
    req.Header.Add("Authorization", "Bearer <token>")
    req.Header.Add("Accept", "application/json")

    res, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    body, _ := io.ReadAll(res.Body)
    fmt.Println(res.StatusCode, string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
    public static void main(String[] args) throws Exception {
        HttpClient client = HttpClient.newHttpClient();

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create("https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1"))
            .header("Authorization", "Bearer <token>")
            .header("Accept", "application/json")
            .method("GET", HttpRequest.BodyPublishers.noBody())
            .build();

        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.statusCode());
        System.out.println(response.body());
    }
}
import okhttp3.*;

public class Main {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")
            .method("GET", null)
            .addHeader("Authorization", "Bearer <token>")
            .addHeader("Accept", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            System.out.println(response.code());
            System.out.println(response.body().string());
        }
    }
}
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

var client = new HttpClient();
var request = new HttpRequestMessage(new HttpMethod("GET"), "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", "<token>");
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

var response = await client.SendAsync(request);
Console.WriteLine((int)response.StatusCode);
Console.WriteLine(await response.Content.ReadAsStringAsync());
require "net/http"
require "json"

uri = URI("https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer <token>"
request["Accept"] = "application/json"

response = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
  http.request(request)
end

puts response.code
puts JSON.pretty_generate(JSON.parse(response.body))
import Foundation

var request = URLRequest(url: URL(string: "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")!)
request.httpMethod = "GET"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Accept")

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else { print(error ?? "request failed"); return }
    print((response as! HTTPURLResponse).statusCode)
    print(String(data: data, encoding: .utf8) ?? "")
}
task.resume()
// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use reqwest::blocking::Client;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let response = client
        .request(reqwest::Method::GET, "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")
        .bearer_auth("<token>")
        .header("Accept", "application/json")
        .send()?;

    println!("{}", response.status());
    let json: serde_json::Value = response.json()?;
    println!("{}", serde_json::to_string_pretty(&json)?);
    Ok(())
}
// Cargo.toml: reqwest = { version = "0.12", features = ["json"] }, tokio = { version = "1", features = ["full"] }, serde_json = "1"
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();
    let response = client
        .request(reqwest::Method::GET, "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")
        .bearer_auth("<token>")
        .header("Accept", "application/json")
        .send()
        .await?;

    println!("{}", response.status());
    let json: serde_json::Value = response.json().await?;
    println!("{}", serde_json::to_string_pretty(&json)?);
    Ok(())
}
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request

fun main() {
    val client = OkHttpClient()
    val request = Request.Builder()
        .url("https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1")
        .method("GET", null)
        .addHeader("Authorization", "Bearer <token>")
        .addHeader("Accept", "application/json")
        .build()

    client.newCall(request).execute().use { response ->
        println(response.code)
        println(response.body?.string())
    }
}
// pubspec.yaml: http: ^1.2.0
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<void> main() async {
  final request = http.Request('GET', Uri.parse('https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1'));
  request.headers['Authorization'] = 'Bearer <token>';
  request.headers['Accept'] = 'application/json';

  final response = await http.Response.fromStream(await request.send());
  print(response.statusCode);
  print(const JsonEncoder.withIndent('  ').convert(jsonDecode(response.body)));
}
#include <stdio.h>
#include <curl/curl.h>

int main(void) {
    CURL *curl = curl_easy_init();
    if (!curl) return 1;

    struct curl_slist *headers = NULL;
    headers = curl_slist_append(headers, "Authorization: Bearer <token>");
    headers = curl_slist_append(headers, "Accept: application/json");

    curl_easy_setopt(curl, CURLOPT_URL, "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1");
    curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

    CURLcode result = curl_easy_perform(curl);
    if (result != CURLE_OK) fprintf(stderr, "%s\n", curl_easy_strerror(result));

    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
    return result == CURLE_OK ? 0 : 1;
}
$headers = @{
    Authorization = "Bearer <token>"
    Accept        = "application/json"
}

$response = Invoke-RestMethod -Uri "https://cp.domain.com/api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1" -Method GET -Headers $headers
$response | ConvertTo-Json -Depth 10
GET /api/v1/servers/1/migrate/hybrid/destinations/1?storageProfile=1 HTTP/1.1
Host: cp.domain.com
Authorization: Bearer <token>
Accept: application/json

Responses

200

OK.

#
application/json
object
dataobject#
fields
disksarray[object]#
item fields
drivestring#
sizeinteger#
currentProfileinteger#
storageOptionsarray[object]#
item fields
idinteger#
namestring#
maxinteger#
freeinteger#
pathstring#
profileinteger#
examplesarray[object]#
item fields
destinationIdinteger#
disksarray[object]#
item fields
drivestring#
storageIdinteger#
compressboolean#
speedLimitinteger#
sendMailboolean#
altIPv4boolean#
resourcesobject#
fields
originalobject#
fields
serversobject#
fields
unitsstring#
maxinteger#
allocatedinteger#
freeinteger#
percentinteger#nullable
memoryobject#
fields
unitsstring#
maxinteger#
allocatedinteger#
freeinteger#
percentnumber#
cpuCoresobject#
fields
unitsstring#
maxinteger#
allocatedinteger#
freeinteger#
percentnumber#
localStorageobject#
fields
enabledinteger#
namestring#
storageTypeinteger#
unitsstring#
maxinteger#
allocatedinteger#
freeinteger#
percentnumber#
otherStoragearray[any]#
storageboolean#
hasStorageboolean#
hasStorageAvailableboolean#
hasStorageAvailableMatchedProfileboolean#
storageAvailablearray[object]#
item fields
idinteger#
namestring#
maxinteger#
freeinteger#
pathstring#
profileinteger#
networkingobject#
fields
ipv4Countinteger#
ipv6Countinteger#
ipv4Mappingobject#
fields
64object#
fields
ipstring#
reusableboolean#
74object#
fields
ipstring#
reusableboolean#
ipv6Mappingarray[any]#
ipv4AllUsableboolean#
ipv6AllUsableboolean#
ipv4Usableinteger#
ipv6Usableinteger#
ipv4Unusableinteger#
ipv6Unusableinteger#
configurationobject#
fields
ipv6boolean#
ipv4array[object]#
item fields
idinteger#
ipstring#
replaceboolean#
ipv4Continueboolean#
ipv6Continueboolean#
ipv6Availableinteger#
ipv4Availableinteger#
Example
{
    "data": {
        "disks": [
            {
                "drive": "a",
                "size": 15,
                "currentProfile": 0,
                "storageOptions": [
                    {
                        "id": -1,
                        "name": "Local (Default mountpoint)",
                        "max": 5000,
                        "free": 4495,
                        "path": "/home/vf-data/disk",
                        "profile": 0
                    }
                ]
            }
        ],
        "examples": [
            {
                "destinationId": 7,
                "disks": [
                    {
                        "drive": "a",
                        "storageId": -1
                    }
                ],
                "compress": false,
                "speedLimit": 0,
                "sendMail": true,
                "altIPv4": false
            }
        ],
        "resources": {
            "original": {
                "servers": {
                    "units": "#",
                    "max": 0,
                    "allocated": 7,
                    "free": -7,
                    "percent": null
                },
                "memory": {
                    "units": "MB",
                    "max": 129159,
                    "allocated": 8192,
                    "free": 120967,
                    "percent": 6.3
                },
                "cpuCores": {
                    "units": "#",
                    "max": 128,
                    "allocated": 12,
                    "free": 116,
                    "percent": 9.4
                },
                "localStorage": {
                    "enabled": 1,
                    "name": "Local (Default mountpoint)",
                    "storageType": 0,
                    "units": "GB",
                    "max": 5000,
                    "allocated": 505,
                    "free": 4495,
                    "percent": 10.1
                },
                "otherStorage": []
            },
            "storage": false,
            "hasStorage": false,
            "hasStorageAvailable": true,
            "hasStorageAvailableMatchedProfile": false,
            "storageAvailable": [
                {
                    "id": -1,
                    "name": "Local (Default mountpoint)",
                    "max": 5000,
                    "free": 4495,
                    "path": "/home/vf-data/disk",
                    "profile": 0
                }
            ]
        },
        "networking": {
            "ipv4Count": 2,
            "ipv6Count": 0,
            "ipv4Mapping": {
                "64": {
                    "ip": "192.168.4.63",
                    "reusable": true
                },
                "74": {
                    "ip": "192.168.4.73",
                    "reusable": true
                }
            },
            "ipv6Mapping": [],
            "ipv4AllUsable": true,
            "ipv6AllUsable": true,
            "ipv4Usable": 2,
            "ipv6Usable": 0,
            "ipv4Unusable": 0,
            "ipv6Unusable": 0,
            "configuration": {
                "ipv6": false,
                "ipv4": [
                    {
                        "id": 74,
                        "ip": "192.168.4.73",
                        "replace": false
                    },
                    {
                        "id": 64,
                        "ip": "192.168.4.63",
                        "replace": false
                    }
                ]
            },
            "ipv4Continue": true,
            "ipv6Continue": true,
            "ipv6Available": 300,
            "ipv4Available": 429
        }
    }
}
401

The bearer token is missing, invalid, or expired. The response has no body.

#
No response body.
404

The destination hypervisor was not found.

#
application/json
errorsarray[string]#
Example
{
    "errors": [
        "Destination hypervisor not found"
    ]
}
409

Architecture mismatch between source and destination.

#
application/json
errorsarray[string]#
Example
{
    "errors": [
        "Architecture mismatch between source and destination"
    ]
}
429

Too many requests. Either the token's requests per minute are used up (see the `X-RateL…

#
application/json

Too many requests. Either the token's requests per minute are used up (see the X-RateLimit-* headers) or the calling address has failed authentication 10 times in a minute (the body then includes retry_after_seconds). Retry-After gives the seconds to wait.

object
errorsarray[string]#
retry_after_secondsinteger#

Seconds to wait before retrying. Present on the failed-authentication limit only.

Response headers
Retry-Afterinteger

Seconds to wait before retrying.

X-RateLimit-Limitinteger

The token's requests per minute (token limit only).

X-RateLimit-Remaininginteger

Requests left in the current minute (token limit only).

X-RateLimit-Resetinteger

Unix timestamp at which the minute resets (token limit only).

Examples
{
    "errors": [
        "Too Many Requests"
    ]
}
{
    "errors": [
        "Too many authentication attempts. Try again later."
    ],
    "retry_after_seconds": 42
}