Introduction

The devices to be joined in an HA pair should be the exact same hardware model and have the same expansion modules installed. The number and type of interfaces should be identical. Both devices should be running exactly the same software version. Initial provisioning must be completed on each device.

When the secondary device joins the HA pair it will be become unavailable for a period of time.

HA configuration enforces certain interface restrictions. No interfaces on either device are allowed to have DHCP address type selected. The failover and stateful failover interfaces must be unused, un-named, and enabled. Only non-management physical interfaces may be selected for the failover and stateful failover roles.

Before starting the HA join, check both devices for pending changes, and perform a deployment if changes are found.

To Perform an HA Join:

Step 1

Send an HA status GET request to the primary device to confirm it is in single state.

curl -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.primary.example/api/fdm/latest/devices/default/operational/ha/status/default

 

{
  "nodeRole" : null,
  "nodeState" : "SINGLE_NODE",
  "peerNodeState" : "HA_UNKNOWN_NODE",
  "configStatus" : "UNKNOWN",
  "haHealthStatus" : "HEALTHY",
  "id" : "default",
  "type" : "hastatus",
  "links" : {
    "self" : "https://ftd.primary.example/api/fdm/latest/devices/default/operational/ha/status/default"
  }
}

Step 2 Optional step

Send an FTD jobs DELETE request to the primary device, to delete all completed jobs. This is an optional step; it will just make it easier to determine when the HA join tasks are completed. There will be no content data in the response.

curl -X DELETE -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.primary.example/api/fdm/latest/jobs

Step 3

Send an physical interface list GET request to the primary device. You will need the interface id and type values for the failover and stateful failover interfaces.

curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" https://ftd.primary.example/api/fdm/latest/devices/default/interfaces

 

{
  "items" : [{
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "description" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "monitorInterface" : true,
    "ipv4" : {
      "ipType" : "STATIC",
      "defaultRouteUsingDHCP" : false,
      "dhcpRouteMetric" : null,
      "ipAddress" : null,
      "dhcp" : false,
      "addressNull" : true,
      "type" : "interfaceipv4"
    },
    "ipv6" : {
      "enabled" : false,
      "autoConfig" : false,
      "dhcpForManagedConfig" : false,
      "dhcpForOtherConfig" : false,
      "enableRA" : false,
      "dadAttempts" : 1,
      "linkLocalAddress" : {
        "ipAddress" : null,
        "standbyIpAddress" : null,
        "type" : "haipv6address"
      },
      "ipAddresses" : null,
      "prefixes" : null,
      "type" : "interfaceipv6"
    },
    "managementOnly" : false,
    "managementInterface" : false,
    "mode" : "ROUTED",
    "linkState" : "UP",
    "mtu" : 1500,
    "enabled" : false,
    "macAddress" : null,
    "standbyMacAddress" : null,
    "speedType" : "AUTO",
    "duplexType" : "AUTO",
    "present" : true,
    "tenGigabitInterface" : false,
    "gigabitInterface" : true,
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface",
    "links" : {
      "self" : "https://ftd.primary.example/api/fdm/latest/devices/default/interfaces/6165d40c-accc-11e9-b195-795831000fdc"
    }
  }, 
  # Other interfaces omitted for brevity
],
  "paging" : {
    "prev" : [ ],
    "next" : [ ],
    "limit" : 10,
    "offset" : 0,
    "count" : 9,
    "pages" : 0
  }
}

Step 4

Send an HA configuration GET request to the primary device and save the response.

curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" https://ftd.primary.example/api/fdm/latest/devices/default/ha/configurations

 

{
  "items": [
    {
      "version": "fbed4ketmmqlm",
      "name": "HA",
      "nodeRole": null,
      "failoverInterface": null,
      "failoverName": null,
      "primaryFailoverIPv4": null,
      "secondaryFailoverIPv4": null,
      "primaryFailoverIPv6": null,
      "secondaryFailoverIPv6": null,
      "statefulFailoverInterface": null,
      "statefulFailoverName": null,
      "primaryStatefulFailoverIPv4": null,
      "secondaryStatefulFailoverIPv4": null,
      "primaryStatefulFailoverIPv6": null,
      "secondaryStatefulFailoverIPv6": null,
      "sharedKey": null,
      "id": "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
      "type": "haconfiguration",
      "links": {
        "self": "https://ftd.primary.example/api/fdm/latest/devices/default/ha/configurations/76ha83ga-c872-11f2-8be8-8e45bb1943c0"
      }
    }
  ],
  "paging": {
    "prev": [],
    "next": [],
    "limit": 10,
    "offset": 0,
    "count": 1,
    "pages": 0
  }
}

Step 5

Send an HA configuration PUT request to configure the primary device for HA. Update the HA configuration response from the previous step. Append the id from the previous response to the request URL.

When configuring the primary device, use these guidelines for best results:

  • Use interface values that meet the criteria in the Introduction section.
  • The same interface may be used for failover link and stateful failover link.
  • Each selected interface may be assigned an IPv4 or IPv6 address, but do not mix address types. For example, do not use an IPv4 address for failover link and an IPv6 address for stateful failover link.
  • Only the id and type properties need to be specified for the selected interface.
  • The primary and secondary addresses must be on the same subnet.
  • The IPSEC secret key is optional. This value is stored in the sharedKey property.
curl -X PUT -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" -d @json.txt  https://ftd.primary.example/api/fdm/latest/devices/default/ha/configurations/6165d40c-accc-11e9-b195-795831000fdc

 

{
    "version" : "fbed4ketmmqlm",
    "name" : "HA",
    "nodeRole" : "HA_PRIMARY",
    "failoverInterface" : {
      "id" : "6165d40c-accc-11e9-b195-795831000fdc",
      "type" : "physicalinterface"
    },
    "failoverName" : "failovername",
    "primaryFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.1",
      "type": "ipv4address"
    },
    "secondaryFailoverIPv4": {
      "netmask": "24",
      "ipAddress": "192.168.10.2",
      "type": "ipv4address"
    },
    "primaryFailoverIPv6" : null,
    "secondaryFailoverIPv6" : null,
    "statefulFailoverInterface" : {
      "id" : "6165d40c-accc-11e9-b195-795831000fdc",
      "type" : "physicalinterface"
    },
    "statefulFailoverName" : "statefulfailovername",
    "primaryStatefulFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.1",
      "type": "ipv4address"
    },
    "secondaryStatefulFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.2",
      "type": "ipv4address"
    },
    "primaryStatefulFailoverIPv6" : null,
    "secondaryStatefulFailoverIPv6" : null,
    "sharedKey" : null,
    "id" : "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
    "type" : "haconfiguration"
}

 

{
  "version" : "mpjbp3mt3ajlz",
  "name" : "HA",
  "nodeRole" : "HA_PRIMARY",
  "failoverInterface" : {
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface"
  },
  "failoverName" : "failovername",
  "primaryFailoverIPv4" : {
    "ipAddress" : "192.168.10.1",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "secondaryFailoverIPv4" : {
    "ipAddress" : "192.168.10.2",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "primaryFailoverIPv6" : null,
  "secondaryFailoverIPv6" : null,
  "statefulFailoverInterface" : {
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface"
  },
  "statefulFailoverName" : "statefulfailovername",
  "primaryStatefulFailoverIPv4" : {
    "ipAddress" : "192.168.10.1",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "secondaryStatefulFailoverIPv4" : {
    "ipAddress" : "192.168.10.2",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "primaryStatefulFailoverIPv6" : null,
  "secondaryStatefulFailoverIPv6" : null,
  "sharedKey" : null,
  "id" : "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
  "type" : "haconfiguration",
  "links" : {
    "self" : "https://ftd.primary.example/api/fdm/latest/devices/default/ha/configurations/76ha83ga-c872-11f2-8be8-8e45bb1943c0"
  }
}

Step 6

Send an empty HA join POST request to the primary device to start the HA join process.

curl POST -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" https://ftd.primary.example/api/fdm/latest/devices/default/action/ha/join

 

{
  "id" : "68f8bab8-bb8b-11e9-a0c2-1118c9b6c55e",
  "statusMessage" : null,
  "statusMessages" : null,
  "modifiedObjects" : { },
  "cliErrorMessage" : null,
  "queuedTime" : 1565454304748,
  "startTime" : -1,
  "endTime" : -1,
  "state" : "QUEUED",
  "name" : "HA Join Deployment",
  "deploymentStatusMessages" : [ ],
  "links" : {
    "self" : "https://ftd.primary.example/api/fdm/latest/devices/default/action/ha/join/68f8bab8-bb8b-11e9-a0c2-1118c9b6c55e"
  }
}

Step 7

Send periodic HA status GET requests to the primary device until the device is active and the peer device is failed.

curl -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.primary.example/api/fdm/latest/devices/default/operational/ha/status/default

 

{
  "nodeRole": "HA_PRIMARY",
  "nodeState": "HA_ACTIVE_NODE",
  "peerNodeState": "HA_FAILED_NODE",
  "configStatus": "UNKNOWN",
  "haHealthStatus": "CRITICAL",
  "id": "default",
  "type": "hastatus",
  "links": {
    "self": "https://ftd.primary.example/api/fdm/latest/devices/default/operational/ha/status/default"
  }
}

Step 8

Send an HA status GET request to the secondary device to confirm it is in single state.

curl -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.secondary.example/api/fdm/latest/devices/default/operational/ha/status/default

 

{
  "nodeRole" : null,
  "nodeState" : "SINGLE_NODE",
  "peerNodeState" : "HA_UNKNOWN_NODE",
  "configStatus" : "UNKNOWN",
  "haHealthStatus" : "HEALTHY",
  "id" : "default",
  "type" : "hastatus",
  "links" : {
    "self" : "https://ftd.secondary.example/api/fdm/latest/devices/default/operational/ha/status/default"
  }
}

Step 9

Send an FTD jobs DELETE request to the secondary device, to delete all completed jobs. Later, this will make it easier to determine when the HA join tasks are completed. There will be no content data in the response.

curl -X DELETE -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.secondary.example/api/fdm/latest/jobs

Step 10

Send an physical interface list GET request to the secondary device. You will need the interface id and type values for the failover and stateful failover interfaces.

curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" https://ftd.secondary.example/api/fdm/latest/devices/default/interfaces

 

{
  "items" : [{
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "description" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "monitorInterface" : true,
    "ipv4" : {
      "ipType" : "STATIC",
      "defaultRouteUsingDHCP" : false,
      "dhcpRouteMetric" : null,
      "ipAddress" : null,
      "dhcp" : false,
      "addressNull" : true,
      "type" : "interfaceipv4"
    },
    "ipv6" : {
      "enabled" : false,
      "autoConfig" : false,
      "dhcpForManagedConfig" : false,
      "dhcpForOtherConfig" : false,
      "enableRA" : false,
      "dadAttempts" : 1,
      "linkLocalAddress" : {
        "ipAddress" : null,
        "standbyIpAddress" : null,
        "type" : "haipv6address"
      },
      "ipAddresses" : null,
      "prefixes" : null,
      "type" : "interfaceipv6"
    },
    "managementOnly" : false,
    "managementInterface" : false,
    "mode" : "ROUTED",
    "linkState" : "UP",
    "mtu" : 1500,
    "enabled" : false,
    "macAddress" : null,
    "standbyMacAddress" : null,
    "speedType" : "AUTO",
    "duplexType" : "AUTO",
    "present" : true,
    "tenGigabitInterface" : false,
    "gigabitInterface" : true,
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface",
    "links" : {
      "self" : "https://ftd.secondary.example/api/fdm/latest/devices/default/interfaces/6165d40c-accc-11e9-b195-795831000fdc"
    }
  }, 
  # Other interfaces omitted for brevity
],
  "paging" : {
    "prev" : [ ],
    "next" : [ ],
    "limit" : 10,
    "offset" : 0,
    "count" : 9,
    "pages" : 0
  }
}

Step 11

Send an HA configuration GET request to the secondary device and save the response.

curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" https://ftd.secondary.example/api/fdm/latest/devices/default/ha/configurations

 

{
  "items": [
    {
      "version": "fbed4ketmmqlm",
      "name": "HA",
      "nodeRole": null,
      "failoverInterface": null,
      "failoverName": null,
      "primaryFailoverIPv4": null,
      "secondaryFailoverIPv4": null,
      "primaryFailoverIPv6": null,
      "secondaryFailoverIPv6": null,
      "statefulFailoverInterface": null,
      "statefulFailoverName": null,
      "primaryStatefulFailoverIPv4": null,
      "secondaryStatefulFailoverIPv4": null,
      "primaryStatefulFailoverIPv6": null,
      "secondaryStatefulFailoverIPv6": null,
      "sharedKey": null,
      "id": "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
      "type": "haconfiguration",
      "links": {
        "self": "https://ftd.secondary.example/api/fdm/latest/devices/default/ha/configurations/76ha83ga-c872-11f2-8be8-8e45bb1943c0"
      }
    }
  ],
  "paging": {
    "prev": [],
    "next": [],
    "limit": 10,
    "offset": 0,
    "count": 1,
    "pages": 0
  }
}

Step 12

Send an HA configuration PUT request to configure the secondary device for HA. Update the HA configuration response from the previous step. Append the id from the previous response to the request URL.

When configuring the secondary device, use the same values as the primary device, changing only the following to match the secondary device:

  • version
  • id
  • failover interface id
  • stateful failover interface id
  • nodeRole (must be HA_SECONDARY)
curl -X PUT -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" -d @json.txt  https://ftd.secondary.example/api/fdm/latest/devices/default/ha/configurations/6165d40c-accc-11e9-b195-795831000fdc

 

{
    "version" : "fbed4ketmmqlm",
    "name" : "HA",
    "nodeRole" : "HA_SECONDARY",
    "failoverInterface" : {
      "id" : "6165d40c-accc-11e9-b195-795831000fdc",
      "type" : "physicalinterface"
    },
    "failoverName" : "failovername",
    "primaryFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.1",
      "type": "ipv4address"
    },
    "secondaryFailoverIPv4": {
      "netmask": "24",
      "ipAddress": "192.168.10.2",
      "type": "ipv4address"
    },
    "primaryFailoverIPv6" : null,
    "secondaryFailoverIPv6" : null,
    "statefulFailoverInterface" : {
      "id" : "6165d40c-accc-11e9-b195-795831000fdc",
      "type" : "physicalinterface"
    },
    "statefulFailoverName" : "statefulfailovername",
    "primaryStatefulFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.1",
      "type": "ipv4address"
    },
    "secondaryStatefulFailoverIPv4" : {
      "netmask": "24",
      "ipAddress": "192.168.10.2",
      "type": "ipv4address"
    },
    "primaryStatefulFailoverIPv6" : null,
    "secondaryStatefulFailoverIPv6" : null,
    "sharedKey" : null,
    "id" : "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
    "type" : "haconfiguration"
}

 

{
  "version" : "mpjbp3mt3ajlz",
  "name" : "HA",
  "nodeRole" : "HA_SECONDARY",
  "failoverInterface" : {
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface"
  },
  "failoverName" : "failovername",
  "primaryFailoverIPv4" : {
    "ipAddress" : "192.168.10.1",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "secondaryFailoverIPv4" : {
    "ipAddress" : "192.168.10.2",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "primaryFailoverIPv6" : null,
  "secondaryFailoverIPv6" : null,
  "statefulFailoverInterface" : {
    "version" : "nfhnxlwodgarz",
    "name" : null,
    "hardwareName" : "GigabitEthernet0/6",
    "id" : "6165d40c-accc-11e9-b195-795831000fdc",
    "type" : "physicalinterface"
  },
  "statefulFailoverName" : "statefulfailovername",
  "primaryStatefulFailoverIPv4" : {
    "ipAddress" : "192.168.10.1",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "secondaryStatefulFailoverIPv4" : {
    "ipAddress" : "192.168.10.2",
    "netmask" : "24",
    "type" : "ipv4address"
  },
  "primaryStatefulFailoverIPv6" : null,
  "secondaryStatefulFailoverIPv6" : null,
  "sharedKey" : null,
  "id" : "76ha83ga-c872-11f2-8be8-8e45bb1943c0",
  "type" : "haconfiguration",
  "links" : {
    "self" : "https://ftd.secondary.example/api/fdm/latest/devices/default/ha/configurations/76ha83ga-c872-11f2-8be8-8e45bb1943c0"
  }
}

Step 13

Send an empty HA join POST request to the secondary device to start the HA join process.

curl POST -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN" -H "Content-Type: application/json" https://ftd.secondary.example/api/fdm/latest/devices/default/action/ha/join

 

{
  "id" : "68f8bab8-bb8b-11e9-a0c2-1118c9b6c55e",
  "statusMessage" : null,
  "statusMessages" : null,
  "modifiedObjects" : { },
  "cliErrorMessage" : null,
  "queuedTime" : 1565454304748,
  "startTime" : -1,
  "endTime" : -1,
  "state" : "QUEUED",
  "name" : "HA Join Deployment",
  "deploymentStatusMessages" : [ ],
  "links" : {
    "self" : "https://ftd.secondary.example/api/fdm/latest/devices/default/action/ha/join/68f8bab8-bb8b-11e9-a0c2-1118c9b6c55e"
  }
}

Step 14

Send periodic HA status GET requests to the secondary device to monitor the join process until the device reports standby state.

The secondary device will lose communication or return a server error (E.G. HTTP 503 response code) for several minutes while it imports and deploys the configuration from the primary device.

curl -H 'Accept: application/json'  -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.secondary.example/api/fdm/latest/devices/default/operational/ha/status/default

 

{
  "nodeRole": "HA_SECONDARY",
  "nodeState": "HA_STANDBY_NODE",
  "peerNodeState": "HA_ACTIVE_NODE",
  "configStatus": "IN_SYNC",
  "haHealthStatus": "HEALTHY",
  "id": "default",
  "type": "hastatus",
  "links": {
    "self": "https://ftd.secondary.example/api/fdm/latest/devices/default/operational/ha/status/default"
  }
}

Step 15

Send periodic FTD jobs GET requests to the primary device until it reports that all HA join tasks are completed and you see "status:SUCCESS" in the response. Also, make sure these texts appear in the statusMessage values:

  • "Deployment Task: User (admin) Triggered Deployment Completed"
  • "Deployment Task: HA Join Deployment Completed"
curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.primary.example/api/fdm/latest/jobs?filter=status:SUCCESS

 

{
  "items": [
    {
      "version": "kfq77d4x7x5mr",
      "jobName": "User (admin) Triggered Deployment",
      "jobDescription": null,
      "user": "admin",
      "startDateTime": "2019-08-10 17:57:47Z",
      "endDateTime": "2019-08-10 17:58:43Z",
      "status": "SUCCESS",
      "statusMessage": "Deployment Task: User (admin) Triggered Deployment Completed in 56.618s",
      "scheduleUuid": "5c4e028d-bb98-11e9-a0c2-9b665aa1e1a9",
      "deploymentStatusUuid": "5c48844c-bb98-11e9-a0c2-8995f9e2058e",
      "id": "5c5d6bde-bb98-11e9-a0c2-ab5b77285a23",
      "type": "jobhistorydeployment",
      "links": {
        "self": "https://ftd.primary.example/api/fdm/latest/jobs/5c5d6bde-bb98-11e9-a0c2-ab5b77285a23"
      }
    },
    {
      "version": "merrtrxu7vz3e",
      "jobName": "HA Join Deployment",
      "jobDescription": null,
      "user": "admin",
      "startDateTime": "2019-08-10 18:04:47Z",
      "endDateTime": "2019-08-10 18:06:24Z",
      "status": "SUCCESS",
      "statusMessage": "Deployment Task: HA Join Deployment Completed in 1m 36.818s",
      "scheduleUuid": "56e0bd1d-bb99-11e9-a0c2-f97ce51f97ba",
      "deploymentStatusUuid": "56db3edc-bb99-11e9-a0c2-c77032f80f17",
      "id": "56e8ac5e-bb99-11e9-a0c2-29ff48ae4c5b",
      "type": "jobhistorydeployment",
      "links": {
        "self": "https://ftd.primary.example/api/fdm/latest/jobs/56e8ac5e-bb99-11e9-a0c2-29ff48ae4c5b"
      }
    }
  ],
  "paging": {
    "prev": [],
    "next": [],
    "limit": 10,
    "offset": 0,
    "count": 2,
    "pages": 0
  }
}

Step 16

Send periodic FTD jobs GET requests to the secondary device until it reports that all HA join tasks are completed and you see "status:SUCCESS" in the response. Also, make sure these texts appear in the statusMessage values:

  • "Deployment Task: User (admin) Triggered Deployment Completed"
  • "Deployment Task: HA Join Deployment Completed"
curl -H "Accept: application/json" -H "Authorization: Bearer ACCESS_TOKEN"  https://ftd.secondary.example/api/fdm/latest/jobs?filter=status:SUCCESS

 

{
  "items": [
    {
      "version": "kfq77d4x7x5mr",
      "jobName": "User (admin) Triggered Deployment",
      "jobDescription": null,
      "user": "admin",
      "startDateTime": "2019-08-10 17:57:47Z",
      "endDateTime": "2019-08-10 17:58:43Z",
      "status": "SUCCESS",
      "statusMessage": "Deployment Task: User (admin) Triggered Deployment Completed in 56.618s",
      "scheduleUuid": "5c4e028d-bb98-11e9-a0c2-9b665aa1e1a9",
      "deploymentStatusUuid": "5c48844c-bb98-11e9-a0c2-8995f9e2058e",
      "id": "5c5d6bde-bb98-11e9-a0c2-ab5b77285a23",
      "type": "jobhistorydeployment",
      "links": {
        "self": "https://ftd.secondary.example/api/fdm/latest/jobs/5c5d6bde-bb98-11e9-a0c2-ab5b77285a23"
      }
    },
    {
      "version": "merrtrxu7vz3e",
      "jobName": "HA Join Deployment",
      "jobDescription": null,
      "user": "admin",
      "startDateTime": "2019-08-10 18:04:47Z",
      "endDateTime": "2019-08-10 18:06:24Z",
      "status": "SUCCESS",
      "statusMessage": "Deployment Task: HA Join Deployment Completed in 1m 36.818s",
      "scheduleUuid": "56e0bd1d-bb99-11e9-a0c2-f97ce51f97ba",
      "deploymentStatusUuid": "56db3edc-bb99-11e9-a0c2-c77032f80f17",
      "id": "56e8ac5e-bb99-11e9-a0c2-29ff48ae4c5b",
      "type": "jobhistorydeployment",
      "links": {
        "self": "https://ftd.secondary.example/api/fdm/latest/jobs/56e8ac5e-bb99-11e9-a0c2-29ff48ae4c5b"
      }
    }
  ],
  "paging": {
    "prev": [],
    "next": [],
    "limit": 10,
    "offset": 0,
    "count": 2,
    "pages": 0
  }
}