Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 121 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

i3D.net Docs

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Home

Welcome to the i3D.net documentation!

This documentation is primarily aimed at people who want to understand the following services provided by i3D.net:

Game Hosting

The Game Hosting service can be used by game publishers to dynamically deploy their game servers all over the world, using our bare metal servers, flex metal servers, and cloud VMs.

There are two ways in which developers can learn about the inner workings of the platform:

  • The Dashboard: For end-users and developers alike.

  • The API: Learn how to communicate with the API in order to automate deployment related processes.

Anti-DDoS

We have expanded our infrastructure services to also include an Anti-DDoS solution, GLAD (Global Low-Latency anti-DDoS protection). This intuitive solution takes advantage of i3D.net’s extensive global network to prevent, detect, and thwart a strike to your services.

Compute: Bare Metal and FlexMetal servers

Our product offerings encompass Compute solutions such as Bare Metal and FlexMetal. Bare Metal provides a high-performance, single-tenant computing environment that eliminates virtualization layers, enabling customized hardware configurations to precisely meet specific requirements. FlexMetal combines the strength of physical servers with the flexibility of cloud services. This hybrid model provides the best of both worlds, enabling hourly or monthly billing to fit your needs and optimize costs.

The FlexMetal API is in BETA active development.

Our new releases and improvements

We now support Tencent Cloud on our Game Hosting service

We have expanded our cloud provider portfolio to include Tencent Cloud. It is a viable option for game hosting, optimizing your game server performance and player experience. For more information, see our .

Optimize your game hosting with our Game Server Orchestrator

At i3D.net, we understand the challenges and uncertainties that come with game hosting. That's why we've developed a cutting-edge and adaptable method to assist you in effectively managing your infrastructure resources throughout the game's entire lifespan. Our complete product offers game build distribution, scaling, and automation. For more information, see .

Support

Get started

It's very easy to use our Game hosting dashboard. The following sections describes how to quickly get your game deployed. If you prefer setting up your game hosting through API, please see our .

Step 1: A CDN account is created

After you receive your credentials, you will be able to upload your build archive.

Step 2: Define your application and create your application build

After you have uploaded your build archive, you can now create your build by defining your application. This guide will assist you in setting up your Application details, settings, and properties. For more information, see Define your application and create your application build.

Step 3: Create your game, utility, dependency, or capacity templates

In this step, you learn how you can create your game, utility, dependency, or capacity templates.

  • Create a game template: This will help you define which game application builds will be deployed for that fleet.

  • Create a utility template: This template will help you to specify which utility / utilities you want to deploy onto each host (Bare Metal or Virtal Machine).

  • Create a dependency template: This template is used by a fleet and defines which dependency installer and uninstaller application builds will be deployed for that fleet.

  • Create a capacity template: This template you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types.

Step 4: Create your game deployment environment, profile, and fleets

In this step, you learn how to configure your infrastructure to deploy your game. You will be able to configure your fleets of servers, defining your deployment profiles to specify how you want your game to be distributed. For more information, see Game deployment environment, profile, and fleets introduction.

Quick start guide
Cloud usage documentation
Game Server Orchestrator Overview
Contact us
Cover

Use the Game Hosting Dashboard

Cover

API Guide for Game Hosting

Cover

Game integration solutions

Cover

Anti-DDoS solutions

Cover

Dedicated Bare Metal

Cover

About our FlexMetal servers

Cover

Get started with FlexMetal

Set Up Guide

Once you have registered your build origin server from the previous step, you can now define your application. You can define your application in the following four types:

  • A Game server

  • A Utility / sidecar

  • A Dependency installer

API v3 authentication

Nearly all endpoints in the API v3 require authentication as an i3D.net customer.

Authentication occurs in the form of an API key that can be .

API key

By clicking on the Generate API key button on the aforementioned control panel page, you create a new API key.

By default it has no IP whitelisting and no expiration date.

Arcus

We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

i3D.net provides the "Arcus" management protocol for communication with game servers. This protocol is used by the host agent and by the i3D.net Game Hosting platform to list information about servers such as their name, player count and whether or not they are password protected. Arcus can also be used to send instructions to a game server. E.g. to perform a graceful stop.

Continue reading: Usage

A2S

A2S is the standard Steam query protocol. It's simple and only used for querying your game server for information about the game.

Please refer to its manual for more information: Steam query protocol website

Protocol ID

The A2S query protocol uses protocol ID 1 in our platform.

For more information on how to setup the A2S query protocol within our platform, please refer to the Supported Management Protocols chapter.

Upgrade GCP VMs to AMD Milan or later

To change your CPU platform, you can only do this with Google Cloud Provider (GCP). In order to upgrade to the CPU platform AMD Milan or later, you must first create a new Virtual Machine (VM) with a new template in ODP. The steps below explain the process.

  1. Go to one.i3D.net and enter your login credentials.

  2. Create a new VM with a new instance template.

  3. After the creation of the new template, i3D.net automatically sends a request in GCP. With that template request, GCP creates a template with the same name. GCP will use this template to create a VM.

  4. Each name is unique on GCP, so if you want to apply this new template on a name that already exists, you must:

    • Copy the name of the existing template.

    • Delete the template.

    • Paste the name on the newly created template.

  5. Select the Series N2D in the drop down list.

  6. Select the Machine type N2d-standard-2 (2 vCPU, 8 GB memory).

  7. Select the CPU platform AMD Milan or later in the drop down list.

  8. Click Create.

Make sure that the advanced settings related to the network match with the GCP and the ODP platform.

Anti-DDoS

  • About GLAD: i3D.net's Anti-DDoS solution

  • DDoS attack types overview

  • DDoS category attack types

  • Customer onboarding guide

A Dependency uninstaller

You can do this directly in the Game hosting dashboard. Here are the steps to follow below.

Enter your application details

  1. Go to Game Hosting > Applications.

  2. In the Application Management page, click Create application.

App creation
  1. In the Create Application window, enter the following fields:

  • Application Name.

  • (Optional fields) Enter Description, Developer Name, Publisher Name, and Website URL.

ApplicationName
  1. Click Next. You will now enter your application settings.

Enter your application settings

For this example, we will demonstrate how to create a game application.

  1. Select your Application Type. You can select from the following types: Game, Utilities, Dependency Installer, or Dependency Uninstaller.

App types
  1. Select your Management Protocol. You can select from the following protocols: None, A2S, and Arcus. This only applies when your Application Type is Game.

Mgt Protocol
  1. Select your Operating System Group that will run on the machine and be used for the stop method. You can select either Windows or Linux.

  2. Select your Default Stop Method. The stop method that will be used on restart or destroy of an application instance. The default is Hard kill. Depending on your Management Protocol and Operating System Group, you will have a defined selection to choose from.

Def Stop Method
  1. Select the Stop Method Time-out. This ensures that there are no active players on the instances that are scaled down by the scaler. The default is 0 Seconds (no timeout).

  2. Click Next. To create your application properties, follow the next steps below.

Stop Method time out

Create your application properties

Here you can customize how you want your application to send and receive information. For example, you can define that your application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance.

  1. To add a new Application property, click + Add.

  2. Select Type from the drop down list.

  3. Enter the Key.

  4. Enter the Value.

  5. Click the floppy disc icon to save your newly created application property.

  6. Click Create.

  7. Click Save.

  8. Follow the step below to create your application build.

For more explanation about private/public network port properties and private/public network port range properties, see our ApplicationProperty overview documentation

Create your application build (Build details)

  1. Go to Game Hosting > Applications.

  2. Click the Builds tab.

  3. Click Create build.

  4. On the Create an Application Build window, enter the Application Build Name.

  5. (Optional) Select the Instance does ready callback check box if you want the platform to be informed when it's done initializing and ready to accept players.

  6. Select the Application, CDN Account, and File from the drop down list.

  7. Click Next.

Create your application build (Settings)

  1. Select your Operating System from the drop down list.

  2. Enter your Application Build Executable.

  3. By default, the Run as root user is check box is selected.

  4. Enter your Version and Startup Parameters.

  5. Select your Host Capacity Template from the drop down list.

  6. Click Next.

Create your application build (Labels and Build properties)

  1. Click + Add to set up your labels.

  2. Enter your Key and Value

  3. Click the floppy disc icon to save.

  4. Click Next.

  5. You will see your Application build properties displayed here. To edit, click the pencil icon.

  6. Click Save.

Related topics

  • Create your game, utility, dependency, or capacity templates

  • Game deployment environment, profile, and fleets introduction

  • Orchestrator Overview

IP Whitelisting

If you want to lock down usage of the API key to one or more IP addresses, or a range of IP addresses then you can fill in a start IP and end IP address for the API key.

Expiration

API keys can be set to expire at a certain date. To set this up, enter or select a date by clicking on the API Key expidation date field. The API key will expire when the indicated date has been reached.

API key usage

Authenticating your requests is done by adding a PRIVATE-TOKEN HTTP header containing your API key as the value:

HTTP Header Name
HTTP Header Value

PRIVATE-TOKEN

YOUR_API_KEY

Table 1: API v3 authentication header

generated and configured on the control panel

API guide for game hosting

Looking for a quick start on game deployment within the Game Hosting platform using our Game Server Orchestrator? Here's how it works:

Game Deployment workflow

1. Register build origin and upload your build archive.

Before you can begin, you need to register a build origin; a secure web server that hosts your build archives. A build origin can be a web server that you host yourself, or you can use a build origin provided by us.

Once that's registered, upload your build to the origin.

2. Define your Application

Our platform needs to have some information about the application you're going to deploy. As such, you have to telling us what kind of application it is (a game application to begin with) and you must give it some , like a network (game) port that clients can connect to.

3. Create Application Build

Next you must point to your build archive from within an . Here you enter things like the name of the executable, along with any startup parameters that we need to pass to the game server when starting it.

4. Create Game Template

From within a you point to an Application Build you want to deploy. You need this step because you must point to this later on in the process.

5. Create Deployment Environment

A is the top most element in your deployment hierarchy. It encapsulates all Fleets that must be grouped together for a single purpose. E.g. you can have a development, testing and production environment.

6. Create Deployment Profile

Now it's time to tell the platform where you want your game servers deployed by creating a . Here you must define your geographical deployment regions (based on where you rent bare metal servers from us) and optionally add cloud bursting locations to each region.

7. Create Fleet

A ties all previously created elements together, defining for the platform all details it requires in order to deploy your game servers.

8. Enable Deployment

Finally, you must . Sit back and see your game servers come online within a few minutes(1)(2)

¹ the largest factor in deployment time is the size of your build archive that needs to be downloaded ² in order to deploy game servers you first need to have at least one bare metal or flex metal server active in your account

Related topics

Processes

This section of the documentation explains processes within the i3D.net ONE Game Hosting service.

A process is a certain aspect of the Platform that you may have to go through and complete before you can use the Platform, such as setting up your applications and application builds. Or setting up your deployment environment so that our system knows how to deploy your game servers.

Here are all the documented processes where each has a short explanation and a link to the full process documentation.

Application Management

Application Management is the process of defining and maintaining the applications you want to deploy with the ONE Game Hosting service.

Application Build Provisioning

The purpose of the i3D.net ONE Game Hosting platform is to deploy your applications. Providing your build to the platform therefore is a crucial process.

Application Build Management

Application Build Management is the process of creating and maintaining software builds for your Application. An ApplicationBuild defines the software that will be deployed by our system. It can be a game server or a utility (side car).

Deployment Configuration

Deployment configuration is the process of setting up how you want your applications to be deployed and where and when.

Dependency Installation

Dependency Installation is the process of installing software requirements (dependencies) for your applications.

Deployment Process

This chapter describes the process of deploying an ApplicationInstance.

Automatic Deployment

Opposite the manual deployment process is the automatic deployment process whereby our platform takes care of deploying game servers and utilities (side cars) for you. This is done according to the Deployment Configuration you have setup for a Fleet.

Automatic Scaling

This chapter explains the logic behind our automatic scaling process.

Patching Process

A patching process is the process of updating game servers / utilities to a new version of the software. There are multiple ways in which this can be done.

Rolling Deployment

Updating your game servers with a rolling update means that you update game servers as soon as they exit naturally or when they are empty and unallocated. This of course only works for game types that have matches that end. Some games do not have the concept of finite matches but instead run forever. That type of game might not be suited for this kind of update method.

No maintenance window is required. What is required is that your back end can handle multiple game server versions alongside each other. Additionally your clients should be able to connect to either version. As you can tell, you should only perform rolling updates if the new version is compatible with the old one.

After a while most game servers will be updated. Any remainders can be Forcibly Updated.

This deployment method has not yet been implemented.

Benefits

  • No maintenance window is required

  • No extra server resources are required. The total amount of game servers will remain equal during a rolling update

  • Completely transparent to your clients

Downsides

  • No way to test your newly deployed game server versions. As such, testing must be done beforehand!

Performing a Rolling Deployment via the UI

This deployment method is not yet available. This documentation will be updated as soon as it is available.

Performing a Rolling Deployment via the API

This deployment method is not yet available. This documentation will be updated as soon as it is available.

Performing a Rolling Deployment manually

You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the chapter. Note that you will not receive any live-reporting emails then.

Deployment Templates

A deployment template defines which applications to deploy for a Fleet.

This section of the documentation elaborates on deployment template elements for game server builds, utilities and dependencency installers.

GameDeploymentTemplate

The GameDeploymentTemplate indicates which [game server] ApplicationBuilds you want to have deployed within a Fleet.

Continue reading ...

UtilityDeploymentTemplate

The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (bare metal or VM). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.

DependencyDeploymentTemplate

The DependencyDeploymentTemplate enables you to provide scripts that install dependencies onto a Host that are required by your Application(s) to run properly. Besides an installer script, you must also define an un-installer script to remove the dependencies and to allow clean up of a Host after removing all applications running on it.

Element Relations

The figure below depicts the relationships between the different Application related elements:

  • Application

  • ApplicationProperty

  • ApplicationBuild

Relationships

Usage

We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

To use the protocol and fetch information or send requests to a game server, you need to open a TCP connection. The first thing you need to send is the Initialization packet (link to Initialization structure) the server will accept the Initialization or deny it. When it's denied, the server closes the connection. When the server accepts the Initialization it will reply with an "Acknowledged" packet.

You are now ready to communicate with the game server. When you send an instruction to the game server it will respond with a Not implemented packet or an Acknowledged packet to indicate what is going on.

When you request information such as Server information you will not receive an Acknowledged packet but just a packet with the response.

Keep in mind that you need to implement all the features if a feature does not apply to your game you need to send Unknown packet to make sure there is always a response.

Missing a feature?

Does your game require a feature that we don't currently support? Please so we can see if we can help with the feature you require.

Versioning

Each packet contains a version byte in its headers. This byte will be used in case the packet structure will change in the future. By default this value is 1.

Continue reading:

Examples

The following examples are full walkthroughs for using the Game Hosting platform via the API.

Registering your application and builds

Go to the example

Creating a completely configured deployment environment from scratch

Deployment Configuration

Deployment configuration is the process of setting up how you want your applications (its builds) to be deployed and where and when.

A deployment configuration is made up of several elements which are described in the following chapters. A deployment configuration always begins with a Deployment Environment.

Schematic deployment configuration overview

Patchjobemail

A PatchJobEmail element describes an email address that we send patching reports to.

You can set which reports to have sent to the email address:

  • progress reports

  • the final result report

Game Integration

For the best hosting results and for full control over your game servers and clients, you can integrate some functions of our platform within your game. Although this is not technically necessary, it is recommended.

Game Server Orchestrator

A smooth release of a multiplayer game with an efficient game hosting solution can help with its success. i3D.net understands the importance of that. To help burgeoning game studios in that endeavor, i3D.net offers a new product: The Game Server Orchestrator. The Game Server Orchestrator is a fully customizable game hosting solution that offers scalability solutions (scaling up / down game servers based on demand), health checks, monitoring, and more.

Deployment

The DeploymentEnvironment is the topmost element in the deployment configuration hierarchy. It is normally used to reflect a title (game) that you host on our platform, split up into e.g. development, testing and production environments.

Figure 1: DeploymentEnvironment's place in the Deployment Configuration

Usage

Our recommendation is to create an environment per title. Additionally, separating your live environment from any development environments is advised so changes and experiments done for development purposes in a development environment won't affect your live environment.

Within a DeploymentEnvironment you can create multiple s, in case you want to separate e.g. different platforms like PC, PS4, Xbox, Switch, etc.

Utility patching

The ONE Game Hosting platform now has a utility patching mechanism that makes it easy for you to update builds for already running application instances. This document explains the following:

  • Before you begin: Prerequisites for the utility patch

  • Create a utility patch job

Patchjoboverallprogress

The PatchJobOverallProgress element describes a high level overview of the progress of a .

For a more in-depth view on the progress of a PatchJob, refer to the PatchJobProgress element.

Element structure

Property
Value type
Required
Description

A/B Deployment

A/B deployment is an update process whereby you deploy new versions of your game servers alongside your already existing game servers. First in small amounts, allowing you to test your new build first with a few clients, maybe a team of internal or external testers. You control the clients that will connect to the new versions via your matchmaker - you do not update all clients at the same time. Only when you are happy with the new game server version will you send all client-update instructions and will you let all other clients join with the new game servers.

This has the side effect that your game servers running the old version will automatically be abandoned once all your clients have updated. When that moment has been reached, you can delete the remaining game servers still running the old version.

This deployment method has not yet been implemented.

Ping beacons overview

We have a core part of the i3D platform which are ping beacons. The ping beacons examine User Datagram Protocol (UDP) traffic to measure latency with a multiplayer games' UDP transport. We operate these beacons in multiple regions so that your game operates optimally. Using a ping beacon will measure the time of sending a UDP message and when you receive a response. In short, the quicker the response received, the lower the latency you have for your games.

Why do multiplayer games use UDP versus other protocols?

User Datagram Protocol is used for multiplayer games since it allows for data transmission at a much faster rate than other protocols such as TCP.

Patchjobapplicationbuild

The PatchJobApplicationBuild element describes an old ApplicationBuild ID and a new one to replace the old with.

This element is one of the properties that define the selection of ApplicationInstances to patch. Additionally it defines which new ApplicationBuild to deploy over the olde one.

The other PatchJob properties that create the selection of ApplicationInstances are:

  • DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)

  • Application ID (PatchJob.applicationId

Handling Server Query Response

We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

After sending a request packet, the server must always respond with a packet. If the server does not recognize the request, it can send a Not implemented packet in response so the system will detect that the server cannot handle the request and report back that there is an error and cannot perform the request.

When the server acknowledges the request, it must send the Acknowledged packet back. If the request has a specific response like a Server information response, don’t send the acknowledged packet back but only the response for that specific response.

Hostip

This element represents an IP address directly allocated to a .

Element structure

Property
Value type
Required
Description

Features

This section of the documentation explains additional features of the ONE Game Hosting service.

Triggers

Task System

Deploymentcontainer

The DeploymentContainer element is a wrapper that holds the primary or secondary cloud (dc) locations to burst towards when your bare metal pool runs dry.

Figure 1: Highlighting where the DeploymentContainer elements belong in the overview

Usage

Cloud Instance Types

A cloud instance type defines the amount of hardware resources (e.g. CPU cores & memory) a VM will have available. Some examples of available instance types on different cloud providers:

  • (AKA machine types)

Within our system you can use any instance type you want or need. You can even use specialized instance types if that suits your requirements. That said, under normal circumstances you would use regular compute instance types.

Before you begin

You must have the following elements to patch a utility:

  • A VM or a BM with utilities included.

  • A new application build for your utility.

Once you have met the prerequisites above, you can create a patch job.

Create a utility patch job

At the moment, you cannot use the front end to create the patch job for utilities, however the API will accept it. See the Create a patch job API documentation for reference.

  1. Create a utility patch job.

  2. Wait for the patch job to commence.

  3. Your target fleet will be put into manual operational status. You cannot change this while the patch is running. The system will not touch your fleet at this point. This means the system will not add or remove new application instances, VMs, or BMs.

  4. Wait for the patch job to complete.

  5. Once complete, review the patching changes. You can review through the sent emails or manually checking your monitoring tools to ensure that your patch has successfully completed the changes based on your requirements.

  6. After a successful review, place the fleet back in your desired operational status (Auto deployment or Auto scaling).

Results

The patch job will download the new application build on the machine. It will slowly stop the existing application instances, replace the file, and start them again. The Game/Utility deployment template's builds will be updated to the new build as soon as the patch job completes. When you reactivate the fleet, new application instances will now use the new application build.

Related topics

  • Patching process

  • Forced Deployment

  • Rolling Deployment

  • A/B Deployment

Benefits
  • No maintenance window is required

  • Allows for testing your new game servers before moving the whole community to the new version

Downsides

  • During the A/B deployment process you will have a bit more game servers than normal, occupying a bit more resources, unless you have unused bare metal hosts available

Performing a A/B Deployment via the UI

This deployment method is not yet available. This documentation will be updated as soon as it is available.

Performing a A/B Deployment via the API

This deployment method is not yet available. This documentation will be updated as soon as it is available.

Performing a A/B Deployment manually

You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the AB Deployment - Manually chapter. Note that you will not receive any live-reporting emails then.

What is the typical flow to use ping beacons to measure latency?

Please note that you must integrate this flow using i3D SDK manually in your game clients since this is the component that sends the UDP packet towards the i3D.net ping servers. The game backend in most cases pulls the ping server list from i3D.net and passes it to the game client on start up.

  1. You call the API endpoint to receive a complete list of i3D.net ping beacons.

  2. Create a UDP socket.

  3. Send a single UDP datagram on port 3075. The message must begin with 0xffff. Note: You can push other payloads in as long as it starts with 0xffff. You can add your own content.

  4. Next, the ping server will reply with 0x0000.

  5. From there, you can measure the time between sending the UDP message and when you receive a response.

The Payload

The payload data in a response packet is always a "json" data blob or empty. The length of the payload is mentioned in the packet's header.

Continue reading: Available Opcodes

Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Continue reading ...
Rolling Deployment - Manually
Continue reading ...
Continue reading ...
contact us
Configuration
Go to the example
Matchmaking & game server allocation

If your game allows for players in a particular region to play against each other, or players at a similar level of experience to play against each other, you normally create a matchmaker that will decide where a player will end up and who he or she will play against.

Especially the geographical decisions in this process are relevant to our platform. You will want to request a game server from the platform in a certain region.

Further reading ...

Ping beacon request response

We have a core part of the i3D platform which are ping beacons. The ping beacons examine User Datagram Protocol (UDP) traffic to measure latency with a multiplayer games' UDP transport. We operate these beacons in multiple regions so that your game operates optimally. Using a ping beacon will measure the time of sending a UDP message and when you receive a response. In short, the quicker the response received, the lower the latency you have for your games.

Further reading ...

Management protocol

A management protocol is a means for a game server to be queried or controlled by an external source. In this case the external source is i3D.net's ONE Game Hosting service. A management protocol can be used to query a game server for live game related information (status queries returning the number of players, the current map, rules, etc), or for sending commands for e.g. a graceful (soft) stop.

Further reading ...

Game server run-status update

Many game servers have an initialization process to go through when starting up. This has the effect that the game server will not actually be usable during this initialization period. Our platform should know about this, otherwise it will assume the game server is ready to accept clients immediately after starting. For this to be possible, your game server can let our back end know when it is ready to accept players. We refer to this as a "game server run-status update" and can be performed by having the game server make an API call either towards our public API, or locally towards our Host Agent.

Further reading ...

Further reading ...
Our platform uses a task system to communicate with the Host Agents installed on all your hosts (BM and VM). A Task as such is a wrapper for one or more commands sent to a Host Agent. This wrapper keeps track of which command is currently being executed and its execution status. A Task can also contain a schedule time, allowing Tasks to be performed somewhere in the future.

Continue reading ...

Platform Events

It is possible to receive events from within our platform, allowing you to get more insight into which actions it performing. You could log these for your own purposes.

At the time of writing this is an experimental feature that we are testing with a few clients. There is no publicly available endpoint that allows to you automatically sign up to our event stream. But you can request access to it via the usual support channels.

Continue reading ...

Continue reading ...

All instance types can be fetched from GET /cloud/instanceType.

Recommended instance types (preventing noisy neighbors)

In theory you can choose any instance type you deem fit for running your game servers. However, we recommend using the largest instance types possible so that you effectively create a VM that uses all hardware resources of a host, with the result that you are the only one with a VM on that host. That way you will lower the risk of suffering the "noisy neighbour" effect whereby other VMs on a host consume a lot of resources, potentially causing unwanted network lag or processor spikes for your VM. Since game servers must perform well for an optimal gaming experience for your clients, predictable performance is desired and as such, "renting" an entire host reduces risk.

Configure a secondary instance type

Much to contrary belief, cloud providers do not have an endless supply of VMs and hosts. A certain instance type can and will run out in random regions. For this reason it is highly recommended to configure a secondary instance type for each cloud data center location you select to use. This way you have an alternative in case your primary instance type is sold out.

Instance type profiling

To determine which instance type best suits your needs, some profiling needs to be performed. If oyu are unsure how to proceed with this, feel free to contact us for help with profiling your game servers and determining the resources they need.

AWS EC2 instance types
GCP instance types
Tencent Cloud instance types
ApplicationBuildProperty
ApplicationBuildConfiguration
Prerequisites

Before you can create a Deployment Configuration, you must first create an Application with at least one ApplicationBuild.

Please refer to the Application Management and Application Build Management chapters for more information on creating these elements.

Deployment Environment

The DeploymentEnvironment element sits at the top of a deployment configuration. This is a simple element with just a name. We recommend creating a Deployment Environment for each game / title you host on our platform. Though during e.g. development of your software you could also create environments meant for testing. This way you can create environments for different purposes.

Fleet

The Fleet element is on the second layer within the deployment configuration hierarchy. It is a direct descendant of the DeploymentEnvironment element and is essentially just a sub-divisor of said element. Its children are the Deployement Templates and Deployment Profile. Only one fleet can be deployed on a host at a time.

Deployment Templates

Deployment Templates represent which applications (builds) will be deployed within a fleet. There are two types of templates: Game Deployment Templates and Utility Deployment Templates.

Utility Deployment Template

The Utility Deployment Template indicates which utility / utilities you want to deploy onto each host. A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.

When a new host is selected for deployment of game servers, the utility will be the first thing to be deployed onto the host. Reversely, when a host has been freed from any game server applications, the utilities will be removed again, cleaning up the host.

Game Deployment Template

The Game Deployment Template indicates which game server builds you want to have deployed within a fleet.

Deployment Profile

The DeploymentProfile element - also known as a Scaling Profile - defines where and how your Application will be deployed. It contains all the Deployment Regions which in turn contain all the individual data center (DC) locations within said regions. Cloud VMs and their creation specifications are also indicated here.

Deployment Region

The DeploymentRegion element defines a geographical region that contains one or more i3D.net DC locations. You must have bare metal servers rented in these locations in order to add them.

Deployment Locations

The DeploymentContainer and DeploymentContainerLocation elements define cloud (DC) locations to burst towards when your bare metal pool runs dry.

Maximum number of instances on a host

The automatic deployment mechanism needs to know how many game instances it can deploy on a given host. Without giving the system any hints, it will default to deploying one instance per physical core. To deviate from this default you must create a HostCapacity template.

HostCapacityTemplate

With the HostCapacityTemplate element you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types. The actual definitions of the instance types and capacities themselves are defined in the InstanceTypeCapacity elements, which are assigned to this HostCapacityTemplate upon creation.

create an Application element
properties
Application Build element
Game Template
Deployment Environment
Deployment Profile
Fleet
enable automatic deployment
Orchestrator Overview
i3d.net API documentation

Read-only

The IP address

version

int

Read-only

IP version (4 or 6)

type

int

Read-only

IP type: 1 Normal 2 KVM 3 VRRP1 4 VRRP2 5 gateway

private

int

Read-only

0 Public IP 1 Private IP (RFC-1918)

Table 1: HostIp element structure

Element relation

The HostIp element is part of the Host element and is not used stand-alone.

ipAddress

Host

string

Element structure
Property
Value type
Required
Description

id

string

Read-only

Unique identifier of this element

email

string

Yes

The email address to send PatchJob reports to

progressReport `

int

Yes

Table 1: PatchJobEmail element structure

API example

This element is not created individually, but is included in, and created with the PatchJob element.

Element structure

Property
Value type
Required
Description

id

string

Read-only

Unique identifier of this element

name

string

Yes

Name of the deployment environment

createdAt

int

Read-only

Table 1: DeploymentEnvironment element structure

API example

Create a new DeploymentEnvironment within your i3D.net account.

Full API reference

HTTP request

POST /v3/deploymentEnvironment

Request body

Response body

Related topics

  • Orchestrator Overview

  • Game Deployment Quick Start Guide

  • i3d.net API documentation

Fleet
DeploymentConfigurationOverviewDepEnv

id

string

Read-only

Unique identifier of this element

total

int

Read-only

Total number of affected ApplicationInstances

preLoaded

int

Read-only

Total number of pre-loaded ApplicationBuilds

success

int

Read-only

Total number of successfully patched ApplicationInstances

failed

Table 1: PatchJobOverallProgress element structure

API example

This element is not created individually, but is included in, and created with the PatchJob element.

PatchJob
property)
  • One or more Fleet IDs (PatchJob.fleet property)

  • Element structure

    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    oldApplicationBuildId

    string

    Yes

    The ApplicationBuild ID to replace

    newApplicationBuildId

    string

    Yes

    Table 1: PatchJobApplicationBuild element structure

    API example

    This element is not created individually, but is included in, and created with the PatchJob element.

    PatchJob
    Element structure
    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    markedForDeletion

    boolean

    Read-only

    Name of the deployment region

    containerLocations

    []

    No

    Table 1: DeploymentContainer element structure

    API example

    DeploymentContainer elements are not created separately, but are always created and updated inside the DeploymentRegion element inside the containers property.

    Application Management

    Application Management is the process of defining and maintaining the applications you want to deploy with the ONE Game Hosting service.

    Application elements

    An Application is defined by the following two elements:

    Application definition elements:

    • Application

    For information on maintaining builds for your Application, please see the chapter.

    Application & ApplicationProperty example

    To be able to deploy an imaginary game called "Bluewolf", you first have to create an Application element, defining your application within the platform. It would be specified as follows:

    Application

    JSON request data :

    The value 2 for managementProtocol stands for the management protocol.

    Next, ApplicationProperty elements are added to the Application. This is necessary for Application configuration and to ensure the platform knows how to deploy related instances:

    ApplicationProperty 1

    JSON request data :

    The value 1 for propertyType stands for "public network port". In this case we give it the name game_port and the default value of 0. Passing 0 instructs the platform to find a random free port each time an application instance is started.

    ApplicationProperty 2

    JSON request data :

    The value 6 for propertyType stands for "private network port". Giving your Application a managementport property tells the platform that your game servers can be queried for information, or that commands can be issued. The latter depends on the value of the Application.management_protocol property you provided while creating the Application. Just like with the previous game_port property, the value 0 tells the platform to pick a random port on each application instance start.

    ApplicationProperty 3

    JSON request data :

    This is a raw property. The platform does not use these internally for any kind of functionality and these properties are here only for your own reference, or to use as a static configuration parameter in your game server startup configurations.

    We now have a complete Application element with definitions for:

    • application type, Application.type = 1 (game)

    • a managementProtocol, Application.managementProtocol = 2 (Arcus)

    • a management private network port, ApplicationProperty "managementport" with default value 0 (random port)

    Hostcpu

    This element details the CPU information of a Host.

    Element structure

    Property
    Value type
    Required
    Description

    socket

    Table 1: HostCpu element structure

    Hyperthreading

    You can tell whether hyperthreading is enabled by looking at the cores and threads properties.

    The cores property represents physical cores. The threads property represents logical cores.

    Hyperthreading is enabled when threads is double the amount of cores.

    Hyperthreading is disabled when threads is equal to the amount of cores.

    Element relation

    The Cpu element is part of the element and is not used stand-alone.

    Terminology

    The following terms are used throughout the documentation pages and should be understood in order to fully comprehend the components and inner workings of the i3D.net Game Hosting service.

    Term

    Description

    Allocation

    The process of allocating (reserving) a game server for players to connect to. This is normally done by a Matchmaker.

    Application

    The application you want the Platform to host. This can be a game server application, or any kind of utility you want to run alongside your game server.

    Application Build

    An element containing execution information and meta data about an Application Install.

    Application Instance

    A single deployed application build, e.g. a deployed game server, or a deployed utility.

    AWS

    Deploymentcontainerlocation

    The DeploymentContainerLocation element defines a cloud (dc) location to burst towards when your bare metal pool runs dry.

    Figure 1: Highlighting where the DeploymentContainerLocation elements belong in the overview.

    Usage

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: DeploymentContainerLocation element structure

    API example

    DeploymentContainerLocation elements are not created separately, but are always inside the containers property, as children of the elements.

    Applicationinstanceip

    This element describes an IP address of an ApplicationInstance. Every ApplicationInstance element has one or more IP addresses. Virtual hosts have both private (internal) and public IP addresses, whereas bare metal hosts normally only have a public IP address, unless you have a custom networking setup.

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: ApplicationInstanceIP element structure

    Public and private IP addresses

    An ApplicationInstance will have at least one public IP address. An instance deployed onto a VM will additionally have at least one private IP address (). The reason for this is that a VM has no public IP address defined on the host level, but instead gets its public IP address via NAT. This means that the VM host itself only has knowledge of private IP addresses and not any public ones. The illustration below explains this further:

    [![](images/BM-&-VM-ip-address-assignment.png "BM & VM IP address assignment.png")](images/BM-&-VM-ip-address-assignment.png) Figure 1: BM & VM IP address assignment

    Our platform has knowledge about all IP addresses involved with a bare metal server or VM. As such it can populate an element with all public and private IP addresses related to the host it's deployed on.

    IP address binding

    If you must bind a specific IP address to your application's socket(s), care must be taken during configuration of your 's properties.

    When configuring an application, you can use in your application's startup parameters or configuration file(s). If you have a socket that must be bound to a specific IP address, note that you should use the platform variable VARIPV4BINDING or VARIPV6BINDING. These variables contain the correct IP addresses to use for socket binding, depending on whether your application is being deployed onto a bare metal (BM) server or a cloud VM. If it concerns a BM, a public IP address will be used. Otherwise, on a VM, its private IP address will be used, allowing your application to bind to the correct socket.

    If you specifically need the public IP addresses of an ApplicationInstance during Application configuration, you can use the platform variable VARIPV4PUBLIC. See the chapter on for all available platform variables.

    Game Hosting-SDK

    Version: v0.9.1 (Beta)

    All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.


    The SDK provides games with the ability to communicate with the i3D.net ONE Platform, for easy scaling of game servers! In order to integrate Arcus into the Game Server itself, you will need to read the following guides:

    • Build – How to build and test the repository.

    • Integration Guide – How to integrate the Arcus API into a Game Server.

    The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading the documentation, please .

    Major Goals

    1. C/C++ v11 library.

    2. Easy-to-use C API interface for maximum language compatibility.

    3. Source-only build allowing for "copy and drop-in" of files.

    4. Supported platforms:

    Not Included

    The below are not provided or part of current goals. Please for change requests.

    1. Testing on Linux distros other than Ubuntu 18.04.

    Layout

    The SDK is made up of code to be integrated into the Game plus additional components that aid in the testing, development and integration.

    1. is the library that provides communication between the Game Server and the scaling environment in the One Platform. It is to be integrated into the Game Server. It contains a C/C++ implementation of the ONE platform's Arcus protocol and messages, and provides a TCP server to communicate with the ONE Platform.

    2. is a library that provides a way to obtain server addresses of the ONE backend and utilities to ping the servers, for use in a game's player client code's matchmaking features.

    3. contains samples that use the SDK components to aid in integration, development, and testing.

    Engine Plugins

    Unity

    Unity engine support is implemented as a plugin which is available .

    Unreal

    Unreal engine support is implemented as a plugin which is available and also located in our documentation .

    Packet Structure

    We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

    Data Types used in packet structures

    Name
    Description

    Packet header

    Data
    Type
    Comment

    Continue reading:

    Patchjobfleet

    The PatchJobFleet element describes a Fleet whose ApplicationInstances will be patched (in combination with other selectors).

    This element is one of the PatchJob properties that define the selection of ApplicationInstances to patch.

    The other PatchJob properties that create the selection of ApplicationInstances are:

    • DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)

    • Application ID (PatchJob.applicationId property)

    • One or more old ApplicationBuild IDs (PatchJob.applicationBuild property)

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: PatchJobFleet element structure

    API example

    This element is not created individually, but is included in, and created with the element.

    Patching

    The ONE Game Hosting platform has a patching mechanism that makes it easy for you to update builds for already running application instances. You can perform updates in different ways, using different patching methods. Each method has a different purpose and performs different actions. To learn more about each patching method, choose one of the following:

    When creating a new Patch Job, you can choose one of these methods and make a selection of which application instances to update. You can run the Patch Job right away, or schedule it to run at a later time. Reporting emails will be sent to any email addresses you submit inside the Patch Job. Reporting will start as soon as the Patch Job begins giving you an overview of which instances will be affected. During the patching process itself we keep sending report emails to show you the patching progress. When all is done, a final report will be sent. More details about the different patching method and all the Patch Job settings can be found in this and the following chapters.

    API v3 usage

    API v3 endpoint prefix

    Throughout these documentation pages we will refer to API endpoints like this:

    GET /deploymentEnvironment

    This is not a complete endpoint. You must prefix this with the API uri and API version tag:

    https://api.i3d.net/v3/

    That results in the complete URL:

    Deployment Process

    This chapter describes the process of deploying an .

    Prerequisites

    Before an ApplicationInstance can be deployed, you must first create a . This ensures you have a with s and s. Hosts (bare metal servers in your account or VMs) onto which ApplicationInstances are deployed will automatically become part of a region based on their geographical location.

    Here is a schematic overview of the resulting structure:

    Figure 1: Deployment (environment) structure with ApplicationInstances

    Host Capacity

    With the HostCapacityTemplate element you can define how many game instances you want deployed on any specified BM instance types and / or VM instance types. The actual definitions of the instance types and capacities themselves are defined in the elements, which are assigned to this HostCapacityTemplate upon creation.

    Element Structure

    Property
    Value type
    Required
    Description

    Elements

    These chapters elaborate on the individual components used by the Platform.

    Application Elements

    Integration Guide

    The SDK contains multiple separate components providing specific functionality. This integration guide will provide information of how to integrate the Arcus and Ping components.

    • Arcus Component: For communication between Game Server and the ONE Game Hosting Platform.

    • Ping Component: For obtaining available servers and pings from the game's Player code.

    Hostdisk

    This element represents a disk drive of a .

    Element structure

    Property
    Value type
    Required
    Description

    Game Template

    Once you have defined your application and created your application build from the previous step, you can now create your templates. Follow the instructions below.

    Game template overview

    A Game template is used by a fleet and defines which game application builds will be deployed for that Fleet. You can create as many Game templates as you like on the platform. However, a Fleet can only point to one Game template at a time. A Game template can be shared across multiple fleets though.

    Applicationbuildconfiguration

    If an uses configuration files (e.g. setup.cfg), then these can be submitted and assigned to an in the form of ApplicationBuildConfiguration elements. Each of these elements represent a configuration file. An ApplicationBuild can have zero or more ApplicationBuildConfiguration elements.

    Element structure

    Property
    Value type
    Required

    Hostmemory

    This element represents a memory slot of a .

    Element structure

    Property
    Value type
    Required
    Description
    {
      "name": "Bluewolf"
    }
    [
      {
        "id": "173892217340309897",
        "name": "Bluewolf",
        "createdAt": 1568312996
      }
    ]
    Integration Guide - Arcus Component

    The goal of the integration is for the game server to host an Arcus Server over TCP, allowing the ONE Platform to connect to the server to send and receive Arcus messages.

    Adding the library to the Game

    The one/arcus folder must be copied to the project and configured for building.

    Alternatively, to integrate binaries and headers:

    1. Build the repository.

    2. Copy the static lib found in build/one/arcus/one_arcus.lib/a.

    Either way, the following headers must be included in the game server:

    • one/arcus/c_api.h

    • one/arcus/c_error.h

    • one/arcus/c_platform.h

    Using the API

    For C++ game engines, the additional C++ code in one/fake/arcus/game is can be used in your integration to wrap the C API and provide easy-to-use C++ interfaces for the game engine.

    The ONE Server Wrapper, defined in one/fake/arcus/game/one_server_wrapper.cpp, is the core of this sample. It is a C++ header/cpp wrapper around the ONE Arcus Server API that does the following actions:

    • Isolates the ONE API from the rest of the game code.

    • Contains in-source code comments explaining the motivation and purpose of the API calls from the user's perspective.

    • Can be directly copied and used as a head-start for developers integrating the library into their own engines.

    See the Fake Game readme for details.

    Testing and Deploying

    While developing the integration, the Game Server may be tested by building and running the Fake Agent. The Fake Agent can connect to a running instance of the game server, to test the basics of the integration without needing to deploy to the remote ONE Platform.

    Once the integration is complete, the Game Server must be deployed to the ONE Platform for final testing. This consists of the following steps:

    1. Setup an application on the ONE Platform.

    2. Deploy the Game Server with the Arcus integration to the ONE Platform.

    3. Use the platform dashboard and tools to confirm the Agent is successfully connected with the server and that all messages are functioning as expected.

    Network Activity

    The One Arcus API has relatively low network activity. It's rare for messages to be sent and received. The most common messages will be small keep-alive packets sent and received several times a minute.

    Integration Guide - Ping Component

    The goal of the integration is to obtain network ping latency values from the player to the game server locations.

    Adding the library to the Game

    The one/ping folder must be copied to the project and configured for building.

    Alternatively, to integrate binaries and headers:

    1. Build the repository.

    2. Copy the binaries found in build/one/ping.

    Either way, the following headers must be included in the game server:

    • one/ping/c_api.h

    • one/ping/c_error.h

    • one/ping/c_platform.h

    Using the API

    For C++ game engines, the additional C++ code in one/fake/ping can be used in your integration to wrap the C API and provide easy-to-use C++ interfaces for the game engine.

    The sites and pingers wrappers, located at one/fake/ping/i3d_sites_getter_wrapper.cpp and one/fake/ping/i3d_pingers_wrapper.cpp, are the core of the sample integration. They are C++ header/cpp wrappers around the i3d Ping C API that:

    • isolates the ONE API from the rest of the game code

    • contains in-source code comments explaining the motivation and purpose of the API calls from the user's perspective

    • can be directly copied and used as a head-start for developers integrating the library into their own engines

    See the Fake Game readme for details.

    Testing

    No special testing configuration is needed. Integrate the ping component into your game and inspect the results for correctness.

    Performance

    The library performs HTTP calls (through your engine's own solution), decodes JSON, and makes outgoing TCP ping calls. The frequency of this activity can be controlled directly by your integration.

    Create your game template

    When you create a game deployment template, it will indicate which game server application builds you would like to have deployed within a fleet.

    1. Go to Game Hosting > Templates.

    2. Select the Game tab.

    3. Click Create template.

    4. On the Create Game Template window, enter the Game Template Name.

    5. Select your Application Build.

    6. Click Create.

    Utility template overview

    The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (Bare metal or Virtual machine). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on Bare metal servers or Virtual machines, or both.

    Utilities / sidecars must be regular applications that run in the foreground. It is generally not a good idea to start utilities as a service.

    Create your utility template

    1. Go to Hosting > Templates.

    2. Select the Utility tab.

    3. Click Create template.

    4. Enter your Template name.

    5. Select your Application Build from the drop down list.

    6. Select what machines you want to Deploy on from the drop down list.

    7. Click Create.

    Dependency template overview

    The Dependency template enables you to point to scripts (ApplicationBuilds) that install dependencies onto a host that are required by your Applications to run properly. Besides an installer script, you must also define an uninstaller script to remove the dependencies and to allow clean up of a host after removing all applications running on it.

    Create your dependency template

    1. Go to Game Hosting > Templates.

    2. Select the Dependency tab.

    3. Click Create template.

    4. Enter your Template name.

    5. Select your Dependency Installer Build from the drop down list.

    6. Select your Dependency Uninstaller Build from the drop down list.

    7. Click Create.

    Create your Host Capacity template

    When you create your own host capacity template, you define how many game instances you want deployed on any specified Bare metal and/or Virtual machine instance types.

    1. Go to Game Hosting > Templates.

    2. Select the Host Capacity tab.

    3. Click Create template.

    4. Enter a Template name.

    5. Click Add host capacity.

    6. Select a Provider from the drop down list.

    7. Select your Instance Type from the drop down list. Please note that depending on your Cloud provider choice, your instance type selections will differ.

    8. Click Save.

    Related topics

    • Define your application and create your application build

    • Game deployment environment, profile, and fleets introduction

    • Orchestrator Overview

    Indicates whether to send progress reports to the email address (0: no, 1: yes)

    resultReport

    int

    Yes

    Indicates whether to send the final report to the email address (0: no, 1: yes)

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    A unix timestamp of when this element was created

    int

    Read-only

    Total number of failed (to deploy) ApplicationInstances

    The ApplicationBuild ID that will replace the old one

    int

    Read-only

    Number of populated CPU sockets

    cores

    int

    Read-only

    Total number of cores (sum of all CPU cores)

    threads

    int

    Read-only

    Total number of threads (sum of all CPU threads)

    info

    string

    Read-only

    CPU information

    type

    string

    Read-only

    CPU type

    Host

    ipAddress

    string

    Read-only

    An IP address

    ipVersion

    int

    Read-only

    4: IPv4 6: IPv6

    private

    int

    Read-only

    0: public IP address 1: private IP address

    RFC 1918
    ApplicationInstance
    Application
    platform variables
    platform variables

    Windows 10 Pro, Visual Studio 2017 and VSCode

  • Ubuntu 18.04, VSCode

  • Tests contains all automated tests for the SDK source.
  • Docs contains additional readme files and DOxygen configuration.

  • file an issue
    add an issue
    Arcus
    Ping
    Fake
    here
    on the asset store
    here

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Optional payload of the packet

    byte

    8 bit character

    ushort

    16 bit unsigned integer

    uint

    32 bit unsigned integer

    ulong

    64 bit unsigned integer

    Version

    byte

    Version number of the request

    Flags

    byte

    Request packets use 0x01

    Opcode

    byte

    Identifier of the request

    Reserved

    byte

    A reserved byte not in use right now but can be used for future purposes

    Handling Server Query Response

    id

    string

    Read-only

    Unique identifier of this element

    fleetId

    string

    Yes

    The Fleet ID to include in the PatchJob

    PatchJob

    List of DeploymentContainerLocation elements that indicate data center locations that belong to a region

    DeploymentContainerLocation

    Amazon Web Services - we always refer to the EC2 section.

    Bare Metal Server

    A physical server in a data center. More information.

    Deployment Environment

    The topmost element that encompasses all of your deployment related configurations for a hosted game. More information

    Deployment Profile

    The profile that defines how and where your applications are deployed. More information

    Game Instance

    An Application Instance of type "game". See Application Instance.

    Game Server

    An Application Instance of type "game". See Application Instance.

    GCP

    Google Cloud Platform - we always refer to the Compute section.

    Host

    A machine that hosts your application instances. This can be a bare metal machine, or a virtual machine - the word Host is agnostic in this sense and simply refers to an OS in which programs can be installed and run. More information

    Matchmaker

    A back end service run by game publishers that allocates game servers in the regions where game clients want to play a game or match and informs said game clients about the game server details, so they know where to connect to.

    Patching

    This is the process of updating game servers / utilities to a new version of the software.

    Preloading

    To shorten deployment times during an update process, the software archive / build you want to deploy will be uploaded and extracted onto all applicable hosts, before starting the actual deployment process. More information

    Utility Instance

    See Application Instance.

    Virtual Machine

    A virtualized server. Often hosted at e.g. AWS or GCP, on a large bare metal server that hosts one or more virtual machines. More information.

    More information
    More information
    More information
    More information

    There is a different procedure for patching utilities. For more information, see the Utility Patching Process documentation.

    Patch Job Instance Selection

    A Patch Job is always applied to a certain selection of application instances (game servers only). To make a selection, you must configure a number of options when creating a Patch Job:

    Option
    Description

    DeploymentEnvironment

    The DeploymentEnvironment within which you want to perform a build update

    Application

    The Application that you want to patch

    ApplicationBuild

    The currently running ApplicationBuild you want to replace with a new build

    Fleet(s)

    One or more Fleet elements within which we look for the given ApplicationBuild to update

    Table 1: Patch Job instance selection parameters

    Patch Job Details

    After creating a selection of Instances, you can configure the Patch Job itself and provide some details:

    Option
    Description

    Name

    The Patch Job Name

    Method

    The patching method, e.g. Forced deployment, Rolling deployment, A/B deployment

    Start time

    The desired start time of the Patch job

    Graceful stop(-timeout)

    Whether or not to send a graceful stop command as opposed to an immediate stop. Comes with a maximum-drain-timeout value

    Comments

    Any comments you would like to add to the Patch Job - maybe for other viewers to see

    Reporting email addresses

    You will receive start, progress and final reports on the email addresses you provide

    Table 2: Patch Job details and configuration parameters

    Patch Job Reporting

    You can accompany the Patch Job with a list of email addresses to which we will send start, progress and final reports. You can indicate for each email address whether to receive start & final reports and / or progress reports.

    The Patching Process

    5 minutes before the start time of a Patch Job, distribution of the new build towards all the relevant hosts begins, allowing for a quicker patching process later on.

    Once the start time has been reached, the Patch Job will begin to run. First it collects information on all the application instances in your Patch Job selection and generates an initial report about it, which is sent to all relevant email addresses stored within the Patch Job.

    Then the patching process itself begins. Which actions are performed depend on the selected patching method and are described in their respective chapters:

    • Forced Deployment

    • Rolling Deployment

    • A/B Deployment

    Once the Patch Job is complete, a final report is generated and sent to all relevant email addresses.

    Canceling a Patch Job

    You can cancel a Patch Job for as long as it's not finished yet. If you cancel a running Patch Job, we stop issuing new commands and update the Job's status. Then we revert all the already performed actions by creating an inverted Patch Job which will start running immediately.

    Patching Related API Elements

    The patching process introduces a few elements, used by all patch options:

    • PatchJob - the element representing a scheduled patching process

    • PatchJobProgressReport - the element containing information about an ongoing PatchJob

    • PatchJobFinalReport - the element containing a summary of a completed PatchJob

    Forced Deployment
    Rolling Deployment
    A/B Deployment

    Read-only

    The type of disk

    diskMedium

    string

    Read-only

    The medium of this disk

    model

    string

    Read-only

    The model name of this disk

    product

    string

    Read-only

    The product string of this disk

    diskSerial

    string

    Read-only

    The serial number of this disk

    firmwareVersion

    string

    Read-only

    Firmware version

    rotationRate

    int

    Read-only

    Rotational rate (does not apply to SSD)

    sectorSizeLogical

    int

    Read-only

    Logical sector size

    sectorSizePhysical

    int

    Read-only

    Physical sector size

    size

    int

    Read-only

    Disk size in bytes

    Table 1: HostDisk element structure

    Element relation

    The HostDisk element is part of the Host element and is not used stand-alone.

    diskType

    Host

    string

    Read-only

    The brand name

    model

    string

    Read-only

    The model name

    size

    int

    Read-only

    Size in bytes

    speed

    int

    Read-only

    The speed this memory module runs at

    ecc

    int

    Read-only

    Set to 1 if ecc is supported and enabled

    memoryBank

    int

    Read-only

    The bank this module sits is

    memoryType

    string

    Read-only

    The type of memory module

    memorySlot

    string

    Read-only

    The slot this module sits in

    memorySerial

    string

    Read-only

    The serial number of this module

    Table 1: HostMemory element structure

    Element relation

    The HostMemory element is part of the Host element and is not used stand-alone.

    brand

    Host

    string

    a game server public network port, ApplicationProperty "game_port" with default value 0 (random port)

  • a default revision value, ApplicationProperty "revision" with value 1.2.13

  • ApplicationProperty
    Application Build Management
    POST /v3/application
    Application
    Arcus
    POST /v3/application/{applicationId}/property
    ApplicationProperty
    More information on the network port property type
    POST /v3/application/{applicationId}/property
    ApplicationProperty
    More information on the network port property type
    POST /v3/application/{applicationId}/property
    ApplicationProperty
    More information on platform variables

    id

    string

    Read-only

    Unique identifier of this element

    name

    string

    Yes

    The name of the HostCapacityTemplate

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    Table 1: HostCapacityTemplate element structure

    API example

    Create a new HostCapacityTemplate within your i3D.net account.

    Full API reference

    HTTP request

    POST /v3/hostCapacityTemplate

    Request body

    Response body

    Assignment to a Fleet

    A HostCapacityTemplate can be assigned to a Fleet. Here is a simple example to show you how:

    Full API reference

    HTTP request

    PUT /v3/fleet/{fleetId}

    Request body

    Response body

    Assignment to an ApplicationBuild

    A HostCapacityTemplate can also be assigned to an ApplicationBuild. This will override a HostCapacityTemplate set in the Fleet. This is useful if you want to test optimizations of a new build, to see if you can deploy more game instances than before.

    Full API reference

    HTTP request

    PUT /v3/applicationBuild/{applicationBuildId}

    Request body

    Response body

    Related element

    This element contains a list of InstanceTypeCapacity elements.

    InstanceTypeCapacity
    {
      "type": 1,
      "managementProtocol": 2,
      "name": "Bluewolf",
      "websiteUrl": "www.bluewolf.game.com",
      "description": "Life is not the same after meeting your worst enemy",
      "developerName": "Crywolf",
      "publisherName": "ThePubs"
    }
    {
      "propertyType": 1,
      "propertyKey": "game_port",
      "propertyValue": "0"
    }
    {
      "propertyType": 6,
      "propertyKey": "managementport",
      "propertyValue": "0"
    }
    {
      "propertyType": 0,
      "propertyKey": "revision",
      "propertyValue": "1.2.13"
    }
    {
      "name": "MyHostCapacityTemplate"
    }
    [
      {
        "id": "4943474277300823573",
        "name": "MyHostCapacityTemplate",
        "createdAt": 1579007256
      }
    ]
    {
      "hostCapacityTemplateId": "4943474277300823573"
    }
    [
      {
        "id": "7420099900751948711",
        "name": "Bluewolf PC",
        "deploymentEnvironmentId": "173892217340309897",
        "deploymentProfileId": "8068976724396537810",
        "gameDeploymentTemplateId": "2190484266497878757",
        "utilityDeploymentTemplateId": "1316371245160957961",
        "dependencyDeploymentTemplateId": "6537333393893172977",
        "hostCapacityTemplateId": "4943474277300823573",
        "operationalStatus": 0
      }
    ]
    {
      "hostCapacityTemplateId": "4943474277300823573"
    }
    [
      {
        "id": "794401102378076360",
        "name": "Bluewolf PC build",
        "applicationId": "7983757100270474749",
        "type": 1,
        "executable": "GameServer",
        "startupParameters": "-applicationInstanceId VARAPPLICATIONINSTANCEID -maxplayers 8",
        "instanceDoesReadyCallback": 0,
        "installId": 8675,
        "osId": 151,
        "hostCapacityTemplateId": "4943474277300823573",
        "createdAt": 1568899371,
        "label": []
      }
    ]

    primaryInstanceTypeName

    string

    Yes

    The primary instance type to use

    secondaryInstanceTypeName

    string

    No

    The secondary instance type to use

    cpuPlatform

    string

    No

    The CPU platform to use for the given cloudProviderId. Get all possible values from . Note that this selector is currently only required for the GCP cloud platform)

    markedForDeletion

    boolean

    Read-only

    If set to true, the platform will gracefully remove all game servers and VMs in this cloud location. Afterwards this cloud location will really be deleted

    id

    string

    Read-only

    Unique identifier of this element

    cloudProviderId

    int

    Yes

    The cloud provider ID of this location

    dcLocationId

    int

    Yes

    created and updated inside the DeploymentRegion element
    DeploymentContainer

    The dcLocation ID (see )

    GET https://api.i3d.net/v3/deploymentEnvironment

    API v3 authentication

    Authentication occurs via an API key. Creation and usage is explained in the API Authenticaton chapter.

    API v3 endpoint documentation

    All endpoints presented by the API including their input and output headers, parameters, request and response objects are documented at the following URL:

    https://www.i3d.net/docs/api/v3/

    REST / CRUD

    Our API v3 is based upon REST principles. It is however mostly used as a CRUD API. This means that you are almost always working with objects that you can Create, Read, Update and Delete. Even when you initiate a process like starting a game server with:

    POST /applicationInstance/{applicationInstanceId}/start

    With this POST request you are still creating an object (a Task) that represents the process of starting an application instance and allows you to track that process. As such nearly all endpoints (unless stated otherwise) will return one or more objects, except certain DELETE requests, which will return 204 No Content with no response body.

    Response output for valid requests

    All valid GET, POST and PUT requests return a 200 OK response code and an array of objects in JSON format in the response body. Even if the response contains only one object you will still get an array with that one object inside.

    DELETE requests always return a 204 No Content without a response body.

    Response output for erroneous requests

    In case your API request triggered an error, an error object will be returned:

    The Error object contains an errorCode allowing you to programmatically handle it. There also is an errorMessage for humans to read.

    Additionally an array of errors is returned in the object for additional information on what went wrong. E.g. if you have errors in a submitted object, this array will contain the error specifics.

    Further reading: handling API errors

    HTTP response codes for erroneous requests

    Erroneous requests will have any of the following HTTP response codes, depending on the type of error:

    Response Code
    Description

    401 Unauthorized

    When failed.

    403 Forbidden

    When you are not allowed to perform a certain action E.g. when your IP is banned by the system, or when you are attempting to perform an action outside of the allotted time window.

    404 Not Found

    When a requested entity could not be found.

    422 Unprocessable Entity

    When a submitted entity contains errors. The specific errors will be mentioned in the returned Error object.

    500 Internal Server Error

    When there was an internal problem with the server or API.

    Table 1: HTTP response codes for errors

    Caching

    A RESTful architecture can allow for caching of individual elements returned by the API. However we recommend you do not cache any elements, because they may be altered by other people or services at any point in time. As such we do not indicate caching hints in our API responses.

    Manual deployments

    ApplicationInstances will normally be deployed dynamically and automatically by the platform. You can however deploy them manually as well, e.g. if you just want to test a build.

    Manually deploying new ApplicationInstances is a two-step process:

    Creating the instance entity

    The first step into deploying a new ApplicationInstance is to create an entity for it. From that moment on it exists in our system (but is not yet deployed):

    POST /v3/applicationInstance/fleet/{fleetId}/host/{hostId}

    JSON request data ApplicationInstance:

    Parameter fleetId can be obtained from GET /fleet Parameter hostId can be obtained from GET /host

    labelPublic usage explained metadata usage explained

    Deploying a software build

    With the entity created, you can now deploy an ApplicationBuild for it:

    POST /v3/applicationInstance/{applicationInstanceId}/deploy

    JSON request data:

    Parameter applicationInstanceId is the ID of the previously created ApplicationInstance. Parameter applicationBuildId can be obtained from GET /applicationBuild

    This call will trigger the deployment process for the ApplicationInstance.

    Automatic deployments

    ApplicationInstances are normally deployed automatically by the platform. This would at least be the case for the live environment of your game. For this to happen, all you have to do is enable automatic deployment and / or automatic scaling in the Fleet(s) created for your live environment. Please see the Fleet's Operational Status documentation.

    For the complete documentation on automatic deployment and scaling, please see the Automatic Deployment chapter.

    The deployment process

    Below is a schematic overview of the (automatic) deployment process for an ApplicationInstance:

    Figure 2: ApplicationInstance deployment process

    The default installPath and instancesPath on Linux are:

    • installPath: /home/gameinstalls

    • instancesPath: /home/gameinstances

    The default installPath and instancesPath on Windows are:

    • installPath: C:\localuser\gameinstalls

    • instancesPath: C:\localuser\gameinstances

    ApplicationInstance
    Deployment Configuration
    DeploymentEnvironment
    Fleet
    Region
  • ApplicationBuild

  • ApplicationBuildProperty

  • ApplicationBuildConfiguration

  • ApplicationInstance

  • ApplicationInstanceProperty

  • ApplicationInstanceIP

  • Label

  • Metadata

  • Element Relations

  • Platform Variables

  • Deployment Elements

    • DeploymentEnvironment

    • Fleet

    • DeploymentProfile

    • DeploymentRegion

    • Deployment Templates

    • Host Capacity Templates

    Host Elements

    • Host

    • HostCpu

    • HostIp

    • HostDisk

    Patching Elements

    • PatchJob

    Application
    ApplicationProperty
    Description

    id

    string

    Read-only

    Unique identifier of this element

    configPath

    string

    Yes

    A path relative to the root of an application

    configName

    string

    Yes

    The name of the configuration file

    configContents

    string

    Yes

    The contents of the configuration file

    createdAt

    Table 1: ApplicationBuildConfiguration element structure

    Note about configPath

    The configPath property defines in which folder to store the configuration file. The folder is always relative to the root (working directory) of the deployed ApplicationInstance's folder on the Host.

    • if the folder does not exist, it will be created

    • if configPath is /, \ or ., it will be translated to point to the ApplicationInstance's working directory

    Relations

    See also: Application element relations

    Restrictions

    You can have any number of ApplicationBuildConfiguration elements assigned to an ApplicationBuild. There is no limit.

    Application
    ApplicationBuild

    Game Deploy

    This document introduces you to the three concepts of the deployment configuration hierarchy. Next, you will learn how to create your own environment, profile, and fleets in the dashboard.

    • Deployment environment: The deployment environment is the top most element in the deployment configuration hierarchy. It is normally used to reflect a game title that you host on our platform, split up into development, testing, and production environments.

    • Fleet: The Fleet is the second layer within the deployment configuration hierarchy, which represents a collection of hosts (Bare metal or Virtual machines). You can have as many Fleets under a deployment environment as you like. There are no limits.

    • Deployment profile: The deployment profile is the main element that determines how your application instances will be deployed.

    Create your deployment environment

    It's recommended to create an environment per title. Additionally, it's advised to separate your live environment from any development environments. When you separate the environments, changes and experiments done for development purposes in a development environment won't affect your live environment. Within a game deployment environment, you can create multiple Fleets in case you want to separate for different platforms such as PC, PS4, Xbox, Switch, and more.

    1. Go to Game Hosting > Deployments.

    2. Click Create enivronment.

    3. Enter your Environment Name.

    4. Click Create.

    Create your deployment profile name

    A deployment profile is always the only child of a fleet. You can only have one deployment profile per fleet.

    1. Go to Game Hosting > Deployments.

    2. Select the Profiles tab.

    3. Click Create Profile.

    4. Enter the Name of your profile.

    Create your deployment profile settings

    1. After you have created your deployment profile name, click the cog icon to the right of the profile name to set your Profile settings.

    2. On the Profile page, the default Global Strategy setting is Round Robin. For more information about the Round robin strategy, see .

    3. To define the amount of instances you want to deploy in a specific region, enter your Miniumum amount of instances and Maximum amount of instances in the Global Capacity section.

    1. Next you will need to create your region. Follow the steps below.

    Create your deployment region

    This defines a geographical region that contains one or more i3D.net data center (dc) locations.

    1. On the Profile settings page, click Create region.

    2. On the Create Region pop up window, select at least one i3D.net location and click Next.

    3. Enter the Region Name and click Create.

    4. Follow the steps below to Add Bare Metal locations and cloud groups

    Add Bare Metal locations

    1. Click the cog wheel icon next to the deployment region you just created. This will bring you to the region settings page.

    2. To add location to a Bare Metal Group, Click Add location.

    3. On the Add Bare Metal Location window, select your location.

    4. Click Save.

    Add cloud groups

    A cloud group is a wrapper that holds multiple cloud locations to burst towards when your bare metal pool runs dry.

    1. Click Add cloud location.

    2. On the Add Cloud Location window, select your Cloud provider from the drop down list.

    3. Select your Location from the drop down list.

    4. Select your Primary instance from the drop down list.

    Create your fleets

    Fleets are normally used to differentiate between different builds or platforms such as PC, Xbox, Playstation, Switch, and more. But you can use fleets to deploy instances for temporary or testing purposes while keeping these separate from other fleets. Be aware that you cannot deploy multiple fleets on one host at a time.

    1. Go to Game Hosting > Deployments.

    2. Select the Fleets tab.

    3. Select your Deployment Environment that you want to add the fleet to from the drop down list.

    4. Click Create fleet.

    Enable your deployment

    After you have set your Minimum Capacity on your Deployment profile to anything higher than 0, then you can see the instance being deployed and online on the Instance Management page.

    Related topics

    Automatic Scaling

    This chapter explains the logic behind our automatic scaling process.

    For more information on how to enable the automatic scaling mode for a Fleet, please see the Automatic Deployment chapter.

    For more information on how the deployment process works, please refer to the Deployment Process chapter.

    The reasons for having a scaling mechanism

    Before explaining how the scaling mechanism (the Scaler) works, let's take a minute to understand why a dynamic deployment system is important.

    You will never run out of available game servers

    If your game is higly successful, you can experience a sudden influx of players. Your basic game server capacity deployed onto your own bare metal servers may not be sufficient in that case. You could order more bare metal servers to increase capacity, but by the time we have delivered them to you, it may be too late to cater for the ingress of new players. This is where cloud scaling comes into play. To fill this gap in game server resources, we have created a dynamic game server deployment system that can scale onto any cloud platform. This has the result that you will never have a shortage of game servers. Even if a cloud provider is down entirely, there will still be other cloud providers that we can deploy game servers onto. We can pretty much guarantee game server availability this way.

    Cost savings

    Even though you could host your entire game in the cloud, we strongly advise using our bare metal servers as much as possible, or at least for your base requirements. Our bare metal servers simply perform better than cloud VMs. But not only that, renting a bare metal server for a month (or longer) is much cheaper than renting a similary sized VM for a month.

    How the Scaler works (overview)

    The Scaler combines the major elements described in this documentation in order to deploy game servers when and where they they are needed. The Scaler needs to know which application (builds) it needs to deploy ( & ) and where to deploy them (). Together with live game server status information ( / ) the Scaler knows the amount of occupied and free game servers and can then determine whether there are too few or too many free game servers and deploy or remove game servers as needed.

    This in a nutshell is how the scaler operates.

    Deployment occurs per-region, per-location, per-ApplicationBuild

    The scaling mechanism always operates on a combination of DeploymentRegion + DC location + ApplicationBuild. You can view each of these combinations as stand alone environments on which the scaling mechanism operates.

    Figure 1: Combinations of region + location + build the Scaler operates on

    This means that the Scaler will iterate over all the regions in your DeploymentProfile, then within each region it iterates over all DC locations and then per location it iterates over all the s defined in the of your . Then for each ApplicationBuild it will do its checks to see whether the amount of ApplicationInstances is too low, too high or just right.

    To summarize, the scaling mechanism always operates on individual combinations of region + DC location + ApplicationBuild. Deployment of game servers first occurs on bare metal servers and when they are full, the Scaler continues to deploy onto any configured cloud locations.

    Host selection (round robin strategy)

    When the scaling mechanism needs to deploy a new , it will first look for a usable bare metal host (BM). If you have run out of BM hosts, the Scaler will continue with cloud VMs, provided you have configured cloud locations in your .

    A selected BM or VM host will be fully filled with instances before the mechanism will find the next free host. The number of instances that can be deployed onto a host is defined individually for each BM or VM instance type and is explained in the chapter "".

    Differences with host selection between using items in a containerLocation versus multiple containerLocations

    When you define multiple items within a containerLocation they will be treated in a round-robin fashion. When you have multiple containerLocations they will be processed sequentially.

    Here is a simple example:

    • If you have a primary on Google Cloud and Azure, then the Scaler ensures that both are running an equal amount of Game Servers, which will always make sure that first a cloud is filled up completely.

    If you have 8 core machines on Google Cloud and 4 core machines on Azure, and you request 16 Game Servers, then you will have the following combination:

    • 1 Google Cloud and 2 Azure VMs: (8 + 4 + 4 = 16 Game Servers).

    Example when using multiple containers

    When you use multiple containers, the process works differently.

    • Container A is set up the same: You have 2 Azure and 1 Google Cloud VMs

    When Google Cloud doesn't have anymore capacity, then the following process occurs:

    1. The machine will switch over to Azure.

    2. Also, the secondary machine needs to be out of quota.

    When you have a primary and secondary with Google and Azure, then the switch over will occur if you cannot spin up any more VMs within the primary. If you request for 16 games instances and Azure is out, then you get 2 Google instances.

    If Google and Azure doesn't have anymore capacity, then the following process occurs:

    1. It will switch over to the secondary container.

    2. Within the secondary container (for example, if it contains Amazon and Tencent inside) then a round robin is performed again for those 2 containers until the primary has capacity again.

    Initializing an empty host

    When a new, empty host (BM or VM) has been selected for game server deployment, the scaling mechanism will first deploy all the utilities (sidecars) defined in your . After that, the new game server(s) are deployed.

    Removing instances (downscaling)

    If at any moment in time too many application instances are deployed, the scaling mechanism will start removing unused instances until the number of free / unallocated instances equals the again.

    If you have application instances deployed onto VMs, we will remove those first. Only empty instances are removed, of course. If no VMs are in use, or if there are no VMs with free / unallocated instances, the Scaler will continue downscaling instances on bare metal hosts.

    The host with the least amount of application instances (or secondary, with the most free instances) will be selected as the host to start removing instances from. This attempts to help with freeing up VMs so we can destroy them, reducing cloud hosting cost as much as possible.

    Keep in mind though that we do not control (gaming) clients already playing on a game server deployed onto a VM. That means that if your game server hosts matches that do not necessarily end, or take a long time, a VM cannot be destroyed until all those players have left the game server. If your game falls into that category you may want to invest in a mechanism that can transfer players to another game server, in an attempt to reduce cloud hosting costs.

    Cleaning up a host when it's empty

    After the last game server instance has been removed from a host, any side cars (utilities) will also be removed. If the host concerns a VM, the VM will be destroyed. A bare metal host will become usable again for deployments (for the same or another environment / fleet / any other purpose).

    Dclocation

    The DcLocation element represents a data center in a certain location. This can be an i3D.net data center or one of a cloud provider. The latter parties often refer to this as a region, but really these are simply data centers with a varying degree of redundancy in the form of availability zones.

    Usage

    The DcLocation element is used throughout your DeploymentProfile, or more specifically DeploymentRegions and DeploymentContainerLocations, where you can specify in which data center you want to deploy your applications.

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: DcLocation element structure

    Examples

    Below you will find some example DcLocation elements along with explanations.

    HTTP request

    Response body

    The first entry with ID 6 represents an i3D.net data center (providerId = 1). It is located in Europe (continentId = 5), in Rotterdam, the Netherlands. It has no availability zones and no region name. These are only populated for cloud locations. This is an i3D.net data center.

    The second entry with ID 29 represents an AWS data center (providerId = 27). It is located in Europe (continentId = 5), in Frankfurt, Germany. It has 3 availability zones and its region name is the official AWS region "eu-central-1".

    The third entry with ID 64 represents a GCP data center (providerId = 31). It is located in North America (continentId = 7), in Montreal, Canada. It has 3 availability zones and its region name is the official GCP region "northamerica-northeast1".

    Availability zones

    You cannot configure / specify availability zones in your . The platform will create VMs in a round-robin fashion to spread your VMs over all available availability zones automatically.

    Label

    Labels are pre-defined or custom key / value pairs that can be tied to elements for easy recognition and selection.

    The following elements in the platform can have labels:

    • ApplicationBuild

    • ApplicationInstance

    • Host

    Structure

    Property
    Value type
    Required
    Description

    Table 1: Label element structure

    Requirements

    A Label element has the following constraints:

    • allowed characters in the label key are a-z 0-9 _ -

    • the label key may be no longer than 50 characters

    • the label value may be no longer than 150 characters

    Adding & updating labels

    Labels in the ApplicationBuild and ApplicationInstance elements are stored as an array of Label elements:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 1: Example labels for an ApplicationInstance element

    When you want to add a new label, you can PUT an element with only that new label. You would submit:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 2: Example of adding a new label to an ApplicationInstance element

    The result will be that the element has 3 labels: label1, label2 and label3.

    When you want to update a label, you only have to submit that one label for the element:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 3: Example of updating an existing label of an ApplicationInstance element

    Deleting a label is done by submitting a label with a null value:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 4: Example of deleting a label from an ApplicationInstance element

    After these example mutations, the element ends up with the following labels:

    GET /applicationInstance/{applicationInstanceId}

    Figure 5: The resulting labels for an ApplicationInstance element after applying the examples

    Pre-defined labels

    For ApplicationInstance elements, the platform creates a number of default labels (platform defined labels):

    • application_id

    • fleet_id

    • host_id

    • dc_location_id

    These labels are always present for all ApplicationInstance elements. It does mean that user-defined labels cannot have the same name as platform defined labels. These names are reserved.

    Using labels

    Labels can be used to trim selections of elements.

    In the API v3, using labels is done by adding a label expression as an URL query parameter.

    An example of a label expression:

    When used in an API v3 request the expression must be url encoded:

    If you filter on region_name (or any other label with a string value) you must wrap the search value in double quotes:

    The url encoded request:

    Application Build Provisioning

    The purpose of the i3D.net ONE Game Hosting platform is to deploy your applications. Providing your builds to the platform therefore is a crucial process. On this page we will explain how you can upload your builds.

    Origin node request / registration

    An origin node is simply a server to which you can upload your build archives and from where our platform can download builds. A build archive file will be downloaded, cached and distributed by the i3D.net CDN as soon as the first deployment of your application takes place.

    The i3D.net CDN (Content Delivery Network) will download your build from an origin node, using HTTP(S). That means that an origin node must run a web server. Files are often secured by firewalls allowing only certain IP addresses, or by means of HTTP headers to add an additional layer of security. We prefer JWT tokens, but any kind of header aimed at security will work, e.g. an Authorization header.

    Currently, requesting or registering an origin node is not an automated process. You will have to request or register an origin node via ticket for the time being.

    Custom CDN Domain Name

    Origin nodes must be registered in our system so our CDN knows where to grab your archives. And because files are distributed by our CDN, you will also be given a XXXXX.cdn.i3d.net sub-domain. While requesting or registering your origin node you can indicate the desired sub-domain prefix.

    i3D.net provided origin node

    You can request an origin node provided by i3D.net. At the time of writing, you must request this through a ticket and you must be a game hosting client.

    When requesting an i3D.net provided origin node, you must provide us with the following details:

    • a custom name for your origin node

    • desired CDN domain (XXXXX.cdn.i3d.net where you can choose XXXXX)

      • only a-z characters allowed, max length: 16 characters

      • if it's no longer available we will ask for a new suggestion

    Once setup, we send you the login details, after which you can upload your first build to the origin node using the SCP or Rsync-over-SSH protocol.

    You can find your registered origin node in our API by performing a request on . You will need these details when creating an ApplicationBuild.

    Structure of your build archive

    For the best deployment predictability of your application, please ensure that your build archive's root contents is the root of your application's folder. By that we mean, ensure you do not have only a folder in the root of the archive that contains all the files. The root of your archive must be the root of your application's folder structure.

    Wrong structure

    This faulty example has the game server's root folder inside the archive.

    Figure 1: Wrong archive folder structure

    Correct structure

    This correct example has the game server's files immediately in the archive root. You are permitted to create a folder and place your packed game server there.

    Figure 2: Correct archive folder structure

    Upload your build archive

    Using the credentials provided by us, log in on the origin node and upload your file. Be sure to only use zip or rar files.

    You must use the origin URL to upload your files, not the CDN domain name. Also, you must upload your files with sFTP (on port 22).

    List files on your origin

    Once your file is uploaded, it will be available in the following list with a very small delay (seconds).

    API Documentation:

    Create ApplicationBuild element

    With your file uploaded to our platform, you can point to it in your ApplicationBuild element. This process is described in the next chapter:

    Do not delete the build archive file from your origin until you are no longer deploying it and until you have disabled the ApplicationBuild that uses it!

    Build distribution via CDN

    Distribution of your build archives towards your gaming hosts is done via the i3D.net CDN (Content Delivery Network). The CDN is comprised of servers in many regions. Each region will individually download the build archive from your build origin and cache it. The default cache time-to-live is 7 days for any file served by the CDN. This TTL is not reset, so after 7 days the file will always be purged. If the file is downloaded again through the CDN, the file will be pulled from your origin again.

    It is therefore very important you do not remove build archives from your build origin until you really do not need it anymore.

    Changing a file in the CDN : Guidelines to follow

    Before you update a new file, you must disable the fleet to ensure that there is no running application instance deployed on it.

    When you change or upload a new file in the CDN the following steps will occur:

    1. The old file with the same name in the CDN is deleted.

    2. A new file entry is automatically created for you with a new ID.

    Next steps after you create a new file ID:

    1. You must create a new application build with the newly created file ID.

    2. Link your newly created file ID to your fleet so that you can use it.

    Related topics

    Game server run status

    Many game servers have an initialization process to go through when starting up. This has the effect that the game server will not actually be usable during this initialization period. Our platform should know about this, otherwise it will assume the game server is ready to accept clients immediately after starting. For this to be possible, your game server can let our back end know when it is ready to accept players. We refer to this as a "game server run-status update" and can be performed by having the game server make an API call either towards our public API, or locally on the host towards our Host Agent.

    You do not have to worry about this if your game server start (nearly) instantly. We will by default set a game server's run-status to "RUNNING" after starting it.

    Please refer to the ApplicationInstance status chapter for more information about all possible status values.

    Public API example

    The following example illustrates how to change the run-status of a game server via the public API.

    If you let your game server do this call, remember that it will need to be given an API key from your i3D.net account. You can pass an API key through the .

    HTTP request

    Request body

    <NOT NEEDED>

    Response body

    Local Host Agent API example

    TBD

    Management Protocol

    A management protocol is a means for a game server to be queried or controlled by an external source. In this case the external source is i3D.net's ONE Game Hosting service.

    Management protocols are used for different purposes. They can allow for an external program to query a game server for live game related information (status queries returning the number of players, the current map, rules, etc), or sending commands for e.g. a graceful (soft) stop. Some management protocols go further than that and allow full administrative functionality for a game server (kick players, send messages to clients, reconfigure map & rules, etc.), but that goes beyond the scope of this article.

    There are different management protocols. Examples of these are A2S, RCON, U3E. Most protocols have the same kind of functionality, but their implementations can differ. So in order for our system to communicate with your game servers, you have to indicate which management protocol they support. You can indicate this in the Application element(s) you create for your game server application(s).

    Application management properties

    In order for your game to use a management protocol within our platform, you have to tell it on which network port your management protocol is listening, enabling our Host Agent to connect with it. You do that by adding an to your Application, with:

    • a propertyType of 6 (private network port)

    • a propertyKey called "managementPort"

    • a propertyValue between 30000 and 49151

    If your management protocol / implementation also requires a password (e.g. an admin password) then you must also add the following ApplicationProperty:

    • a propertyType of 2, 3 or 4 (password8, password16, password24)

    • a propertyKey called "managementPassword"

    • a propertyValue empty if you want our system to generate unique passwords for each ApplicationInstance, or fill in a password for this value to pre-define one

    When you set a managementPassword in an Application, you can then use that password in your ApplicationBuild configurations by using VAR_MANAGEMENTPASSWORD. Please refer to the chapter for more information.

    Supported management protocols

    When you create an in our system, you must provide a value for the managementProtocol property. The following table lists the supported protocols and their IDs:

    Protocol ID
    Name
    Description

    Table 1: Supported management protocols and IDs

    Supported features per management protocol

    1: A2S

    • game server information (server query)

    2: Arcus

    • game server information (server query)

    • soft-stop method 1 (Arcus msg)

    • metadata (pushing metadata to the game server, to update its configuration)

    • isAllocated (ask game server for allocation status)

    Requesting support for your management protocol

    If you have a protocol that we currently do not support, or maybe you have one that we support but you've customized it, then please to discuss how we can support your version of the management protocol and how we have to implement it.

    Application Build Management

    Application Build Management is the process of creating and maintaining builds for your . An ApplicationBuild defines the software that will be deployed by our system. It can be a game server or a utility (side car). Whenever you have a software update, you must upload the new build to our system and create an ApplicationBuild for it before it can be deployed.

    Prerequisites

    Before you can create an element, you must first create:

    Application

    An Application is an component that describes a program that the system can deploy. As such, every program you want to deploy must be defined by an Application component. You can specify the application type, whether it has a (only applies to application type Game), give it a name, a website, description, etc.

    Application types

    An Application can be one of four types:

    • a game server (type: Game)

    Build

    Prebuilt binaries are currently not supplied. The integration code is very lightweight. Integrations have two options:

    1. Copy the code in one/arcus directly into the game engine and build directly as part of the regular build.

    2. Or build the repository with the following instructions, and then copy required headers and binaries. Binaries will be output into the build folder; for example, the build/one/arcus/release/one_arcus.lib.

    It's recommended to build the repository as it will also create a fake agent executable to aid testing of your game server without deploying to the remote ONE Platform.

    Platform Variables

    The ONE Game Hosting service has a feature called Platform Variables, which can be used for configuration of your applications. Platform variables come in two types:

    • variables pre-defined by the platform

    • user defined variables

    These variables can be used inside the startupParameters property of an and inside configuration files ( elements), submitted for an ApplicationBuild. Examples are provided near the end of this page.

    Orchestrator overview

    As you may know, multiplayer online gaming has been rapidly growing over the past few years. Many studios are researching game hosting solutions (early during development) that can help their games to be as efficient as possible when it's released. A smooth release of a multiplayer game with an efficient game hosting solution can help with its success. i3D.net understands the importance of that. To help burgeoning game studios in that endeavor, i3D.net offers a new product: The Game Server Orchestrator.

    In a nutshell, the Game Server Orchestrator is a fully customizable game hosting solution that offers scalability solutions (scaling up / down game servers based on demand), health checks, monitoring, and more.

    Specifically, the Game Server Orchestrator operates by connecting to the database that contains the application instance entries and our designated message broker. It first retrieves the current state of the application instances from the database, checking if they are in the correct state. Based on this information, the Orchestrator sends messages through the message broker to communicate with the VM Manager, instructing it to create or destroy virtual machines as necessary. This coordination allows the Orchestrator to manage the provisioning and scaling of game server instances dynamically, ensuring optimal performance, and resource utilization in the game environment.

    Metadata

    Metadata elements are custom, client provided key / value pairs that can be forwarded to application instances (e.g. a game server). The main purpose of this is for a Matchmaker to provide game server configuration values to be sent to a game server upon allocation of said game server.

    In our system, Metadata elements are part of elements.

    See the chapter about the for more information.

    Structure

    Property
    Value type

    Overview

    “A globally scalable game server hosting platform that aims to never run out of game server capacity”

    Introduction

    The i3D.net ONE Game Hosting service has been created to provide game publishers with a globally scalable and high performance game server hosting platform that aims to never run out of game server capacity.

    Game servers will be deployed dynamically in the locations where you need them. Similarly they will be removed if not needed anymore due to overcapacity, while not dropping below the minimum number of deployed game servers defined by you.

    Rolling Deployment Manually

    Updating your game servers with a rolling update means that you update game servers as soon as they exit naturally or when they are empty and unallocated.

    Initial situation sketch

    We have a fleet with 1 ApplicationBuild in its deployment template. 100 game servers have been deployed.

    This chapter assumes you already have created a new for your updated software.

    Platform Events

    This is an experimental feature and currently only available upon request. Details and mechanisms for this feature can change at any moment.

    It is possible to receive events from within our platform, allowing you to get more insight into which actions it performing. You could log these for your own purposes.

    At the time of writing this is an experimental feature that we are testing with a few clients. There is no publicly available endpoint that allows to you automatically sign up to our event stream. But you can request access to it via the usual support channels.

    Arcus V2

    Introduction

    The ONE Arcus Protocol V2 is a TCP/IP-based communication protocol used by the ONE Game Hosting Platform, allowing it to communicate with your game servers and vice versa.

    The Arcus protocol when implemented into a Game Server provides two benefits:

    • Allows a game developer to connect to his game servers to fetch status information and control it

    Dependencydeploymenttemplate

    The DependencyDeploymentTemplate enables you to point to scripts (ApplicationBuilds) that install dependencies onto a Host that are required by your Application(s) to run properly. Besides an installer script, you must also define an un-installer script to remove the dependencies and to allow clean up of a Host after removing all applications running on it.

    Usage

    A DependencyDeploymentTemplate is used by a and defines which ApplicationBuilds (of type DependencyInstaller / DependencyUninstaller) will be deployed for that Fleet. A single DependencyDeploymentTemplate defines both the DependencyInstaller and DependencyUninstaller ApplicationBuild elements. Both are required as we need enforce cleanup of a Host in order to keep it clean and usable by you for other purposes without having to do frequent re-installs of the operating system.

    The DependencyInstaller ApplicationBuild will be installed and executed before the platform deploys any other Application onto a Host.

    Sdk Unreal Plugin

    Version: v0.9 (Beta)

    All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.


    The current version of i3D.net ONE Game Hosting SDK code used in this plugin is referenced .

    Overview

    The plugin provides Unreal Engine game servers with the ability to communicate over TCP with the i3D.net ONE Platform, for easy and efficient scaling of game servers.

    Configuration

    We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

    Arcus currently supports the following configuration options for its protocol:

    IP Address Binding

    Your Arcus server port must be bound to localhost (127.0.0.1). This prevents any security issues that could otherwise arise when binding to a public IP address on a host.

    {
      "errorCode": 10001,
      "errorMessage": "Entity not found",
      "errors": [
        {
          "property": "propertyName",
          "message": "Error message"
        }
      ]
    }
    {
      "labelPublic": [
        {
          "key": "string",
          "value": "string"
        }
      ],
      "metadata": [
        {
          "key": "string",
          "value": "string"
        }
      ]
    }
    {
      "applicationBuildId": {applicationBuildId}
    }

    Listening Port

    Default Value: 6855

    This is the port on which the Application software listens for incoming server query requests. This can be configured by adding the Application Property managementPort.

    Password

    Default Value: <empty>

    It's possible to protect the protocol with a password, for this we need another Application Property: managementPassword

    Continue reading: Packet Structure

    int

    Read-only

    A unix timestamp of when this element was created

    DeploymentContainer
    DeploymentContainerLocation
    Deployment Templates
    GameDeploymentTemplate
    UtilityDeploymentTemplate
    DcLocation
    HostCapacityTemplate
    InstanceTypeCapacity
    HostMemory

    0

    None

    If you do not have a management procotol, use this value

    1

    A2S

    This is the standard Steam query protocol. It's simple and only used for querying your game server for information about the game.

    2

    Arcus

    Arcus is a management protocol developed by i3D.net. It allows for querying game server information, requesting allocation status, exchanging metadata, sending custom commands, etc.

    ApplicationProperty
    Platform variables
    Application
    contact us
    /cloud/dcLocation
    /cloud/cpuPlatform
    authentication with your API key

    Click the floppy disc icon.

  • Follow the steps to Create your deployment profile settings.

  • Enter Fixed amount or percentage in the Global Buffer section. If you select a percentage, enter the Minimum and Maximum percentage.

    .

    (Optional) Select your Secondary instance from the drop down list.

  • Click Add location.

  • (Optional) To add more cloud locations, click the Add Cloud location button.

  • Click Save.

  • On the Create Fleet window, your selected Deployment Environment is already auto-populated, but if you need to select a different one, you can do that by clicking the arrow and select one from the drop down list.

  • Enter the Fleet Name.

  • Select your Deployment Profile from the drop down list.

  • Select your Game Template from the drop down list.

  • If you are using your fleets for other templates, select Utility Template, Dependency Template, or Host Capacity Template if it applies.

  • Click Next.

  • Click Create.

  • Automatic scaling
    Define your application and create your application build
    Create your game, utility, dependency, or capacity templates
    Orchestrator Overview
    DepEnvironment
    Application Management
    Application Build Management
    Deployment Configuration
    Allocation
    Live Status
    ApplicationBuild
    GameApplicationTemplate
    Deployment Configuration
    ApplicationInstance
    DeploymentProfile
    Maximum number of instances on a host
    UtilityDeploymentTemplate
    bufferValue
    Scaler region + location + build

    displayName

    string

    Read-only

    Name of the city the DC is located in

    providerId

    int

    Read-only

    1: i3D.net 27: AWS 31: GCP

    availabilityZones

    [string]

    Read-only

    Provider availability zones for a data center (where available)

    regionName

    string

    Read-only

    Provider region name

    id

    string

    Read-only

    Unique identifier of this element

    continentId

    int

    Read-only

    1: Africa 2: Antarctica 3: Asia 4: Australia 5: Europe 6: Middle East 7: North America 8: South America

    country

    string

    Read-only

    GET /v3/cloud/dcLocation
    DeploymentProfile

    Name of the country the DC is located in

    region_id
  • region_name

  • application_build_id

  • key

    string

    Yes

    The name of the label

    value

    string

    Yes

    The value of the label

    startup parameters of an ApplicationBuild
    PUT /applicationInstance/{applicationInstanceId}/status/{status}
    Required
    Description

    key

    string

    Yes

    The name of the metadata entry

    value

    string

    Yes

    The value of the metadata entry

    Table 1: Metadata element structure

    Requirements

    A Metadata element has the following constraints:

    • allowed characters in the key are a-z 0-9 _ -

    • the key may be no longer than 50 characters

    • the value may be no longer than 150 characters

    Manually adding & updating ApplicationInstance metadata

    Metadata in the ApplicationInstance elements are stored as an array of Metadata elements:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 1: Example metadata for an ApplicationInstance element

    When you want to add a new metadata element, you can PUT an element with only that new metadata element. You would submit:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 2: Example of adding new metadata to an ApplicationInstance element

    The result will be that the element has 3 metadata elements: metadata1, metadata2 and metadata3.

    When you want to update metadata, you only have to submit that one metadata element:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 3: Example of updating an existing metadata element in an ApplicationInstance element

    Deleting metadata is done by submitting metadata with a null value:

    PUT /applicationInstance/{applicationInstanceId}

    Figure 4: Example of deleting metadata from an ApplicationInstance element

    After these example mutations, the element ends up with the following metadata:

    GET /applicationInstance/{applicationInstanceId}

    Figure 5: The resulting metadata for an ApplicationInstance element after applying the examples

    Adding metadata during ApplicationInstance allocation

    During an allocation call (API reference), you can pass a metadata array. This metadata will then be added to all the ApplicationInstances that are allocated during that request.

    PUT /applicationInstance/game/{applicationId}/empty/allocate

    Figure 6: Example of passing metadata to ApplicationInstances being allocated

    Metadata sent during an allocation request will be merged with the metadata of the ApplicationInstances that are allocated. Merging occurs in the same manner as manually updating metadata.

    ApplicationInstance
    matchmaker allocation process
    Actions to perform
    • open the GameDeploymentTemplate for the Fleet whose game servers you want to update.

    • replace the existing ApplicationBuild ID in the DeploymentTemplate with the new ApplicationBuild ID.

    Every game instance that is in a free state, or goes into a free state will be re-deployed with the new build. Note that our platform does not update all free instances at once, but does this in batches so that there will always be free instances that can still be allocated during the rolling update period.

    Eventually (almost) all game instances will have been updated. To finalize the update process you will want to forcefully update any remaining game instances running the old build. This heavily depends on whether your game uses short or long lived matches / sessions / game play. Games that use matches of a specific maximum length usually rotate fairly quickly, but games that have long running sessions that do not have a particular ending might need a forceful update at some point.

    API example

    Step 1: get Fleet details

    We need to get the Fleet object so that we can see which GameDeploymentTemplate is assigned to it.

    HTTP request

    GET /fleet/988194285688223011

    Response body

    Step 2: get the GameDeploymentTemplate

    Using the Fleet.gameDeploymentTemplateId property from the previous call, we can now get the GameDeploymentTemplate itself.

    HTTP request

    GET /deploymentTemplate/game/6629032387499739571

    Response body

    Step 3: replace applicationBuildId

    We see that the currently active ApplicationBuild ID is "1459775459116568767". Let's replace it with our new ApplicationBuild ID "817092209556457642".

    HTTP request

    PUT /deploymentTemplate/game/6629032387499739571

    Request body

    Response body

    Now you can sit back and see inactive / available game servers being updated in batches.

    ApplicationBuild
    RabbitMQ

    After you have requested access to the event stream, it can be accessed through a RabbitMQ connection, using the AMQP protocol. There are libraries available for many programming languages. Statistical panels and mechanisms like Logstash also have easy means to connect to a RMQ event or message stream.

    Event structure

    All events are provided via the stream as JSON objects with at least the following properties:

    • level

    • service

    • group

    • code

    • message

    • @timestamp

    • parameters

    Example Structure

    Event Groups and Types

    There are several event groups and event types. The ones described below are not exhaustive - existing ones can change and more will be added:

    Application Instance Management

    Group: AIM

    Event Name
    Description

    AIMCreate

    A [platform generated] command to create a new Application Instance

    AIMDeployed

    An Application Instance has been deployed (installed, but not yet running)

    AIMStarted

    An Application Instance has [been] started

    AIMStopped

    An Application Instance has [been] stopped

    AIMDestroy

    An Application Instance has been destroyed

    VM Management

    Group: VMM

    Event Name
    Description

    VmCreated

    A VM has been created

    VmDestroyed

    A VM has been destroyed

    VmStarted

    A VM has been started

    VmStopped

    A VM has been stopped

    Arcus

    Group: Arcus

    Event Name
    Description

    ArcusError

    Errors encountered by Arcus (our instance management protocol)

    TTL

    Events pushed through this system have a TTL of 2 hours. If you do not consume messages within 2 hours after being published, they will be purged.

    [
        ... snipped ...
        {
            "id": 6,
            "continentId": 5,
            "country": "Netherlands",
            "displayName": "Rotterdam",
            "providerId": 1,
            "availabilityZones": [],
            "regionName": ""
        },
        ... snipped ...
        {
            "id": 29,
            "continentId": 5,
            "country": "Germany",
            "displayName": "Frankfurt",
            "providerId": 27,
            "availabilityZones": [
                "a",
                "b",
                "c"
            ],
            "regionName": "eu-central-1"
        },
        ... snipped ...
        {
            "id": 64,
            "continentId": 7,
            "country": "Canada",
            "displayName": "Montreal",
            "providerId": 31,
            "availabilityZones": [
                "-a",
                "-b",
                "-c"
            ],
            "regionName": "northamerica-northeast1"
        },
        ... snipped ...
    ]
    {
      "labelPublic": [
        {
          "key": "label1",
          "value": "A value"
        },
        {
          "key": "label2",
          "value": "Another value"
        }
      ]
    }
    {
      "labelPublic": [
        {
          "key": "label3",
          "value": "A new value"
        }
      ]
    }
    {
      "labelPublic": [
        {
          "key": "label2",
          "value": "An updated value"
        }
      ]
    }
    {
      "labelPublic": [
        {
          "key": "label2",
          "value": null
        }
      ]
    }
    {
      "labelPublic": [
        {
          "key": "label1",
          "value": "A value"
        },
        {
          "key": "label3",
          "value": "A new value"
        }
      ]
    }
    region_id=123 and fleet_id=456 or host_id=46256
    GET /applicationInstance?labels=region_id%3D123%20and%20fleet_id%3D456%20or%20host_id%3D46256
    region_name="Rotterdam"
    GET /applicationInstance?labels=region_name%3D%22Rotterdam%22
    [
      {
        "id": "string",
        "fleetId": "string",
        "hostId": 0,
        "isVirtual": 0,
        "applicationId": "string",
        "applicationType": 0,
        "applicationBuildId": "string",
        "installId": 0,
        "dcLocationId": 0,
        "regionId": "string",
        "status": 0,
        "createdAt": 0,
        "startedAt": 0,
        "stoppedAt": 0,
        "pid": 0,
        "pidChangedAt": 0,
        "properties": [
          {
            "id": "string",
            "propertyType": 0,
            "propertyKey": "string",
            "propertyValue": "string"
          }
        ],
        "ipAddress": [
          {
            "ipAddress": "string",
            "ipVersion": 0,
            "private": 0
          }
        ],
        "labelReadOnly": [
          {
            "key": "string",
            "value": "string"
          }
        ],
        "labelPublic": [
          {
            "key": "string",
            "value": "string"
          }
        ],
        "metadata": [
          {
            "key": "string",
            "value": "string"
          }
        ],
        "updatedAt": 0,
        "numPlayersMax": 0,
        "numPlayers": 0,
        "liveHostName": "string",
        "liveMap": "string",
        "liveGameVersion": "string",
        "liveRules": "string",
        "manuallyDeployed": 0
      }
    ]
    {
      "metadata": [
        {
          "key": "metadata1",
          "value": "A value"
        },
        {
          "key": "metadata2",
          "value": "Another value"
        }
      ]
    }
    {
      "metadata": [
        {
          "key": "metadata3",
          "value": "A new value"
        }
      ]
    }
    {
      "metadata": [
        {
          "key": "metadata2",
          "value": "An updated value"
        }
      ]
    }
    {
      "metadata": [
        {
          "key": "metadata2",
          "value": null
        }
      ]
    }
    {
      "metadata": [
        {
          "key": "metadata1",
          "value": "A value"
        },
        {
          "key": "metadata3",
          "value": "A new value"
        }
      ]
    }
    {
      "metadata": [
        {
          "key": "metadata1",
          "value": "E.g. a map name"
        },
        {
          "key": "metadata2",
          "value": "E.g. game duration"
        }
      ]
    }
    [
        {
            "id": "988194285688223011",
            "name": "Exmaple Fleet",
            "deploymentEnvironmentId": "1528510395058174656",
            "deploymentProfileId": "2641748478114564847",
            "gameDeploymentTemplateId": "6629032387499739571",
            "utilityDeploymentTemplateId": "0",
            "operationalStatus": 2
        }
    ]
    [
        {
            "id": "6629032387499739571",
            "fleetIds": [
                "988194285688223011",
                "8080951566089961859"
            ],
            "name": "Example Game Deployment Template",
            "inUse": 1,
            "createdAt": 1563526808,
            "gameDeploymentTemplateBuild": [
                {
                    "applicationBuildId": "1459775459116568767"
                }
            ]
        }
    ]
    {
      "gameDeploymentTemplateBuild": [
        {
          "applicationBuildId": "817092209556457642"
        }
      ]
    }
    [
        {
            "id": "6629032387499739571",
            "fleetIds": [
                "988194285688223011",
                "8080951566089961859"
            ],
            "name": "Example Game Deployment Template",
            "inUse": 1,
            "createdAt": 1563526808,
            "gameDeploymentTemplateBuild": [
                {
                    "applicationBuildId": "817092209556457642"
                }
            ]
        }
    ]
    {
      "userId" : 174085,
      "level" : "info",
      "service" : "ha-application-instance-manager",
      "group" : "AIM",
      "code" : "AIMDestroy",
      "message" : "Application instance delete.",
      "@timestamp" : "2020-02-05T19:16:23.128Z",
      "parameters" : {
        "applicationName" : "test",
        "applicationId" : 282888204204416978,
        "deploymentEnvironmentName" : "depenv-testI3D-31-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
        "fleetName" : "fleet--39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
        "installId" : 13281,
        "regionName" : "i3d-us-east-1-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
        "dcLocationId" : 1,
        "dcLocationName" : "Ashburn - VA",
        "applicationBuildName" : "appbuild-testI3D-31-39e57d3b-0dc5-4615-a46a-7cf93ad7b7e8",
        "applicationBuildId" : 8029997744897942721,
        "regionId" : 9126781268035892791,
        "applicationInstanceId" : 8762708736248342380,
        "deploymentEnvironmentId" : 4276611139388342629,
        "fleetId" : 8817355271013717608,
        "hostId" : 93005,
        "status" : 0
      },
      "label" : [ ],
      "stracktrace" : ""
    }
    with
    elements

    Please refer to the Application Management chapter for more information on creating these elements.

    Additionally you must have uploaded a build archive to your origin node.

    ApplicationBuild elements

    An ApplicationBuild is represented by the following element:

    • ApplicationBuild

    The process flow of creating an ApplicationBuild is visualized in the ApplicationBuild process flow below.

    ApplicationBuild process flow

    The following diagram is a simple overview depicting the process of creating an ApplicationBuild. Note that you must first define an Application before you can start this process. The chapter after that provides an example for more detail.

    The ApplicationBuild creation process can be summarized as follows:

    Figure 1: ApplicationBuild creation process

    ApplicationBuild creation example

    Uploading a file

    When you have requested an i3D.net hosted origin node, or when you have setup and registered your self-hosted origin node, you can upload your build archive there.

    This is the first step; uploading your build(s) to your origin. Note that in the future you will be able to upload your builds via our control panel as well.

    Fetching the ID of your uploaded file (i3D.net hosted origin)

    When the upload is finished our system will index the files in your account and make them all available via /v3/buildProvisioning/storage/file. Take note of the file IDs, you will need these when creating the ApplicationBuild element below.

    GET /v3/buildProvisioning/storage/file

    JSON response data BuildProvisioningFile:

    Create ApplicationBuild (using an i3D.net provided origin node)

    POST /v3/applicationBuild

    JSON request data ApplicationBuild:

    Here we take the values for buildProvisioningFileId and buildProvisioningRegistrationId from the previous GET /v3/buildProvisioning/storage/file request.

    Create ApplicationBuild (using a self-hosted origin node)

    POST /v3/applicationBuild

    JSON request data ApplicationBuild:

    In this case you must provide a bit more details than with an i3D.net hosted origin, because in this self-hosted case, we have no knowledge of which files are hosted on your origin. So you must provide the buildProvisioningRegistrationId, followed by fields you must manually enter for your build file:

    • domain: the domain of your origin

    • path: the path within which your build archive resides

    • filename: the file name of your build archive

    • headers: key/value array of HTTP headers for your security, to lock down access to the files on your origin. You can enter any kind of header keys (header name) and values (header value).

    Upon submission we will validate these details, and see if we get a 200 OK response for a HEAD request, meaning the file could be reached by our platform. If this call succeeds, you will get the newly created ApplicationBuild in the response body of the request. You could optionally verify its existence using the ApplicationBuild's ID:

    Verifying the new ApplicationBuild

    GET /v3/applicationBuild/{applicationBuildId}

    JSON response data ApplicationBuild:

    We now have a complete ApplicationBuild element pointing to an ApplicationBuildFile (representing the build archive you uploaded earlier) and the following definitions:

    • a name (must be unique)

    • the Application element this element belongs to

    • the file path (including file name) to the executable that we need to start the instance

    • startupParameters to accompany the executable

    • operating system needed for the build to run on. This must match exactly the operating system on your servers (BM & VM), otherwise the platform will refuse to run your build

    Application
    ApplicationBuild
    Application
    ApplicationProperty

    a utility / sidecar (type: Utility)

  • a dependency installer (type: DependencyInstaller)

  • a dependency un-installer (type: DependencyUninstaller)

  • Element structure

    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    type

    int

    Yes

    The type of application: 1: Game server 2: Utility 3 DependencyInstaller 4 DependencyUninstaller

    managementProtocol

    int

    Yes

    Table 1: Application element structure

    Relations

    Every program we deploy with the platform will be defined by an Application element. The Application element is at the top of the application related hierarchy. It gives everything related to an Application an identity:

    • ApplicationBuild

    • ApplicationInstance

    Additional application specific properties are provided through the ApplicationProperty element. An Application can have zero or more ApplicationProperty elements.

    • ApplicationProperty

    See also:

    • Application management process

    • Application element relations

    Restrictions

    You can define any number of Applications for your account. There is no limit.

    Related topics

    • Orchestrator Overview

    • Game Deployment Quick Start Guide

    • i3d.net API documentation

    management protocol
    Requirements

    In order to build the source, you must ensure you have the following dependencies installed on your system.

    1. You need a C++ compiler.

      • Windows: Visual Studio 2017, or build tools (without Editor)

      • Linux: GCC (7.5.0 tested)

    2. CMake 3.17.4. This is used to configure and build the project. See the top of CMakeLists.txt for other CMake versions tested, if you are already using a different version.

    3. After the initial repository clone, initialize the git submodules with the following command:

    1. On Linux, ensure you installed Open SSL (used by curl, for testing, as of 2022-06-01):

    Optional

    1. For documentation generation:

      • Windows:

        1. doxygen

        2. graphviz

      • Ubuntu:

        1. sudo apt-get update

        2. sudo apt-get install doxygen graphviz

    2. For buiding Linux libraries on Windows:

    Steps

    Build scripts for both platforms can be found in the tools folder. The build scripts naming follows the following convention:

    build_<debug_or_release>_<platform>_<shared_or_static_library>_<architecture> Windows will also have a trailing mt or mtdll for the code generation CRT configuration (Multi Threaded vs Multi Threaded DLL).

    For example, build_release_windows_32_dll_mt.bat will configure and build on windows a release, 32 bit, multi-threaded (MT option in MSVC) dll library.

    Running a build script will build the source, run tests, and output results to the build folder.

    A clean is needed in most cases when building with different settings.

    Clean

    Run either script in the root:

    • clean_windows.bat

    • clean_linux.sh

    Cleaning is not required when changing between debug and release builds with other settings being equal.

    Automated build

    build_release_dlls.bat will build dll/so libraries for Windows and Linux, outputing them to a shared_lib_build folder in the root. Docker is required.

    IDE

    To load the repository in Visual Studio, first build and then open the generated solution file located at build/OneGameHostingSDK.sln.

    For working on the SDK in Visual Studio Code, IDE tips are located here.

    Documentation Build

    The doxygen documentation is built automatically if CMake is able to find the doxygen installed on your system.

    Testing

    As noted above, short tests are run at the end of the cmake build, by default.

    Run the following bash scripts from within the tools folder to run longer tests:

    • run_tests_debug_long.sh

    • run_tests_debug_soak.sh

    Use the build/tests/debug/tests.exe -? option for all commands.

    Platform defined variables

    The platform supplies a number of predefined variables:

    Variable name
    Description

    VARSERVERID

    The ID of the (physical or virtual) server an application is deployed on

    VARHOSTID

    The ID of the host an application is deployed on

    VARHOSTNAME

    The hostname of the host an application is deployed on

    VARPLAYERS

    Maximum number of players allowed on a game server

    VARCONTINENT

    The name of the continent in which the host is located

    VARCOUNTRYCODE

    The ISO 3166-1 alpha-2 code of the country in which the host is located

    Table 1: Platform defined VARiables

    User defined variables

    Alongside the platform defined VARiables, there are also custom ones that are derived from ApplicationProperty elements. For each ApplicationProperty, a VARiable is generated. Some examples of this:

    For a property named game_port, a VARiable named VAR_GAME_PORT is generated. For a property named managementport, a VARiable named VAR_MANAGEMENTPORT is generated. For a property named management_password, a VARiable named VAR_MANAGEMENT_PASSWORD is generated.

    As you may already see, there is a visual difference between platform-defined VARiables and custom ones. The custom ones have the prefix VAR_ (with an underscore), whereas the platform-defined ones lack the underscore.

    All VARiables are in upper case.

    Please note that startParameters VAR must have quotations surrounding it when using JSON:

    Examples

    An example of VAR usage inside ApplicationBuild.startupParameters:

    -ip VARIPV4BINDING -port VAR_GAME_PORT -arcusport VAR_MANAGEMENTPORT -name "Bluewolf VAR_GAME_PORT" -applicationInstanceId VARAPPLICATIONINSTANCEID -maxplayers 8

    An example of VAR usage inside ApplicationBuildConfiguration.configContent:

    You can concatenate VARiables if you want - they do not have to be separated by a space:

    -regionIdent VARREGIONNAME-VARAPPLICATIONINSTANCEID

    It will even work without a glue character:

    -regionIdent VARREGIONNAMEVARAPPLICATIONINSTANCEID

    !!! Warning "Underscore is not a glue character"

    ApplicationBuild
    ApplicationBuildConfiguration
    Why would I need an Orchestrator?

    In the event of a highly successful game with a sudden surge in players, relying solely on basic game server capacity deployed on your own bare metal servers may prove insufficient. Ordering additional bare metal servers to increase capacity may take too long, resulting in new players being unable to join the game. To address this challenge, we have developed a dynamic game server deployment system that can seamlessly scale onto major cloud platforms like GCP, AWS, and Azure. This innovative solution bridges the gap between demand and compute resources, ensuring that your game server resources can dynamically adapt to player influxes in real-time, enabling a smooth and uninterrupted gaming experience for all players while safeguarding your reputation.

    Base requirements you need to set up the Game Server Orchestrator

    You will first need to integrate your game's backend. Then you will need to set up your hosting parameters, scaling mechanisms and deployment types by selecting your needs:

    • Bare Metal instance types for your base layer (player base).

    • Your deployment regions.

    • Your cloud providers (for multi-cloud bursting when you need additional capacity).

    • Your minimal and maximal amount of game instances per server, and the buffer of free game servers.

    Ready to start setting this up? Go to our Quick Start Guide documentation.

    For your base requirements, we always recommend using Bare Metals as much as possible for the following reasons:

    • They provide better performances.

    • Their monthly cost is lower than the monthly cost of a Virtual Machine of similar size.

    How does the Orchestrator work?

    Once deployed, a simple game flow is as follows:

    • Once your players start entering the game servers, the game client sends requests to your matchmaker.

    • The matchmaker sends game and server details to the game client, which connects to the game server to start the round (and disconnects when the round is done).

    Here is a visual of how the Game Server Orchestrator works:

    Orchestrator Workflow

    The Orchestrator combines the major elements in order to deploy game servers when and where you need them. It must know which application (builds) it needs to deploy using:

    • Application Management

    • Application Build Management

    It must also know where and how to deploy the builds with:

    • Deployment Configuration

    Together with the live game server status information such as Allocation / Live Status, the Orchestrator knows the occupied and free game servers. With that data, it can determine whether there are too few or too many free game servers. As a result of that information, the Scaler can send instructions to deploy or remove game servers as needed.

    The scaling mechanism always operates on individual combinations of region + DC location (Data Center location) + ApplicationBuild. Deployment of game servers first occurs on Bare Metal servers and when they are full, the Orchestrator continues to deploy onto any configured cloud locations.

    Host selection overview (Round robin strategy)

    What is the Round robin strategy? This is which your BM or VM host will send a request to cloud provider A, then B, then C, and then back to A. Moreover, you can choose to use a cascading approach, which is you exhaust cloud provider A, then exhaust cloud provider B, and so on.

    When the scaling mechanism needs to deploy a new ApplicationInstance, it will first look for a usable Bare Metal hosts (BM). If you have run out of BM hosts, the Orchestrator will continue with Cloud VMs, provided you have configured cloud locations in your DeploymentProfile.

    A selected BM or VM host will be filled with instances before the mechanism will find the next free host. You can individually define the number of instances to be deployed onto a host for each BM or VM instance type.

    Initializing an empty host

    When a new, empty host (BM or VM) has been selected for game server deployment, the scaling mechanism will first deploy all the utilities (sidecars) and dependencies that you defined in your UtilityDeploymentTemplate and DepencencyDeploymentTemplate. After that, the new game servers are deployed.

    How does the Orchestrator remove instances (downscaling)?

    When player demand decreases and if there are too many application instances deployed, the scaling mechanism will start removing unused instances until the number of free / unallocated instances equals the bufferValue again.

    If you have application instances deployed onto VMs, they are removed first. Only empty instances are removed. If no VMs are in use, or if there are no VMs with free / unallocated instances, the Scaler will continue downscaling instances on Bare Metal hosts.

    To help reduce cloud hosting costs, the host with the least amount of application instances (or secondary, with the most free instances) will be selected for removing instances.

    Keep in mind though that if your game server hosts sessions take a long time to end, a VM cannot be destroyed until all its players have left the game server. If your game falls into that category you may want to invest in a mechanism that can transfer players to another game server, in an attempt to reduce cloud hosting costs.

    Cleaning up a host when it's empty

    After the last game server instance has been removed from a host, any side cars (utilities) and dependencies will also be removed. If the host is a VM, the VM will be destroyed. A Bare Metal host will become usable again for future deployments.

    Related topics

    • Game Deployment Quick Start Guide

    • i3d.net API documentation

    Bare Metal and Cloud VMs

    We utilize our own bare metal servers for your basic capacity needs with the added functionality of scaling onto multiple hyper clouds when additional capacity is needed (AWS, GCP, Azure). Our bare metal servers are connected to our own network which has evolved throughout the years to excel in situations where low latency is crucial.

    Meet your needs

    The Platform is fully configurable to suit your needs. It allows for defining which of your builds must be deployed onto which locations. Scaling behaviour can be changed and you can indicate which hyper cloud providers you want to make use of without the need to create accounts for any of them. Nor do you have to worry about billing from each individual party - we provide you with a single unified invoice for all deployment related activities. Or use your own cloud account(s) if you prefer.

    Add your utilities

    Alongside your game servers we can deploy utilities as well. These may be needed for extra monitoring of said game servers, provide ping-sites, collect and forward crash dumps and related information - anything you may need.

    Matchmaker Allocation

    There is a simple integration path for your matchmaker logic. With a single API call it can request available game servers at any time, in any region or location to send players towards. If you require a deeper integration then we can assist you, though we aim to make the Platform as easy to setup as possible so that everyone can set it up to their wishes.

    Integrate your game servers

    Game server status can be queried by the Platform and made available to you through our API, provided you have integrated a query protocol such as A2S into your game servers. We have developed our own protocol called Arcus, which provides not just a way of querying the status of a game server, but allows sending commands as well. For easy integration, have a look at our C++ SDK on GitHub.

    Requirements

    Our ONE Game Hosting service can be used by any game. However, if you desire dynamic game server scaling functionality from the Platform you must meet one of the following requirements:

    • Your game uses a matchmaker that can allocate game servers in our system

    • Your game servers support a management protocol that allows the Platform to request game information, such as the number of players currently on a game server.

    This way the Platform knows when a game server is in use; either when it's been allocated by your matchmaker, or when players are connected to a game server. Knowing when a game server is in use is required for the dynamic scaling functionality to work.

    Advantages

    • i3D.net high performance low latency global network

    • Homogeneous bare metal server types

    • Scale onto any hyper cloud provider for additional capacity

    • Never run out of capacity even if a cloud provider is down

    • REST API

      • manage the entire Platform

      • query for information on your and game servers

    • Easy integration with your back end

    • Easy game server communication integration via our

    • Cheaper than pure cloud solutions

    • Knowledgeable support team that can aid with:

      • game server profiling to determine what kind of bare metal / virtual machine instance types you need

      • troubleshooting

      • game server patching

    • Knowledgeable network team that can aid with:

      • connectivity issues

      • effective anti-DDoS solutions without increasing latency

    • We can setup and manage your environment if desired (full hands-off experience)

    Features

    • Automatic deployment and scaling with a simple control panel to manage Platform performance

    • Fine grained configuration and control of your deployment environment

    • 24/7 resource monitoring and configurable alerting on both hard- and software levels

    • Game server logs made available through a centralized point

    • Crash event logging

    • Event / notification callback mechanisms

      • HTTPS

      • Slack

      • SMS

    • Task system to perform any actions, scheduled in the future or for immediate execution

    Enables additional functionality within the ONE game hosting platform

    • adds support for a Matchmaker allocation system

    • allows the ONE Game Hosting Platform to retrieve player numbers needed for automatic scaling, if no Allocation mechanism is supported by the game

    • enables the ONE Game Hosting Platform to request graceful shutdowns

    • enables a game server to request meta data for the host it runs on and request meta data about itself

    • custom functionality

    The Arcus protocol specification has room for custom functionality that you can integrate if needed. i3D.net is always available to support your specific use cases and add additonal integration functions.

    In order for an Arcus connection to be possible, the game server needs to listen on the management port defined in the Management protocol.


    Using One Arcus

    Our Host Agent will always connect to localhost. This means that for security reasons, a game server should have Arcus listen for local connections only (127.0.0.1).

    An Arcus (game) server will listen for a new TCP connection on the management port indicated in the startup parameters of the application instance (game server). More information can be found in the Management protocol port chapter. The client (Host Agent) will connect and wait for an Arcus HELLO packet packet which will tell it the version of the protocol.

    The client (Host Agent) will verify whether it supports this version. If not, it will close the connection and report this problem to the ONE Game Hosting platform for logging purposes.

    Connection handshake flow

    [![](../../images/ArcusHandshake.png "Arcus handshake")](../../images/ArcusHandshake.png)Figure 1: Arcus handshake process

    Client should always wait on the Arcus HELLO packet. In case the server receive any byte before he send the HELLO packet the server will close the connection because an client should always wait.

    Tracking requests and responses

    Now that the client knows which version it needs to use it can use the arcus protocol, every arcus message contains a PacketID that will be echoed in all the packets an arcus server will send to the clients requests. This will help the client to map responses to requests and makes it possible for the protocol to handle multiple requests.


    HELLO Packet Structure

    Data
    Type
    Comment

    Ident

    4 bytes

    Protocol identifier, This value will start with arc and ends with a null byte ["arc"null]

    Version

    byte

    Version number of the protocol

    Reserved

    byte

    A reserved byte which is not in use right now. it may be used for future purposes.

    The HELLO packet structure differs from the rest of the packet structures. This structure is specifically designed to fit the requirements of the HELLO packet.


    Basic Packet Structure

    Both requests and responses are sent as TCP packets. Their payload follows the following basic structure:

    Data
    Type
    Comment

    Flags

    byte

    Define extra properties to a packet, Example: gzip compressed payload.

    Opcode

    byte

    Identifier of the request

    Reserved

    byte

    A reserved byte which is not in use right now. It may be used for future purposes.

    Reserved2

    byte

    Flags

    Currently flags are not in used, Flags are meant to define special properties to packets such as Compressing, different byte order etc. Right now we don't have any flag defined so the byte flag will be always null.

    PacketID

    The packet id field is a unsigned 32-bit integer chosen by the client for each request. It may be set to any integer. When the server responds to the request, the response packet will have the same packet id as the original request It need not be unique, but if a unique packet id is assigned, it can be used to match incoming responses to their corresponding requests.

    Opcode

    The Opcode identifies the packet type. The Section Requests and Responses describes each different packet type.

    Reserved

    A reserved byte not in use right now but can be used for future purposes.

    Reserved2

    A reserved byte not in use right now but can be used for future purposes.

    Length

    The packet Length field is an unsigned 32-bit integer, representing the length of the request in bytes. Note that the length field itself is not included when determining the length of the packet. Hence the value of this field is always 12 less than the packet's actual length.

    Payload

    Every payload is a JSON string, the Length of the string can be found in the Length property. Keep in mind that every packet type has his own payload structure. To find the payload structures of a specific type check Requests and Responses


    The DependencyUninstaller ApplicationBuild will be installed and executed after the platform has removed any other deployed Applications from the Host. Note that this only happens on bare metal Hosts. By contrast, VMs will be destroyed as a whole anyway and as such do not require the cleanup step.

    You can create as many DependencyDeploymentTemplates as you like within the platform. However, a Fleet can only point to one DependencyDeploymentTemplate at a time. A DependencyDeploymentTemplates can be shared (re-used) across multiple fleets though.

    Element structure

    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    fleetIds

    [int]

    Read-only

    List of IDs this template is used in

    name

    string

    Yes

    Table 1: DependencyDeploymentTemplate element structure

    API example

    Create a new DependencyDeploymentTemplate within your i3D.net account.

    Full API reference

    HTTP request

    POST /v3/deploymentTemplate/dependency

    Request body

    Response body

    Assign DependencyInstallerDeploymentTemplate to a Fleet:

    Full API reference

    HTTP request

    PUT /v3/fleet/{fleetId}

    Request body

    Response body

    Fleet
    • Integration guide - How to integrate the plugin into a game server.

    • Plugin package - How to package the plugin.

    The i3D.net Game Hosting SDK works on Windows and Linux. If you used the guide and you are having problems with the installation, please file an issue.

    Supported platforms:

    Requirements

    1. Minimum compatible Unreal version: 4.25

    2. Native SDK libraries require C++ Redistributable 2015 to be installed on Windows. Download the installer and follow its instructions:

      • x64 and x86

    Integration guide

    1. Download the ONE Game Hosting Plugin from the Unreal Marketplace.

    2. Copy the plugin folder into C:\Program Files\Epic Games\UE_4.26\Engine\Plugins.

    3. In Unreal Engine Editor, go to Edit > Plugins menu.

    4. Select the plugin from step 1 and click Enable.

    5. Relaunch the Unreal Editor and open your game.

    6. Click Add New > Blueprint Class and search for class One Arcus Server.

    7. Drag in the new One Arcus Server into a persistent level, so that the One Arcus Server persist during the whole game life cycle.

    8. Follow the next task: How to test below.

    How to test

    There are two ways to test a Game Server that is running an One Arcus Server:

    1. The SDK contains a Fake Agent that can connect and simulate a real deployment. Build and run instructions can be found here.

    2. The Game Server can be uploaded to a live One Development Platform Deployment.

    Testing can be performed either in Unreal Engine Editor or on a build running in headless mode.

    Package export

    This is an optional step for developers that need to locally build and package the plugin.

    Windows

    1. Add C:\Program Files\Epic Games\UE_4.26\Engine\Build\BatchFiles in the PATH environment variable

    2. Build the Arcus plugin:

      a. The one-gamehosting-sdk-unreal repository is cloned in the folder %USERPROFILE%/source/repos/one-gamehosting-sdk-unreal

      b. Run the following command to build the sdk plugin: (Where ... is the working directory where you want to copy the plugin.)

      c. Copy the ONEGameHostingPlugin into Unreal Engine plugin directory: C:\Program Files\Epic Games\UE_4.26\Engine\Plugins\One, since it cannot be set directly through their toolchain.

    Linux

    1. Follow the Linux Quick Start for instructions on how to build the Unreal Engine locally.

    2. For the following steps: the UnrealEngine is cloned in the folder ~/src/UnrealEngine/ and the one-gamehosting-sdk-unreal is cloned in the folder ~/src/one-gamehosting-sdk-unreal. Make sure that the folder is created ~/src/One.

    3. Build the Arcus plugin and run the following command:

    4. Copy the folder ~/src/One/ONEGameHostingPlugin in ~/src/UnrealEngine/Engine/Plugin/One/ONEGameHostingPlugin

    For developers using this plugin

    Optional - The target audience is software developers that want to build the plugin locally without using pre-built plugin from the Unreal Engine marketplace.

    here
    /v3/buildProvisioning/storage/registration
    /v3/buildProvisioning/storage/file
    Application Build Management
    Game Deployment Quick Start Guide
    Orchestrator Overview
    i3d.net API documentation

    Game Hosting

    User and developer documentation for the i3D.net Game hosting service.

    Get started with the dashboard for your game hosting needs

    • Get started

    Get started using the API for your game hosting needs

    API Processes

    Elements

    • Application

    Features

    Cloud Usage

    Game Integration

    Events

    Examples

    Dependency Installation

    Dependency Installation is the process of installing software requirements (dependencies) for your applications before those applications are deployed. E.g. an application could require some library to be installed on the host in order to run properly.

    If your applications have no additional software requirements, you do not have to use this process.

    Dependency installation occurs on a host before any game or utility applications are deployed. This is done by using a DependencyInstaller.

    Dependencies must also be un-installed when all applications have been removed from a host. This is done by using a DependencyUninstaller.

    If you use a DependencyInstaller, you must also create and use a DependencyUninstaller to clean up a host after all regular instances have been removed. Both must be defined in a DependencyDeploymentTemplate. Finally, the DependencyDeploymentTemplate must be assigned to the Fleet you are using.

    Dependency Installer

    A Dependency Installer is an "" of type DependencyInstaller that consists of a script and any dependencies you want to install that may not be part of a regular package manager like APT (Debian / Ubuntu).

    Please refer to the paragraph for more information.

    Installer deployment process

    If a dependency installation fails the platform will select another host, but it will only do that once. If two dependency installations fail, we stop the deployment process by setting the Fleet's to 0 (manual deployment / scaling disabled) and follow up with an email notification listing the details surrounding the environment it ran in, and the console output of the Dependency Installer.

    Dependency Un-installer

    A Dependency Un-installer is an "" of type DependencyUninstaller that consists of a script and any programs you need to un-install dependencies that may not be part of a regular package manager like APT (Debian / Ubuntu).

    Please refer to the paragraph for more information.

    Un-installer deployment process

    Creating a Dependency (Un-)Installer Application

    Creation of an of type DependencyInstaller or DependencyUninstaller is identical to the . The only difference is that you must set the type of the Application to either DependencyInstaller or DependencyUninstaller. This means that you first create the Application elements, then upload your DependencyInstaller build archive, then an ApplicationBuild element.

    The contents of the Application archive in this case are either a Bash script (Linux) or a PowerShell script (Windows). Additional files can be included, e.g. custom libraries or installers of a service you want to run during the lifetime of game instances on a host. Anything you need, you can put it in the DependencyInstaller Application archive.

    Linux

    Dependencies on Linux are installed via a shell script that will be executed by the Bash command line interpreter. This script can contain any commands you need to install your dependencies.

    • The Bash script must have the .sh extension. It does not require a .

    • The script will be executed with root privileges.

    • The working directory will be the location of the script itself, so you can refer to files that are part of the DependencyInstaller Application using relative paths.

    Bash example script (DependencyInstaller)

    Bash example script (DependencyUninstaller)

    Make sure you use UNIX line endings in your Bash script.

    When (un-)installing dependencies via a package manager, ensure they will not prompt for confirmations. This will otherwise stall the (un-)installation process, with the result that the dependency (un-)installation will eventually time-out and fail.

    Please note that if there is no Game or Utility to uninstall on the fleet, the Dependency Uninstaller will report an issue in a failed email because there is nothing to uninstall.

    Windows

    Dependencies on Windows are installed via a PowerShell script. This script can contain any commands you need to install your dependencies.

    • The PowerShell script must have the .ps1 extension.

    • The script will be executed with Administrator privileges.

    • The working directory will be the location of the script itself, however in Windows it's better not to use relative paths in all cases. E.g. msiexec does not like relative paths. The following example shows how to run an MSI file with an absolute path:

    PowerShell example script (DependencyInstaller)

    PowerShell example script (DependencyUninstaller)

    When (un-)installing dependencies via a package manager, ensure they will not prompt for confirmations. This will otherwise stall the (un-)installation process, with the result that the dependency (un-)installation will eventually time-out and fail.

    Avoid (un-)installing dependencies that require a reboot afterwards!

    Behavior of the Dependency (Un-)Installer for different Fleet statuses

    The Dependency Installer will automatically run in most cases, but there are differences in that behavior within the different Fleet operational statuses.

    Fleet Operational Status 0 (manual deployment)

    All deployments must be performed manually. This includes, where applicable:

    Deployment of instances Upscaling is performed by manually deploying all application instances. This includes, where applicable:

    • manually deploy dependency installer for each host you deploy game instances on

    • manually deploy utilities for each host you deploy game instances on

    • manually deploy game instances

    Removal of instances - scale down Downscaling is performed by manually removing all application instances. This includes, where applicable:

    • manually remove game instances

    • manually remove utilities

    • manually deploy dependency un-installer after having removed all game instances and utilities

    • manually remove the dependency installer and un-installer instances

    Fleet Operational Status 1 (automatic deployment)

    Deployment of instances Upscaling is performed automatically by increasing . This includes, where applicable:

    • automatically deploy dependency installer for each host we deploy game instances on

    • automatically deploy utilities for each host we deploy game instances on

    • automatically deploy game instances

    Removal of instances - scale down Downscaling is performed by decreasing and manually removing all deployed application instances. When all game and utility instances have been removed from a host, the dependency un-installer will run automatically. This includes, where applicable:

    • manually remove game instances

    • manually remove utilities

    • the dependency un-installer will deploy automatically after you have removed all game instances and utilities

    • finally the dependency installer and un-installer instances will automatically be removed

    Fleet Operational Status 2 (automatic deployment + scaling)

    All deployments and removal of application instances are performed by our automatic scaler service. This includes, where applicable:

    Deployment of instances - scale up Upscaling is automatically performed by our scaler according to , the and game instance occupation. This includes, where applicable:

    • automatically deploy dependency installer for each host we deploy game instances on

    • automatically deploy utilities for each host we deploy game instances on

    • automatically deploy game instances

    Removal of instances - scale down Downscaling is automatically performed by our scaler according to , the and game instance occupation. This includes, where applicable:

    • automatically remove game instances

    • automatically remove utilities

    • automatically deploy dependency un-installer after having removed all game instances and utilities

    • automatically remove the dependency installer and un-installer instances

    Creating a Dependency Deployment Template

    This process is described in the element chapter.

    Assigning the template to a Fleet

    This process is described in the element chapter.

    Important note

    The Dependency Installation process is a powerful one and gives you a lot of control and flexibility. Besides installation of dependencies for applications, it can also be used to install services / daemons that will run for as long as there are Game applications installed on a host.

    Whatever you choose to install, it is very important that everything is removed / uninstalled once a host becomes empty. This applies mostly to bare metal servers, because these will be re-used at a later time, possibly for different applications, unlike VMs that are destroyed when they are no longer needed. But even on VMs, the Dependency Un-installer will still be run. This allows you to e.g. unregister a monitoring node from a monitoring system.

    Applicationinstanceproperty

    The ApplicationInstanceProperty is an element that adds meaning to the ApplicationInstance element. These properties are inherited from the ApplicationBuild element and their values will be populated according to the actual settings of the ApplicationInstance. One cannot add or edit ApplicationInstanceProperties manually.

    Inheritance example

    Given that you have the following ApplicationProperty elements with default values for your Application:

    Property type (id)
    Property name
    Property default value

    Table 1: ApplicationProperty examples

    For an ApplicationInstance these values would be substituted with the actual values used for the instance. These are just an illustration of possible values.

    Property type (id)
    Property name
    Property actual value

    Table 2: ApplicationInstanceProperty examples

    Element structure

    Property
    Value type
    Required
    Read-only
    Description

    Table 3: ApplicationInstanceProperty element structure

    propertyKey constraints

    The characters allowed for a propertyKey are : a-z, 0-9, -, _ A property key must start with a lowercase character.

    The maximum length of a propertyKey is 50 characters.

    propertyValue constraints

    Any UTF-8 character is allowed in a propertyValue.

    The maximum length of a propertyValue is 150 characters.

    propertyType

    ApplicationInstanceProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.

    Available property types

    A propertyType is indicated by a numerical ID. The following types are available:

    ID
    Type
    Value type
    Value required?
    Description

    Table 4: Property types

    Property inheritance

    An ApplicationInstance's properties are inherited from the element it was deployed for.

    Restrictions

    ApplicationInstanceProperty elements cannot be added / edited manually. They are always inherited from the element it was deployed for.

    Gamedeploymenttemplate

    The GameDeploymentTemplate indicates which [game server] ApplicationBuilds you want to have deployed within a Fleet.

    Figure 1: Highlighting where the GameDeploymentTemplate elements belong in the overview

    Usage

    A GameDeploymentTemplate is used by a Fleet and defines which ApplicationBuilds (of type Game) will be deployed for that Fleet. A single GameDeploymentTemplate can define more than one ApplicationBuild by adding multiple GameDeploymentTemplateBuild elements. Each of these defines a single (ApplicationBuild (of type Game).

    Each ApplicationBuild defined in a template will be treated like individually scalable builds. If you set a Fleet's operational status to , each build will be deployed individually according to the value. Similarly, when you set the Fleet's operational status to , each build will be automatically scaled individually. In short, each ApplicationBuild in the GameDeploymentTemplate is treated individually. No relationship between the defined ApplicationBuilds exists.

    You can create as many GameDeploymentTemplates as you like within the platform. However, a Fleet can only point to one GameDeploymentTemplate at a time. A GameDeploymentTemplate can be shared (re-used) across multiple fleets though.

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: GameDeploymentTemplate element structure

    GameDeploymentTemplateBuild element structure

    Property
    Value type
    Required
    Description

    Table 2: GameDeploymentTemplateBuild element structure

    API example

    Create a new GameDeploymentTemplate within your i3D.net account.

    HTTP request

    Request body

    Response body

    Attach GameDeploymentTemplate to a Fleet:

    HTTP request

    Request body

    Response body

    Related topics

    Instancetypecapacity

    The InstanceTypeCapacity element is a child of the HostCapacityTemplate and defines how many game instances you want deployed on a certain BM instance type and / or VM instance type. during creation, you provide the ID of the HostCapacityTemplate that you want this element to become part of.

    Element Structure

    Property
    Value type
    Required
    Description

    Table 1: InstanceTypeCapacity element structure

    Obtaining BM and VM instance types

    You can get a list of BM instance types using the /host/instanceType endpoint.

    You can get a list of VM instance types using the /cloud/instanceType endpoint.

    Note that within this InstanceTypeCapacity element you must provide the name of the instance type and not the ID. This is because the HostCapacityTemplate is region agnostic and therefore we have to use the names and not the IDs of the instance types.

    Capacity explained

    The capacity you indicate is related to the amount of physical cores in a machine. It is therefore important to differentiate between BMs and VMs, because the core count of VMs is usually indicated as vCpus, which are based on logical cores (threads) and not physical cores.

    The maximum number of game server instances you can deploy per physical core is 60.

    The following table illustrates a few different examples:

    Machine type
    CPU Cores
    Maximum number of game server instances

    Assignment to a HostCapacityTemplate

    Assignment of an InstanceTypeCapacity element to a HostCapacityTemplate is done during creation of this element by providing the ID of the HostCapacityTemplate in the hostCapacityTemplateId property.

    API example

    Create a new InstanceTypeCapacity for an already existing HostCapacityTemplate.

    HTTP request

    Request body

    Response body

    Related element

    This element is a child of the element.

    A/B Deployment Manually

    A/B deployment is an update process whereby you deploy new versions of your game servers alongside your already existing game servers.

    Initial situation sketch

    We have a Fleet with 1 ApplicationBuild in its GameDeploymentTemplate.

    This chapter assumes you already have created a new ApplicationBuild for your updated software.

    Actions to perform

    • create a new GameDeploymentTemplate with the new ApplicationBuild ID.

    • create the new Fleet (based on the old one).

    • start sending the first updated clients to the game servers running the new build in the new Fleet (e.g. a group of testers).

    • if there is something wrong, downgrade those clients and send everyone back to the old build in the old Fleet. You can remove the new Fleet if you want to destroy all the game servers running the new build.

    API example

    Step 1: get Fleet details

    We need to get the Fleet object so that we can create a new one, based on this old one.

    If you do not know your Fleet ID yet, you can look it up by using .

    HTTP request

    Response body

    Step 2: create new GameDeploymentTemplate

    Before we create the new Fleet, first create a new GameDeploymentTemplate with your new ApplicationBuild ID, which can be used in the new Fleet.

    If you do not know your new ApplicationBuild ID yet, you can look it up by using .

    HTTP request

    Request body

    Response body

    Step 3: create new Fleet

    Now we can create the new Fleet based on the old Fleet, with the new GameDeploymentTemplate.

    HTTP request

    Request body

    Response body

    Step 4: activate the new Fleet

    Set the new Fleet's property to 2 (Automatic scaling enabled) to have the platform start deploying new game servers for it.

    HTTP request

    Request body

    Response body

    New game servers will be deployed now, for this new Fleet and you can start sending your first clients to them.

    If you spot errors with the new game servers, you could revert the creation of the new Fleet and GameDeploymentTemplate. Or you can leave them to use for later with a new build containing any fixes.

    Step 5: remove old Fleet

    When everything is going well with the new game servers and once all clients have migrated to the new version, remove the old fleet.

    This action still needs the markedForDeletion property / functionality implemented!

    HTTP request

    Response body

    Sdk Unity Plugin

    SDK Unity Plugin

    Version: v0.9 (Beta)

    All v1.0 features are complete and ready for integration and use. Customer iteration will determine any final changes before labelling as v1.0.


    Overview

    The Plugin provides multiple components to interact with the i3D ONE Platform.

    1. Arcus is the library that provides communication between the Game Server and the scaling environment in the One Platform. It is to be integrated into the Game Server. It contains a C/C++ implementation of the ONE platform's Arcus protocol and messages, and provides a TCP server to communicate with the ONE Platform.

    2. Ping is a library that provides a way to obtain server addresses of the ONE backend and utilities to ping the servers, for use in a game's player client code's matchmaking features.

    Arcus Component

    The plugin provides Unity game servers with the ability to communicate over TCP with the i3D.net ONE Platform, for easy and efficient scaling of game servers.

    • - How to integrate the plugin into a game server.

    • - How to create a new package.

    The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading this guide, please .

    Supported platforms:

    Requirements

    1. Minimum compatible Unity version: 2017.4.40f1.

    2. Native SDK libraries require C++ Redistributable 2017 to be installed on Windows. Download the installer and follow its instructions:

    Integration guide

    1. Simply download from the online repository.

    2. In Unity Editor, go to Assets > Import Package > Custom Package... menu.

    3. Select the package from step 1 and click Open.

    4. In the opened window, click Import.

    How to test

    There are two ways to test a Game Server that is running an Arcus Server:

    1. The SDK contains a Fake Agent that can connect and simulate a real deployment. Build and run instructions can be found .

    2. The Game Server can be uploaded to a live One Development Platform Deployment.

    Testing can be performed either in Unity Editor or on a build running in headless mode.

    Ping Component

    The plugin provides Unity game servers with the ability ping and gather ping statistics for i3D ONE Platform servers.

    • - How to integrate the plugin into a game server.

    • - An example of how to use the plugin.

    • - How to create a new package.

    The i3D.net Game Hosting SDK works on Windows and Linux. If you need further assistance after reading this guide, please .

    Supported platforms: - Windows 10 Pro - Ubuntu 18.04

    Requirements

    1. Minimum compatible Unity version: 2017.4.40f1.

    2. Native SDK libraries require C++ Redistributable 2017 to be installed on Windows. Download the installer and follow its instructions:

    Ping component integration guide

    1. Simply download from the online repository.

    2. In Unity Editor, go to Assets > Import Package > Custom Package... menu.

    3. Select the package from step 1 and click Open.

    4. In the opened window, click Import.

    How to test

    The example ping can be used standalone to test. The example ping will fetch the i3D sites information and start pinging the different sites.

    Testing can be performed in Unity Editor.

    SDK native libraries

    Optional - for developers that need to recompile the C++ source used by the plugin.

    The libraries are built using the .

    build_sdk_dlls.bat can be used to build all necessary native assemblies on Windows. Docker must be installed (see ). build_client_sdk_dlls.bat can be used to build all necessary native assemblies on Windows. Docker must be installed (see ).

    For example:

    Package export

    Optional - for developers that need to rebuild and repackage the plugin.

    Consider potential Unity Version conflicts - ensure the package is built with the lowest Unity Editor Version that your users will be using.

    Steps:

    1. Close the project in the Editor (if opened). This is needed to unload the SDK libraries.

    2. Update the native SDK libraries if needed. The easiest way is to use build_dlls.bat script. Alternatively, they can be rebuilt manually by following the instructions in the .

    3. Open the project. Upgrade the project to match required Unity version, if needed.

    4. Go to "Assets -> Export Package..." menu item.

    Deploymentprofile

    The DeploymentProfile is the main element that determines how your will be deployed.

    Figure 1: Highlighting where the DeploymentConfiguration element belongs in the overview

    Usage

    A DeploymentProfile is always the only child of a . As such, you can only have one DeploymentProfile per Fleet.

    A DeploymentProfile allows you to set global deployment configuration options which define how ApplicationInstances are deployed within its children. DeploymentRegions allow you to override most configuration options.

    Utilitydeploymenttemplate

    The UtilityDeploymentTemplate indicates which utility / utilities you want to deploy onto each host (bare metal or VM). A utility, also known as a sidecar, is always deployed once per host. You can indicate whether a utility should be deployed only on bare metal servers or virtual machines, or both.

    When a new host is selected for deployment of game servers, the utility will be the first thing to be deployed onto the host. Reversely, when a host has been freed from any game server applications, the utilities will be removed again, cleaning up the host.

    ![UtilityDeploymentTemplate](../images/DeploymentConfigurationOverviewUtilDepTempl.png)Figure 1: Highlighting where the UtilityDeploymentTemplate elements belong in the overview

    Usage

    A UtilityDeploymentTemplate is used by a and defines which ApplicationBuilds (of type Utility) will be deployed for that Fleet. A single UtilityDeploymentTemplate can define more than one ApplicationBuild by adding multiple

    Cloud Credentials

    To make use of the cloud scaling part of the ONE Game Hosting service, you generally need not worry about creating your own accounts at the hyper cloud providers we support (AWS, GCP, Azure, Tencent). We will use our own accounts with them. By using our credentials, you don't have to worry about cloud accounts, cloud credentials, cloud billing, cloud images, regional access, quotas, etc. You will also take advantage of our bulk pricing agreements with the cloud providers.

    That said, if for some reason you want to use your own credentials, you can. For a single cloud provider or multiple, the choice is yours.

    At this time, we only support the i3D.net's Tencent Cloud account.

    Applicationbuildproperty

    The ApplicationBuildProperty is an element that adds meaning to the element. E.g. you can define that an application uses a certain network port, or requires a password, together with a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to work properly.

    You cannot create an ApplicationBuildProperty yourself. They will be inherited from the and its elements the ApplicationBuild is based on. You CAN override property values if you need to.

    Events

    Platform events are an experimental feature, enabled for select clients and sent through RabbitMQ. Our platform generates all of the events described below at different points within the different services of the platform allowing clients to track what is happening with application instances, VMs and other components. We are adding more events and making changes over time, to eventually create a public events system for everyone, published in several ways, e.g. RabbitMQ, Web Sockets, Webhooks, etc.

    If you are interested in taking part in this test, please contact us via the usual means of communication.

    Service API

    Registering Application And Builds

    Probably the first thing you will want to do when starting with our platform is setup your Application (Game).

    In this example we will create an Application and demonstrate how you can upload and register the builds for that Application.

    The following elements will be created in this chapter:

    Cloud Usage

    The ONE Game Hosting service enables you to use the hyper cloud providers to scale onto whenever you need additional capacity.

    For this to work, you do not need to do anything special. You do not have to worry about cloud accounts, cloud credentials, cloud billing, cloud images, regional access, quotas, etc. We take care of that for you, by default. That said, you can still use your own cloud credentials if you prefer, or must for specific reasons.

    Supported cloud providers

    We support the following cloud providers on the ONE Game Hosting service:

    [
        {
            "id": "3878562502763646783",
            "buildProvisionRegistrationId": "7495746709577092943",
            "filename": "test.test",
            "fileSize": "976353",
            "md5CheckSum": "d41d8cd98f00b204e9800998ecf8427e",
            "createdAt": 1595485988,
            "changedAt": 0,
            "deletedAt": 0
        }
    ]
    {
      "name": "Bluewolf",
      "applicationId": "245926280441350104",
      "executable": "bw",
      "startupParameters": "-p VAR_GAME_PORT",
      "osId": 151,
      "label": [
        {
          "key": "version",
          "value": "1.1"
        }
      ],
      "applicationBuildFile": {
        "buildProvisioningRegistrationId": "7495746709577092943",
        "buildProvisioningFileId": "3878562502763646783",
        "version": "1.1"
      }
    }
    {
      "name": "Bluewolf",
      "applicationId": "245926280441350104",
      "executable": "bw",
      "startupParameters": "-p VAR_GAME_PORT",
      "osId": 151,
      "label": [
        {
          "key": "version",
          "value": "1.1"
        }
      ],
      "applicationBuildFile": {
        "buildProvisioningRegistrationId": "7495746709577092943",
        "filename": "gamebuild.1.1.zip",
        "path": "/",
        "domain": "builds.gamedev.org",
        "version": "1.1"
      }
    }
    [
      {
        "id": "2873523614050361171",
        "name": "Bluewolf",
        "applicationId": "2801917034933755411",
        "executable": "bw",
        "startupParameters": "-p VAR_GAME_PORT",
        "installId": 9837,
        "osId": 151,
        "label": [
          {
            "key": "version",
            "value": "1.1"
          }
        ]
      }
    ]
    git submodule update --init --recursive
    sudo apt-get update
    sudo apt-get install libssl-dev
    {
     "startParameters": "dclocation: \\\"<YOUR PARAMETER>\\\" regionId:2434242"
    }
    // Server name
    hostname=Bluewolf VARAPPLICATIONINSTANCEID
    
    // Arcus management passsword
    arcus_password=VAR_MANAGEMENT_PASSWORD
    
    // Server password
    srv_password=VAR_SRVPASSWORD
    
    // etc
        Remember `_` is a character that can exist in a VAR name, so **this will not work**: `-regionIdent VARREGIONNAME_VARAPPLICATIONINSTANCEID`
    {
      "name": "MyDependencyDeploymentTemplate",
      "dependencyInstallerBuildId": "8745373309035959830",
      "dependencyUninstallerBuildId": "7757624915909160276"
    }
    [
      {
        "id": "8166517913064065155",
        "name": "MyDependencyDeploymentTemplate",
        "dependencyInstallerBuildId": "8745373309035959830",
        "dependencyUninstallerBuildId": "7757624915909160276",
        "fleetIds": [
          0
        ],
        "inUse": 0,
        "createdAt": 1573650353
      }
    ]
    {
      "dependencyDeploymentTemplateId": "6537333393893172977"
    }
    [
      {
        "id": "string",
        "name": "string",
        "deploymentEnvironmentId": "string",
        "deploymentProfileId": "string",
        "gameDeploymentTemplateId": "string",
        "utilityDeploymentTemplateId": "string",
        "dependencyDeploymentTemplateId": "8166517913064065155",
        "operationalStatus": 0
      }
    ]
    RunUAT.bat BuildPlugin -plugin="%USERPROFILE%/source/repos/one-gamehosting-sdk-unreal/4.26/ONEGameHostingPlugin/ONEGameHostingPlugin.uplugin" -package="%USERPROFILE%/.../Plugins/ONEGameHostingPlugin"
    - Windows 10 Pro
    - Ubuntu 18.04
    Amazon Web Services
  • Azure

  • Google Cloud Platform

  • Tencent Cloud

  • At this time, we only support the i3D.net's Tencent Cloud account.

    Cloud credentials

    To make use of the cloud scaling part of the ONE Game Hosting service, you need not worry about creating your own accounts at the hyper cloud providers we support (AWS, GCP, Tencent, etc). We will use our own credentials for their functionality.

    Continue reading ...

    Cloud instance types

    A cloud instance type defines the amount of hardware resources (e.g. CPU cores & memory) a VM will have available.

    Continue reading ...

    The management protocol supported by the application (only applies when Application Type is Game server): 0: None 1: A2S 2: Arcus

    name

    string

    Yes

    The name of the application

    description

    string

    No

    A description of the application

    websiteUrl

    string

    No

    A website URL for the application

    developerName

    string

    No

    The developer of the application

    publisherName

    string

    No

    The publisher of the application

    stopDefaultOsGroup

    int

    no

    The default operating system group being used for the stop method, WINDOWS = 1, LINUX = 2. If you have a Windows and Linux ApplicationBuild you can overwrite on the AplicationBuild level. The default operating system is Linux

    stopMethod

    int

    no

    The stop method that will be used on restart or destroy of an application instance. The default is hard kill

    stopTimeout

    int

    no

    The timeout that will be used on restart or destroy of an application instance. The default is 0 (no timeout)

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    inUse

    int

    Read-only

    If the application currently in use or not

    VARCOUNTRY

    The full name of the country in which the host is located

    VARDCLOCATIONID

    The ID of the data center location in which the host is located

    VARDCLOCATION

    The name of the data center location in which the host is located

    VARDEPLOYMENTENVIRONMENTID

    The ID of the DeploymentEnvironment of this ApplicationInstance

    VARDEPLOYMENTENVIRONMENTNAME

    The name of the DeploymentEnvironment of this ApplicationInstance

    VARREGIONID

    The identifier of the DeploymentRegion in which the host is located

    VARREGIONNAME

    The name of the DeploymentRegion in which the host is located

    VARPROVIDER

    The name of the owner of the (physical or virtual) server (e.g. i3D.net, GCP, AWS, etc.)

    VARFLEETID

    The identifier of the Fleet in which the host is located

    VARFLEETNAME

    The name of the Fleet in which the host is located

    VARAPPLICATIONID

    The identifier of the Application element belonging to the ApplicationInstance that is being deployed

    VARAPPLICATIONBUILDID

    The identifier of the ApplicationBuild element that is being deployed

    VARAPPLICATIONINSTANCEID

    The ID of the ApplicationInstance that's being deployed

    VARIPV4PRIVATE

    RFC-1918 IPv4 address of the host an application is deployed on

    VARIPV4PUBLIC

    Public IPv4 address of the host an application is deployed on

    VARIPV4BINDING

    IPv4 address that should be used by an application to bind on (e.g. a cloud VM will locally only see the host's private IP and not the public IP)

    VARIPV6

    IPv6 address of the host an application is deployed on

    VARIPV6BINDING

    IPv6 address that should be used by an application to bind on (e.g. a cloud VM will locally only see the host's private IP and not the public IP)

    PacketID

    uint

    Unique packetId for the request

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Optional payload of the packet

    Docker
    Email
    deployment environment
    C++ SDK

    Name of the template

    inUse

    boolean

    Read-only

    Indicates whether this template is actively being used in a Fleet

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    dependencyInstallerBuildId

    string

    Yes

    Identifier of the DependencyInstaller ApplicationBuild you want to deploy

    dependencyUninstallerBuildId

    string

    Yes

    Identifier of the DependencyUninstaller ApplicationBuild you want to deploy

    Fleet

    string

    Yes

    No

    The name of the property

    propertyValue

    mixed

    Only for network port

    No

    The value of the property

    password8

    string

    no

    An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    3

    password16

    string

    no

    A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    4

    password24

    string

    no

    A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    5

    public network port range

    A number between 2 and 200

    yes

    A number indicating the size of the desired port range.

    6

    private network port

    A number between: 30000 - 49151

    yes

    Indicates a default private network port for your application. When the system deploys a new ApplicationInstance, it will find a unique network port to use, per host. The default value is taken as the initial value and will be incremented by 50 until a free port is found.

    7

    private network port range

    A number between 2 and 200

    yes

    A number indicating the size of the desired port range.

    public network port (1)

    gamePort

    11000

    private network port (6)

    adminPort

    31000

    password16 (3)

    adminPass

    <empty>

    public network port (1)

    gamePort

    11005

    private network port (6)

    adminPort

    30530

    password16 (3)

    adminPass

    d092FuOIAdFGv329

    propertyId

    string

    N/A

    Yes

    Unique identifier of the element

    propertyType

    int

    Yes

    No

    Type ID of the property

    0

    raw value

    mixed

    no

    A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.

    1

    public network port

    A number between: 10240 - 29999

    yes

    Indicates a default public network port for your application. When the system deploys a new ApplicationInstance, it will find a unique network port to use, per host. The default value is taken as the initial value and will be incremented by 50 until a free port is found.

    ApplicationBuild
    ApplicationBuild

    propertyKey

    2

    Application
    Creating a Dependency (Un-)Installer application
    operationalStatus
    Application
    Creating a Dependency (Un-)Installer application
    Application
    creation of other types of Applications
    create
    shebang
    minimum capacity
    minimum capacity
    minimum capacity
    buffer value
    minimum capacity
    buffer value
    DependencyDeploymentTemplate
    DependencyDeploymentTemplate

    VM

    16 vCpus

    16 _ 0.5 _ 60 = 480

    VM

    64 vCpus

    64 _ 0.5 _ 60 = 1920

    id

    string

    Read-only

    Unique identifier of this element

    hostCapacityTemplateId

    string

    Read-only

    The ID of the HostCapacityTemplate it is a child of

    providerId

    int

    Yes

    The ID of the /cloud/provider to which the instanceType property applies

    instanceType

    string

    Yes

    The name of the instance type to which the capacity applies. See GET /cloud/instanceType (for virtual servers) and GET /host/instanceType (for bare metal servers)

    isVirtual

    int

    Read-only

    1 if the instance type is a virtual server, 0 if it is a bare metal server

    capacity

    int

    Yes

    The capacity (number of instances) of the instance type. Minimum value: 1, maximum value: 60

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    BM

    4 cores

    4 * 60 = 240

    BM

    16 cores

    16 * 60 = 960

    BM

    64 cores

    64 * 60 = 3840

    VM

    4 vCpus

    Full API reference
    POST /v3/hostCapacityTemplate/{hostCapacityTemplateId}/instanceTypeCapacity
    HostCapacityTemplate

    4 _ 0.5 _ 60 = 120

    if all went well, update all your clients and send those to the game servers running the new build.

  • eventually all clients are migrated. The old Fleet can be removed.

  • GET /fleet
    GET /fleet/988194285688223011
    GET /applicationBuild
    POST /deploymentTemplate/game
    POST /fleet
    operationalStatus
    PUT /fleet/2501509179291972037/operationalStatus
    DELETE /fleet/988194285688223011

    Docker (Optional for developers building C++ Shared Libraries).

    Add OneServer component to a scene that is loaded before online gameplay starts.

    • The component is marked as DontDestroyOnLoad, so the object it's attached to will persist on scene transitions, maintaining the Arcus Server from that point forward.

    • For game servers that host multiple gaming sessions on a single process, each session should have its own OneServer.

  • Refer to the [example game] (https://github.com/i3D-net/ONE-GameHosting-SDK-Unity/tree/master/ONE%20SDK%20Plugin/Assets/Plugins/i3D/Example) on how to set up and use the component.

  • Follow the next task: How to test below.

  • Docker (Optional for developers building C++ Shared Libraries).

    Follow the next task How to test below

    Make sure to select the "i3D" subfolder from the "Plugins" folder. All the other folders, if there are any, should be deselected.

  • Click "Export..." and select the output path.

  • Integration guide
    Package export
    file an issue
    x64
    x86
    the Unity package
    here
    Integration guide
    Sample game
    Package export
    file an issue
    x64
    x86
    the Unity package
    SDK source code
    Requirements
    Requirements
    SDK repository
    Using your own credentials

    For each cloud provider you prefer to use your own credentials, you submit said credentials to our platform. The following chapters should be taken into account when doing so:

    Securing your own credentials

    We advise locking down your credentials by adding our system IP addresses to your credentials whitelist. The IP addresses and ranges to add are:

    • 188.122.92.192/26

    • 188.122.94.105

    • 188.122.94.89

    • 188.122.94.47

    Projects

    Some cloud platforms (e.g. GCP) use projects to separate a cloud account into sections that can easily be managed. When using your own cloud credentials, we advise you create a new project for i3D.net's ONE Game Hosting service before you create anything else. You give the project any name you prefer.

    We will always clearly tag VM's with unique identifiers and use those to identify VMs created by our platform in case separation by projects is not an option.

    Permissions

    AWS

    When creating a service account in AWS, you can use the default permissions. You can verify these are correct by checking its permissions against the following list:

    • ec2:CreateTags

    • ec2:DeleteTags

    • ec2:DescribeInstanceStatus

    • ec2:DescribeInstances

    • ec2:DescribeRegions

    • ec2:DescribeTags

    • ec2:MonitorInstances

    • ec2:ReportInstanceStatus

    • ec2:RunInstances

    • ec2:StartInstances

    • ec2:StopInstances

    • ec2:TerminateInstances

    • iam:GetPolicyVersion

    • iam:GetUser

    • iam:ListPoliciesGrantingServiceAccess

    • iam:ListPolicyVersions

    AWS does not support projects, so no configuration is needed in that context. We identify your Game Hosting VMs by the tag we assign to them upon creation.

    Azure

    When creating a Service Principal in Azure, you must grant it one or more Roles so that it has at least the following permissions, scoped to the Resource Group where you would like the resources to be created. You can create a Custom Role in Azure with exactly these permissions to avoid granting unnecessary permissions and to avoid dealing with multiple Azure Roles.

    • Microsoft.Resources/subscriptions/read

    • Microsoft.Resources/subscriptions/resourceGroups/read

    • Microsoft.Network/networkSecurityGroups/read

    • Microsoft.Network/networkSecurityGroups/write

    • Microsoft.Network/virtualNetworks/read

    • Microsoft.Network/virtualNetworks/write

    • Microsoft.Network/networkSecurityGroups/join/action

    • Microsoft.Network/networkInterfaces/write

    • Microsoft.Network/virtualNetworks/subnets/join/action

    • Microsoft.Network/networkInterfaces/read

    • Microsoft.Compute/virtualMachines/write

    • Microsoft.Network/networkInterfaces/join/action

    • Microsoft.Compute/virtualMachines/read

    • Microsoft.Network/networkInterfaces/delete

    • Microsoft.Compute/virtualMachines/delete

    • Microsoft.Network/publicIPAddresses/write

    • Microsoft.Network/publicIPAddresses/read

    • Microsoft.Network/publicIPAddresses/delete

    • Microsoft.Network/publicIPAddresses/join/action

    GCP

    When creating a service account in GCP, you can use the default permissions. You can verify these are correct by verifying the service account has access to the Compute section of GCP. Make sure access is granted to the correct project.

    Billing permissions

    In order for our platform to handle billing properly, you must ensure that you have granted billing rights to the service account credentials you provide to our platform. The reason for this is that we need to charge a service fee on top of any incurred cloud costs. This permission should have been granted by default. If this is not the case, our platform will notify you when you submit your credentials to our platform.

    VM images

    When using your own credentials, you must also have the necessary VM images on your account (cross-account image usage is not supported). We will handle this automatically and will upload the necessary images to your cloud account(s).

    Networking & Firewall

    If you use your own cloud credentials, you also need to ensure that VMs created on your cloud account will have access to the internet. Or rather, your game clients must be able to connect to your game servers. We advise creating a security group or firewall policy and configure it with range the port ranges our platform provides: the public range 10240 - 29999 and the private range 30000 - 49151 for both TCP and UDP. Additionally remote administrator access is advisable for trouble shooting purposes, so add port 22 (Linux) or 3389 (Windows) as well.

    You can supply the name of the security group (AWS) or network (GCP) along with your cloud credentials. Please refer to the examples below for more information on how to submit a security group name or network name. A security group or network name is not required.

    Accessing your VMs (Key Pairs)

    To access your VMs when using your own cloud credentials, you must generate a key-pair. While doing so you must give it a name. You can pass this name while submitting your cloud credentials. Out platform will then run VMs in your cloud account with the given key-pair, allowing you to access your VMs. Please refer to the examples below for more information on how to submit the key-pair name. A key-pair value is not required.

    Be sure to enter your Key Pair. If you don't enter a Key Pair, it will automatically default to "i3dOdp" which will assume that is the actual filename.

    API examples

    All values below are invalid or otherwise faked, they are here only for example values. You should replace the body variables with your own data.

    Submitting AWS credentials

    POST /cloud/configuration/credential

    JSON request data:

    Submitting Azure credentials

    POST /cloud/configuration/credential

    JSON request data:

    The resourceName property is the name of the resource that you must create / have created in Azure to host your application in. Upon submission of the credentials this resource must exist in the defaultRegion that you provide. You do not have to create the resource in other regions - our platform will automatically create the resource if it does not yet exist.

    Submitting GCP credentials

    POST /cloud/configuration/credential

    JSON request data:

    Updating your Cloud credentials

    If you (for example) have an API key that has expired and you need to replace it, follow the steps below.

    It's important to note to remove any VMs that are running on your expired key before you update your cloud credentials. They will not be removed automatically when you update your cloud credentials.

    1. Submit your new credentials with your respective Cloud provider.

    2. Delete your old credentials by using a DELETE HTTP request with your previous credential.

    ApplicationBuild

    See also: Application Element Relations

    Application

    The Application element represents your application or to be more specific, your game or a utility.

    In the following example we'll create a game Application:

    Full API reference

    HTTP request

    POST /v3/application

    Request body

    Response body

    ApplicationProperty

    The ApplicationProperty is an element that adds meaning to the Application element. E.g. you can define that an application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to function properly.

    In this example we will create 3 properties:

    • gameport

    • managementport

    • managementpassword

    The gameport property

    This property is of type "public network port" (1). Its value must be either 0 for auto-configuration (recommended) or between 10240 - 29999. The latter will serve as the default port to use upon deployment. If the port is already in use by another game server on the same host, we will keep incrementing the value until we find a free port.

    Full API reference

    HTTP request

    POST /v3/application/245926280441350104/property

    Request body

    Response body

    The managementport property

    This property is of type "private network port" and works just like the game port in the previous property example, except it will be picked from the private port range (30000 - 49151). However, the name managementport is special in that by defining this property you tell the platform that we can use this port to contact your game server's management protocol. In the Application example above, we have indicated that our Application supports the Arcus (2) management protocol.

    HTTP request

    POST /v3/application/245926280441350104/property

    Request body

    Response body

    The managementpassword property

    This property tells the platform to connect to Arcus with the given password. In this example though, the property value is left blank. This means the platform will create a unique (8 character) password for each game server. If you supply a property value instead, the platform will use that password for all your game servers.

    HTTP request

    POST /v3/application/245926280441350104/property

    Request body

    Response body

    ApplicationBuild

    There is one thing left to do: create an ApplicationBuild that essentially tells the platform how to run your game server.

    Full API reference

    HTTP request

    POST /v3/applicationBuild

    Request body

    Response body

    Great! You've setup your application (game) and you have created an ApplicationBuild that you can now use in your Deployment Template. To learn how, continue with the next chapter: Creating a completely configured deployment environment from scratch.

    Application
    ApplicationProperty
    ~/src/UnrealEngine/Engine/Build/BatchFiles/RunUAT.sh BuildPlugin -plugin=../one-gamehosting-sdk-unreal/4.26/ONEGameHostingPlugin/ONEGameHostingPlugin.uplugin -package=../One/ONEGameHostingPlugin -TargetPlatform=Linux
    apt-get -y install openssl
    apt-get -y install libatomic1
    cp ./MyCustomLib.so /usr/local/lib/
    apt-get -y remove openssl
    apt-get -y remove libatomic1
    rm /usr/local/lib/MyCustomLib.so
    $cwd = (Get-Item -Path ".\").FullName
    msiexec.exe /i $cwd\MyDependencyInstaller.msi /QN
    $cwd = (Get-Item -Path ".\").FullName
    msiexec.exe /x $cwd\MyDependencyInstaller.msi /QN
    {
      "providerId": 31,
      "instanceType": "c2-standard-8",
      "capacity": 8
    }
    [
      {
        "id": "4847342966680359842",
        "hostCapacityTemplateId": "4943474277300823573",
        "providerId": 31,
        "instanceType": "c2-standard-8",
        "isVirtual": 1,
        "capacity": 8,
        "createdAt": 1579009662
      }
    ]
    [
        {
            "id": "988194285688223011",
            "name": "Example Fleet",
            "deploymentEnvironmentId": "1528510395058174656",
            "deploymentProfileId": "2641748478114564847",
            "gameDeploymentTemplateId": "6629032387499739571",
            "utilityDeploymentTemplateId": "",
            "operationalStatus": 2
        }
    ]
    {
      "name": "Example Game Deployment Template (new)",
      "gameDeploymentTemplateBuild": [
        {
          "applicationBuildId": "817092209556457642"
        }
      ]
    }
    [
        {
            "id": "3700287048120517011",
            "fleetIds": [],
            "name": "Example Game Deployment Template (new)",
            "inUse": 0,
            "createdAt": 1567591403,
            "gameDeploymentTemplateBuild": [
                {
                    "applicationBuildId": "817092209556457642"
                }
            ]
        }
    ]
    {
        "name": "Example Fleet (new)",
        "deploymentEnvironmentId": "1528510395058174656",
        "deploymentProfileId": "2641748478114564847",
        "gameDeploymentTemplateId": "3700287048120517011",
        "utilityDeploymentTemplateId": ""
    }
    [
        {
            "id": "2501509179291972037",
            "name": "Example Fleet (new)",
            "deploymentEnvironmentId": "1528510395058174656",
            "deploymentProfileId": "2641748478114564847",
            "gameDeploymentTemplateId": "3700287048120517011",
            "utilityDeploymentTemplateId": "",
            "operationalStatus": 0
        }
    ]
    {
      "operationalStatus": 2
    }
    [
        {
            "id": "2501509179291972037",
            "name": "Example Fleet (new)",
            "deploymentEnvironmentId": "1528510395058174656",
            "deploymentProfileId": "2641748478114564847",
            "gameDeploymentTemplateId": "3700287048120517011",
            "utilityDeploymentTemplateId": "",
            "operationalStatus": 2
        }
    ]
    [
        {
            "id": "988194285688223011",
            "name": "Example Fleet",
            "deploymentEnvironmentId": "1528510395058174656",
            "deploymentProfileId": "2641748478114564847",
            "gameDeploymentTemplateId": "6629032387499739571",
            "utilityDeploymentTemplateId": "",
            "operationalStatus": 2,
            "markedForDeletion": 1 <<< not implemented yet
        }
    ]
    - Windows 10 Pro
    - Ubuntu 18.04
    build_sdk_dlls.bat C:\path_to_sdk
    build_client_sdk_dlls.bat C:\path_to_sdk
    {
        "providerId": 27,
        "name": "my-aws-credentials",
        "params": {
            "accessKeyId": "9NCE78VT76BC4GR38BNW",
            "secretAccessKey": "NQ8s64wpfvnN4LEiXmGJN5aUwSPAGcubljsL5LbG",
            "defaultRegion": "eu-central-1",
            "securityGroup": "test-security-group",
            "keyPair": "myVmKeyPairName",
        },
        "status": 1
    }
    {
        "providerId": 28,
        "name": "azure-credentials",
        "params": {
            "tenantId": "e1468f6f-1574-4145-a8eb-f856ab455eed",
            "subscriptionId": "8220edd7-a771-40da-a60b-ccebd11de763",
            "clientId": "5ba888cd-bbaa-4da1-8526-fc6d2fbabd98",
            "clientSecretKey": "kmORJNvMWT6W71mF6W/Nq/jXyUyzFDbD",
            "resourceName": "LIVE-RESOURCE",
            "defaultRegion": "westeurope"
        },
    }
    {
        "providerId": 31,
        "name": "my-gcp-credentials",
        "params": {
            "projectName": "myCloudProject",
            "authJson": {
                "type": "service_account",
                "project_id": "celtic-medium-936452",
                "private_key_id": "ZOm76pt5AtMlAKhzLrwqngQC6OGTThlZfXIYI2eJ",
                "private_key": "-----BEGIN PRIVATE KEY-----\nPRIVATEKEY-GOES-HERE\n-----END PRIVATE KEY-----\n",
                "client_email": "[email protected]",
                "client_id": "182634629475355783532",
                "auth_uri": "https://accounts.google.com/o/oauth2/auth",
                "token_uri": "https://oauth2.googleapis.com/token",
                "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
                "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/98765473562-compute%40developer.gserviceaccount.com"
            },
            "keyPair": "myVmKeyPairName",
            "network": "myOdpNetworkName"
        },
      "status": 1
    }
    {
      "type": 1,
      "managementProtocol": 2,
      "name": "Bluewolf",
      "websiteUrl": "www.bluewolf.game.com",
      "description": "Life is not the same after meeting your worst enemy",
      "developerName": "Crywolf",
      "publisherName": "ThePubs"
    }
    [
      {
        "id": "245926280441350104",
        "type": 1,
        "managementProtocol": 2,
        "name": "Bluewolf",
        "websiteUrl": "www.bluewolf.game.com",
        "description": "Life is not the same after meeting your worst enemy",
        "developerName": "Crywolf",
        "publisherName": "ThePubs",
        "createdAt": 1568316402,
        "inUse": 0
      }
    ]
    {
      "propertyType": 1,
      "propertyKey": "gameport",
      "propertyValue": "60100"
    }
    [
      {
        "id": "521575199273317208",
        "propertyType": 1,
        "propertyKey": "gameport",
        "propertyValue": "60100"
      }
    ]
    {
      "propertyType": 6,
      "propertyKey": "managementport",
      "propertyValue": "0"
    }
    [
      {
        "id": "68643036590177757",
        "propertyType": 6,
        "propertyKey": "managementport",
        "propertyValue": "0"
      }
    ]
    {
      "propertyType": 2,
      "propertyKey": "managementpassword",
      "propertyValue": ""
    }
    [
      {
        "id": "519833085683350374",
        "propertyType": 2,
        "propertyKey": "managementport",
        "propertyValue": ""
      }
    ]
    {
      "name": "Bluewolf-server PC",
      "executable": "bluewolf-server",
      "startupParameters": "-gameport VAR_GAMEPORT -managementport VAR_MANAGEMENTPORT -managementpassword VAR_MANAGEMENTPASSWORD",
      "installId": 627322,
      "osId": 151,
      "label": [
        {
          "key": "platform",
          "value": "pc"
        }
      ]
    }
    [
      {
        "id": "2324653987059528218",
        "name": "Bluewolf-server PC",
        "applicationId": "245926280441350104",
        "type": 1,
        "executable": "bluewolf-server",
        "startupParameters": "-gameport VAR_GAMEPORT -managementport VAR_MANAGEMENTPORT -managementpassword VAR_MANAGEMENTPASSWORD",
        "installId": 627322,
        "osId": 151,
        "createdAt": 1568319468,
        "label": [
          {
            "key": "platform",
            "value": "pc"
          }
        ]
      }
    ]
    API v3 Authentication
  • API v3 Error Handling

  • API v3 Error Codes

  • Deployment Configuration
  • Deployment Process

  • Automatic Deployment

  • Automatic Scaling

  • Dependency Installation

  • Patching processes

    • Patching Overview

    • Utility Patching Process

    • Forced Deployment

  • ApplicationBuildProperty

  • ApplicationBuildConfiguration

  • ApplicationInstance

  • ApplicationInstanceProperty

  • ApplicationInstanceIP

  • Label

  • Metadata

  • Element Relations

  • Platform Variables

  • Deployment

    • DeploymentEnvironment

    • Fleet

    • DeploymentProfile

    • Deployment Templates

    • Host Capacity

  • Host

    • Host

    • HostCpu

    • HostIp

  • Patching

    • PatchJob

    • PatchJobApplicationBuild

    • PatchJobFleet

  • SDK Unity Plugin

  • SDK Unreal Engine Plugin

  • Matchmaker Allocation

  • Ping Beacon Request Response

  • Upgrade Google Cloud Provider VMs to AMD Milan

  • Game Server Run Status

  • Management Protocol

    • Management Protocol

    • A2S

    • Arcus

    • Arcus V2

  • Define your application and create your application build
    Create your game, utility, dependency, or capacity templates
    Game deployment environment, profile, and fleets introduction
    Service Overview
    Quick Start
    Terminology
    API v3 Usage
    Process Overview
    Application Management
    ApplicationBuild Provisioning
    ApplicationBuild Management
    Application
    ApplicationProperty
    ApplicationBuild
    Feature Overview
    Triggers
    Task System
    Platform Events
    Cloud Usage Overview
    Cloud Credentials
    Cloud Instance Types
    Game Integration Overview
    SDK Overview
    Build Guide
    Integration Guide
    Platform Events
    Registering your application and builds
    Creating a completely configured deployment environment from scratch

    inUse

    boolean

    Read-only

    Indicates whether this template is actively being used in a Fleet

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    gameDeploymentTemplateBuild

    []

    Yes

    List of GameDeploymentTemplateBuild elements, pointing to ApplicationBuilds

    id

    string

    Read-only

    Unique identifier of this element

    fleetIds

    [int]

    Read-only

    List of Fleet IDs this template is used in

    name

    string

    Yes

    applicationBuildId

    string

    Yes

    Identifier of the ApplicationBuild you want to deploy

    "Automatic Deployment"
    DeploymentProfile.minimumCapacity
    "Automatic Scaling"
    Full API reference
    POST /v3/deploymentTemplate/game
    Full API reference
    PUT /v3/fleet/{fleetId}
    Orchestrator Overview
    Game Deployment Quick Start Guide
    i3d.net API documentation

    Name of the template

    Element structure
    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    name

    string

    Yes

    Name of the DeploymentProfile

    description

    string

    No

    Table 1: DeploymentProfile element structure

    Minimum capacity

    When you enable automatic deployment or automatic scaling on a Fleet, our automatic scaling mechanism will start by deploying the number of Application Instances defined by the DeploymentProfile.minimumCapacity value. The number of deployed instances will never drop below this value, even if there are no players at all. The minimumCapacity value as such can be used in preparation for a new release, to ensure you have enough game servers to begin with upon release of your game.

    If the DeploymentProfile.minimumCapacity value exceeds your bare metal capacity, the scaler will continue to deploy in the cloud, provided cloud locations have been defined for the relevant regions.

    The DeploymentProfile.minimumCapacity value defines the minimum capacity - minimum amount of deployed game servers - for each individual region. You can override this value per region in case you would like more instances deployed in a region where you expect more players. But keep in mind, minimumCapacity is just for the initial deployment of instances. Our scaling mechanism will of course start scaling instances if more players are needed [in a certain region].

    The bufferValue

    Besides the minimumCapacity setting, there is the bufferValue setting which determines the size of the pool of ApplicationInstances that must be available at all times. The purpose of this buffer is to catch sudden increases in the number of players and as such, to attempt (to ensure) there are always sufficient free game servers for your clients to join. In other words, the bufferValue is there to compensate for the time it takes to deploy game servers. The longer that takes (related to the size of your build files), the larger the buffer should be. The larger the buffer, the less risc there is of running out of available game servers. It is therefore important not to set this value too low.

    API example

    Create a new DeploymentProfile within your i3D.net account.

    Full API reference

    HTTP request

    POST /v3/deploymentProfile

    Request body

    Response body

    Related topics

    • Orchestrator Overview

    • Game Deployment Quick Start Guide

    • i3d.net API documentation

    ApplicationInstances
    Fleet
    DeploymentRegion
    elements. Each of these defines a single ApplicationBuild (of type Utility).

    Each ApplicationBuild in the UtilityDeploymentTemplate will be deployed once per host, unless indicated otherwise in a UtilityDeploymentTemplateBuild. There you can indicate whether a utility should be deployed onto bare metal only, VM only or both (UtilityDeploymentTemplate.deployOn). Additionally a limit can be set to the amount of hosts the utilities are deployed on (UtilityDeploymentTemplate.installsPerLocation). This can be useful for certain types of utilities such as ping servers, for which you may only need a limited number.

    You can create as many UtilityDeploymentTemplates as you like within the platform. However, a Fleet can only point to one UtilityDeploymentTemplate at a time. A UtilityDeploymentTemplate can be shared (re-used) across multiple fleets though.

    Utilities / sidecars must be regular applications that run in the foreground. It is generally not a good idea to start utilities as a service.

    Element structure

    Property
    Value type
    Required
    Description

    id

    string

    Read-only

    Unique identifier of this element

    fleetIds

    [int]

    Read-only

    List of IDs this template is used in

    name

    string

    Yes

    Table 1: UtilityDeploymentTemplate element structure

    UtilityDeploymentTemplateBuild element structure

    Property
    Value type
    Required
    Description

    applicationBuildId

    string

    Yes

    Identifier of the you want to deploy

    deployOn

    int

    No

    1: bare metal 2: VM 3: both (default)

    installsPerLocation

    int

    No

    Table 2: UtilityDeploymentTemplateBuild element structure

    API example

    Create a new GameDeploymentTemplate within your i3D.net account.

    Full API reference

    HTTP request

    POST /v3/deploymentTemplate/utility

    Request body

    Response body

    Attach UtilityDeploymentTemplate to a Fleet:

    Full API reference

    HTTP request

    PUT /v3/fleet/{fleetId}

    Request body

    Response body

    Fleet
    UtilityDeploymentTemplate
    Element structure
    Property
    Value type
    Required
    Read-only
    Description

    propertyId

    string

    N/A

    Yes

    Unique identifier of the element

    propertyType

    int

    Yes

    No

    Type ID of the property

    Table 1: ApplicationBuildProperty element structure

    propertyKey constraints

    The characters allowed for a propertyKey are : a-z, 0-9, -, _ A property key must start with a lowercase character.

    The maximum length of a propertyKey is 50 characters.

    propertyValue constraints

    Any UTF-8 character is allowed in a propertyValue.

    The maximum length of a propertyValue is 150 characters.

    propertyType

    ApplicationBuildProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.

    Available property types

    A propertyType is indicated by a numerical ID. The following types are available:

    ID
    Type
    Value type
    Value required?
    Description

    0

    raw value

    mixed

    yes

    A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.

    1

    public network port

    0 or a number between 10240 - 29999

    yes

    Indicates a default or random network port for your application to use.

    Table 2: Property types

    Property inheritance

    An ApplicationBuild's properties will be inherited by all ApplicationInstance elements deployed for said ApplicationBuild.

    Property value overrides

    An ApplicationProperty's value can be overridden at later stages, in the listed order:

    1. an ApplicationBuild will inherit an Application's properties. Its values can be overridden in the ApplicationBuild (API documentation)

    2. a DeploymentRegion can override a property on a per-region basis. This can be useful if you want to define different property values for each deployment region, allowing you to start your applications with region-based startup parameters (API documentation)

    As such, an override on DeploymentRegion level always wins. If no override for a DeploymentRegion is present, an override of the ApplicationBuild will win. If no override for an ApplicationBuild is present, the original property value defined for the Application will win.

    Property usage

    Every property you define will become available as platform variables that can be used in configuration related properties: ApplicationBuild.startupParameters and ApplicationBuildConfiguration.configContents. Please see the platform variables topic for more details.

    Restrictions

    You can assign any number of ApplicationBuildProperty to an ApplicationBuild. There is no limitation there. The only rule is that you must have unique propertyKey names per ApplicationBuild.

    Relations

    See also: Application element relations

    Related topics

    • Orchestrator Overview

    • Game Deployment Quick Start Guide

    • i3d.net API documentation

    ApplicationBuild
    Application
    ApplicationProperty
    Event Group: Session
    Event name
    Example message

    LoginFailedAlreadyLoggedIn

    LoginFailedIncorrectPassword

    LoginFailedInvalidForm

    LoginFailedIPNotWhitelisted

    LoginFailedOTPExpired

    LoginFailedOTPInvalid

    Service API

    Event Group: User

    Event name
    Example message

    EmailChangeRequested

    EmailChangeRequestedResend

    EmailChangeRequestFailedEmailConflict

    EmailChangeRequestFailedWrongPassword

    EmailChangeSuccessful

    PasswordChangeFailedTooManyRequests

    Service ha-vmmanager

    Event Group: VM (1)

    Event name
    Example message

    VmCreate

    VM create started

    VmCreated

    VM is created successfully

    VmDestroy

    VM destroy started

    VmDestroyed

    VM is destroyed successfully

    VmStarted

    VM is started successfully

    VmStopped

    VM is stopped successfully

    Event Group: VM (2)

    Event name
    Example message

    19001

    Instance quota has been reached / exceeded

    19015

    Invalid key/pair name provided

    19014

    The instance configuration is not supported, check instance types, regions, and operating systems

    19002

    Instance zone resource pool exhausted

    Event Group: VM (3)

    Event name
    Example message

    UNDEFINED_ERROR

    variable error message

    RESOURCE_EXHAUSTED

    variable error message

    QUOTA_EXCEEDED

    variable error message

    Service ha-application-instance-manager

    Event Group: AIM

    Event name
    Example message

    AIMCreate

    Application instance create

    AIMDeployed

    Application instance is deployed

    AIMStarted

    Application instance couldn't be started because already inactive (0)

    AIMCrashed

    Application instance is crashed

    AIMStopped

    Application instance is stopped

    AIMDestroy

    Application instance delete

    Service ha-application-event

    Event Group: LIVESTATE

    Event name
    Example message

    livestate

    variable message

    Service ha-error

    Event Group: Arcus

    Event name
    Example message

    ?

    ?

    Deploymentregion

    The DeploymentRegion element defines a geographical region that contains one or more i3D.net data center (dc) locations.

    Figure 1: Highlighting where the DeploymentRegion elements belong in the overview

    Usage

    The amount of DeploymentRegion elements you can create is limited by the amount of i3D.net data center locations you are renting bare metal servers in.

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: DeploymentRegion element structure

    API example

    Create a new DeploymentRegion for a DeploymentProfile.

    HTTP request

    Request body

    Response body

    Forced Deployment

    The classical approach to updating game servers is to update them all at the same time, within a maintenance window. Clients cannot go online during this window and they will usually have to upgrade their client software in order to go online afterwards, depending on whether it concerns a compatible update or not. No game servers with different versions will exist alongside each other afterwards.

    Benefits

    • No extra server resources are required. The total amount of game servers will remain equal during a forced update

    Task System

    Tasks for remote command execution

    Our platform uses a task system to communicate with the Host Agents installed on all your hosts (BM and VM). A Task as such is a wrapper for one or more commands sent to a Host Agent. This wrapper keeps track of which command is currently being executed and its execution status. A Task can also contain a schedule time, allowing Tasks to be performed somewhere in the future. You can find an API example below.

    About our Anti-DDoS

    This document will explain the following:

    API v3 error handling

    Whenever an error is encountered in an API request, the Platform will return an Error element providing you with information on what exactly went wrong.

    Error element structure

    The Error element has the following structure:

    Property
    Value type
    Description
    {
      "name": "MyGameDeploymentTemplate",
      "gameDeploymentTemplateBuild": [
        {
          "applicationBuildId": "3776948653267321543"
        }
      ]
    }
    [
      {
        "id": "6537333393893172977",
        "fleetIds": [
          0
        ],
        "name": "MyGameDeploymentTemplate",
        "inUse": 0,
        "createdAt": 1573060361,
        "gameDeploymentTemplateBuild": [
          {
            "applicationBuildId": "3776948653267321543"
          }
        ]
      }
    ]
    {
      "gameDeploymentTemplateId": "6537333393893172977",
    }
    [
      {
        "id": "string",
        "name": "string",
        "deploymentEnvironmentId": "string",
        "deploymentProfileId": "string",
        "gameDeploymentTemplateId": "6537333393893172977",
        "utilityDeploymentTemplateId": "string",
        "operationalStatus": 0
      }
    ]
    {
      "name": "",
      "description": "",
      "strategyType": 0,
      "minimumCapacity": 0,
      "maximumCapacity": 0,
      "bufferValue": 0,
      "bufferValueType": 0,
      "bufferValueMin": 0,
      "bufferValueMax": 0,
    }
    [
      {
        "id": 0,
        "fleetIds": [
          0
        ],
        "name": "",
        "description": "",
        "strategyType": 0,
        "minimumCapacity": 0,
        "maximumCapacity": 0,
        "bufferValue": 0,
        "bufferValueType": 0,
        "bufferValueMin": 0,
        "bufferValueMax": 0,
        "markedForDeletion": false,
        "deploymentRegions": [],
        "createdAt": 0
      }
    ]
    {
      "name": "MyUtilityDeploymentTemplate",
      "utilityDeploymentTemplateBuild": [
        {
          "applicationBuildId": "3801243597300703061",
          "deployOn": 3,
          "installsPerLocation": 0
        }
      ]
    }
    [
      {
        "id": "5077110393967868847",
        "fleetIds": [
          0
        ],
        "name": "MyUtilityDeploymentTemplate",
        "inUse": 0,
        "createdAt": 1573060365,
        "utilityDeploymentTemplateBuild": [
          {
            "applicationBuildId": "3801243597300703061",
            "deployOn": 3,
            "installsPerLocation": 0
          }
        ]
      }
    ]
    {
      "utilityDeploymentTemplateId": "8243136848298003197",
    }
    [
      {
        "id": "string",
        "name": "string",
        "deploymentEnvironmentId": "string",
        "deploymentProfileId": "string",
        "gameDeploymentTemplateId": "string",
        "utilityDeploymentTemplateId": "8243136848298003197",
        "operationalStatus": 0
      }
    ]

    A custom description

    strategyType

    int

    Yes

    Deployment strategy 1: round robin

    minimumCapacity

    int

    Yes

    The minimum amount of game instances that should always be deployed for each region in this fleet. Can be overridden per region

    bufferValue

    int

    Yes

    Global buffer value, to be applied to individual deployment regions. Can be overriden per region

    bufferValueType

    int

    Yes

    Interpretation of the bufferValue property: 0: absolute value 1: percentage value (must be accompanied by bufferValueMin and bufferValueMax)

    bufferValueMin

    int

    No

    The minimum absolute buffer value when using a percentage, to prevent bufferValue from going to low

    bufferValueMax

    int

    No

    The maximum absolute buffer value when using a percentage, to prevent bufferValue from going to high

    markedForDeletion

    boolean

    Read-only

    When true, we will also make sure markedForDeletion will be set to true in all subsequent deployment regions. We will then only scale down in those regions until all game servers and VMs have been removed. When that situation is reached, we will set the deployment profile to inactive

    deploymentRegions

    [DeploymentRegion]

    Read-only

    All deployment regions of this profile

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    propertyKey

    string

    Yes

    No

    The name of the property

    propertyValue

    mixed

    Only for network port

    No

    The value of the property

    2

    password8

    string

    no

    An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    3

    password16

    string

    no

    A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    4

    password24

    string

    no

    A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    5

    public network port range

    a number between 2 and 200

    yes

    A number indicating the size of the desired port range.

    6

    private network port

    0 or a number between 30000 - 49151

    yes

    Indicates a default or random network port for your application to use.

    7

    private network port range

    a number between 2 and 200

    yes

    A number indicating the size of the desired private port range.

    LoginFailedOTPInvalidForm

    LoginFailedTooManyRequests

    LoginFailedUserNotFound

    LoginSuccessful

    LoginSuccessfulOTP

    LogoutSuccessful

    PasswordChangeFailedWrongPassword

    PasswordChangeSuccessful

    PasswordResetRequested

    PasswordResetRequestedUnknownUser

    AIMAllocated

    Application instance is allocated.

    AIMAllocatedArcus

    Application instance is allocated by Arcus.

    AIMOnline

    Application instance was allocated and is now online again after match conclusion.

    AIMOnlineArcus

    Application instance is put in online state by Arcus. An allocated match may have concluded.

    DependencyInstallerSuccess

    Dependency Installer is stopped.

    DependencyUninstallerSuccess

    Dependency Uninstaller is stopped.

    DependencyInstallerError

    Dependency Installer failed - retrying.

    DependencyUninstallerError

    Dependency Uninstaller failed - retrying.

    Downloading

    Application instance is downloading (progress).

    Downloaded

    Application instance is downloaded.

    DependencyDeploymentTemplate

    Forced Deployment Manually
    Rolling Deployment
    Rolling Deployment Manually
    AB Deployment
    AB Deployment Manually
    DeploymentRegion
    DeploymentContainer
    DeploymentContainerLocation
    Deployment Templates
    GameDeploymentTemplate
    UtilityDeploymentTemplate
    HostCapacityTemplate
    InstanceTypeCapacity
    DcLocation
    HostDisk
    HostMemory
    PatchJobOverallProgress
    PatchJobEmail
    Introduction
    Usage
    Configuration
    Packet-Structure
    Handling-Server-Query-Response
    Available-Opcodes
    Introduction
    Requests and Responses
    GameDeploymentTemplateBuild

    Name of the template

    inUse

    boolean

    Read-only

    Indicates whether this template is actively being used in a Fleet

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    utilityDeploymentTemplateBuild

    [UtilityDeploymentTemplateBuild]

    Yes

    List of UtilityDeploymentTemplateBuild elements, pointing to ApplicationBuilds

    The amount of hosts to deploy this utility on, on a per DC location basis. The value 0 means "install on all hosts". Defaults to 0 if omitted.

    Fleet
    ApplicationBuild

    i3dDcLocationIdsToBeRemoved

    [int]

    No

    i3D.net DC location IDs scheduled for removal from this region

    minimumCapacity

    int

    No

    The minimum amount of game instances that should always be deployed in this region. Leave null to use the global value set in DeploymentProfile.minimumCapacity

    maximumCapacity

    int

    No

    The maximum amount of game instances that can be deployed in this region. Leave null to use the global value set in DeploymentProfile.maximumCapacity

    bufferValue

    int

    No

    Override for deploymentRegion.bufferValue, to be applied only to this deployment region. Null value means that the bufferValue provided in the deploymentProfile will persist

    bufferValueType

    int

    No

    Override for deploymentRegion.bufferValueType. The bufferValue property must be interpreted as, 0: absolute value, 1: percentage value (must be accompanied by bufferValueMin and bufferValueMax). Null value means that the bufferValueType provided in the deploymentProfile will persist

    bufferValueMin

    int

    No

    Override for deploymentRegion.bufferValueMin. The minimum absolute buffer value when using a percentage, to prevent bufferValue from going to low. Null value means that the bufferValueMin provided in the deploymentProfile will persist

    bufferValueMax

    int

    No

    Override for deploymentRegion.bufferValueMax. The maximum absolute buffer value when using a percentage, to prevent bufferValue from going to high. Null value means that the bufferValueMax provided in the deploymentProfile will persist

    strategyType

    int

    No

    Override value for DeploymentProfile.strategyType - 0: use default, 1: round robin. Null value means that the strategyType provided in the deploymentProfile will persist

    markedForDeletion

    boolean

    Read-only

    If set to true, we will gracefully remove all game servers and VMs in this deployment region. Afterwards this deployment region will be set to inactive

    containers

    []

    No

    Container that holds an array of DeploymentContainer elements, defining primary and secondary groups of cloud DC locations

    inUse

    int

    Read-only

    0: Deployment region has no active application instances 1: Deployment region has active application instance(s)

    id

    string

    Read-only

    Unique identifier of this element

    name

    string

    Yes

    Name of the deployment region

    i3dDcLocationIds

    [int]

    Yes

    Full API reference
    POST /v3/deploymentProfile/{deploymentProfileId}/deploymentRegion

    All the i3D.net DC location IDs configured for this DeploymentRegion. You can get available IDs via

    Downsides
    • A maintenance window is required: results in a little downtime during which clients cannot play the game online. It does give your clients time to already update their client software

    • No way to test your newly deployed game server versions in production. As such, testing must be done beforehand!

    Patching Actions

    Our platform performs several actions during the patching process. These actions can be split into configuration changes and actual deployments.

    Configuration Changes

    When a Patch Job starts, the Forced Deployment method will perform the following configuration changes:

    1. Swap the old ID of the selected ApplicationBuild to the new ID, in either the game template or utility template

    2. Disable automatic scaling on the selected Fleet(s). This is needed to prevent dynamic downscaling of all your game servers during the patching process

    Instance Deployments

    The following actions are performed in-order, for each individual application instance:

    1. Download the new build

    2. Stop instance (hard or soft with a timeout)

    3. Remove the old build files while leaving behind any files newly generated by the instance

    4. Deploy the new build files into the same folder as the old build

    5. Start the instance

    5 minutes before the start time of a Patch Job, distribution of the new build towards all the hosts is begun, allowing for a shorter patching process itself.

    When the Patch Job starts, we must set the operational status of all impacted Fleets to "Manual" to prevent dynamic downscaling of all your game servers during the patching process. Currently the Fleet(s) are not automatically re-enabled when a Patch Job is finished and you must re-enable your Fleets' scaling modes, if you previously had them on automatic scaling. You can do this when most of your clients have re-joined.

    The Forced Deployment method requires a maintenance window because all instances will updated around the same time, with the option to drain instances allowing players to finish a match.

    Creating a Forced Deployment Patch Job via the UI

    Patch Job creation and maintenance is done via the Job Queue and Job History pages.

    Step 1: Create Patch Job Instance Selection

    On the Job Queue page you can see pending and running Patch Jobs. You can create a new one by clicking the button. This opens the following multi-step wizard:

    ![](images/UI-Create-PatchJob-Step1.png)Figure 1: Creating a new Patch Job - step 1

    • Deployment Environment: the process will only apply to instances in this environment

    • Application: the process will only apply to instances of this Application

    • Old Application Build: the process will only apply to instances running this Application Build - these builds must be of the Application type previously indicated

    • Fleet(s): the process will only apply to instances running in these Fleets running the aforementioned Application Build

    Step 2: Configure Patch Job

    The next screen asks you to provide runtime details for the Patch Job:

    ![](images/UI-Create-PatchJob-Step2.png)Figure 2: Creating a new Patch Job - step 2

    • Set Patch Job name

    • Set the new Application Build to deploy

    • Select patching method: Forced Deployment

    • Indicate whether to drain instances

      • If yes, with which timeout?

    • Set Patch Job start time

    • Add optional comment

    Step 3: Configure Reporting

    Finally you can add any email addresses that you would like us to send reporting emails towards:

    ![](images/UI-Create-PatchJob-Step3.png)Figure 3: Creating a new Patch Job - step 3

    • add any email addresses that must receive reporting emails

      • indicate per address which reports they should receive

    Creating a Forced Deployment Patch Job via the API

    The same idea applies for creating a Patch Job via the API, as they do when creating them via the UI. You must pass the ID of the Deployment Environment within which you want to perform the patch, then define the Application ID, old Application Build ID and the Fleet ID(s) to create a selection of running Application Instances to update.

    Full API reference

    HTTP request

    POST /v3/patchJob

    Request body

    Response body

    Upon successful submission of a new Patch Job, you can find it in your Patch Job overview: GET /v3/patchJob.

    Creating a Forced Deployment Patch Job manually

    You can perform all of the above manually if you wish, bypassing our automated systems. For more details on how to do this, please see the Forced Deployment - Manually chapter. Note that you will not receive any live-reporting emails then.

    Task Actions

    Tasks are made up of TaskAction elements, each describing a single command to be executed by a host agent. A Task consists of one or more TaskActions. Each TaskAction has a status field to inform you about the result of command execution.

    Task Action Examples

    Here are some examples of TaskAction types, to give you an idea:

    • Download a build archive (e.g. your game server build, or a sidecar build)

    • Extract a build archive

    • Stop an instance

    • Deploy a build [to an instance]

    • Start an instance

    These are the most frequently used actions and are also basic building blocks with which we can can deploy / update / control your instances. These actions also exactly describe an instance deployment task. So whenever any type of instance is deployed for you, we create a task containing the actions described above. These 6 actions are combined into 1 Task.

    Here is a more thorough example of the actions of an instance deployment Task. These also contain the parameters that each action requires in order to operate properly:

    Task Status (API example)

    When you create a Task, you will be given a Task ID. With this ID you can at any time check the status of the task. when doing that via the API you will get something like this:

    HTTP request

    GET /v3/applicationInstance/task/12278257

    Request body

    Response body

    Property
    Description

    id

    The Task ID

    batchId

    The TaskBatch ID, in case this Task was part of a larger batch

    categoryId

    Task category. Normally 2, meaning ApplicationInstance

    entityId

    The ID of the entity (application instance) this Task was performed on

    currentActionIdx

    Index of the TaskAction currently being executed. If the Task itself is yet to be performed, this will be -1

    executeAt

    If 0, the Task will be executed as soon as possible. Otherwise it contains the unix timestamp of when the Task has been or will be executed

    Table 1: Task element structure

    Task Result Codes

    A Task will reflect its status through the resultCode property. It will be one of the following values:

    • 0: Pending Task execution

    • 1: In progress

    • 2: Paused

    • 124: Cancelled

    • 125: Timed out

    • 126: Done, with error (the error can be found in the resultText field

    • 127: Done

    Task Batch

    When executing the same command for multiple application instances, we create a task per instance and collect them all within a TaskBatch. When a TaskBatch is submitted, you will be given a TaskBatch ID. This allows you to easily track the execution result of all tasks within a batch.

    HTTP request

    GET /v3/applicationInstance/taskBatch/9

    Request body

    Response body

    Property
    Value type
    Description

    id

    int

    A unique TaskBatch identifier

    createdAt

    int

    Unix timestamp of creation time

    executeAt

    int

    Unix timestamp of execution time

    finishedAt

    int

    Table 2: TaskBatch element structure

    Cancelling a Task

    You can cancel a (scheduled) Task by calling DELETE /v3/applicationInstance/task/{taskId}.

    The Task's result code will then be set to 124 (Cancelled).

    At this time, there is no roll-back mechanism for already performed actions.

    Pausing a Task

    You can pause a (running) task by calling PUT /v3/applicationInstance/task/{taskId}.

    To un-pause a paused Task, call the same endpoint.

    Note that when a Task is paused, no other Tasks for the same ApplicationInstance can be run, until the paused Task is un-paused and finished again.

    Overview of product packages

    What is GLAD?

    GLAD (Global Low-Latency anti-DDoS protection) is a collection of in-house tools that we offer at i3D.net that can prevent, detect, and thwart a strike. It's important to understand what a "strike" is, what strikes can do to disrupt services, and how our GLAD product can deter such attacks. For more information about how attacks work and how they can impact services, see the DDoS attack types overview.

    What is Warden?

    Warden is i3D.net's advanced protocol-aware DDoS protection system, operating as a standalone add-on to GLAD Advanced. Unlike traditional DDoS protection that relies on volumetric filtering, Warden provides intelligent traffic analysis at the packet level, making it ideal for gaming, real-time communication, and applications using custom protocols.

    Key Benefits of Warden:

    • Zero latency impact - Direct NIC-level processing bypasses OS overhead

    • Protocol-specific protection - Understands legitimate vs. malicious traffic patterns

    • Eliminates false positives - Prevents blocking of legitimate users during attacks

    • Real-time management - API-driven configuration with sub-second propagation

    GLAD features/tools

    Below is an explanation of our i3D.net's GLAD's tooling and how each functionality can help to thwart DDoS attacks.

    What's included in the Standard package

    1

    Default ACL (Access Control Lists) on VLAN

    Preset Access Control Lists ( ACL ) rules that protect against diverse attack types, such as DNS (Domain Name System) and/or UDP attacks. The rules are consistently updated and maintained throughout to ensure ongoing security.

    2

    Automatic detection and auto null route

    With automatic detection, it will discover incoming DDoS attacks. Once an attacker network is detected, this service blocks all traffic from it. Also, null routing silently discards (or "drops") malicious incoming traffic. The undesired traffic is directed to a route that goes nowhere, protecting the infrastructure. Null routing renders the target server inaccessible to anyone, including clean traffic.

    What's included in the Advanced package:

    Advanced also includes the features from the Standard package above.

    1

    Custom ACL (Access Control Lists) on VLAN

    With this feature, you can preset their own ACL rules to protect against most of attack types. For example, they can set the specific ports, protocols, IP addresses that need to be protected from attacks.

    2

    Rate limiting

    If a specific destination IP/port combination is not critical to the continued operation of the application running on the server, it can be set to receive a limited amount of traffic.

    • It limits total traffic for a destination to a configurable Mbps value, such as “all traffic to a certain destination port.”

    • If the rate limit is exceeded, the overflow traffic is discarded randomly, affecting both legitimate and illegitimate traffic.

    Understanding Rate Limits

    Rate limits control the number of requests that a server can receive within a specific timeframe. These limits help maintain service quality and prevent abuse. Once exceeded, further requests may be blocked or delayed until the limit resets.

    For example:

    • If you normally expect 10 Mbps traffic to a certain destination IP & destination port combination, you might decide to set a 20 Mbps rate limit.

    • But if you then receive a 90 Mbps attack, the 20 Mbps rate limit will drop exceeding 80 Mbps randomly meaning you’ll pass through approximately 4 Mbps of legitimate traffic and 16 Mbps of illegitimate traffic.

    • This means you effectively have 60% packet loss on your legitimate 10 Mbps of traffic when the rate limit is performing exactly as it was configured to do.

    Clients often rate limit ICMP traffic to ensure servers respond to pings during normal operation, but halt responses during ICMP-based DDoS attacks. Meanwhile, the application/protocol/port which runs on the server remains unaffected by this ICMP traffic rate limit.

    What's included in the Premium package:

    Premium also includes the features from the Advanced and Standard packages above.

    1

    Byte matching

    Byte matching is a technique that identifies and filters out malicious or undesirable traffic from incoming network packets based on specific byte patterns. Customers can tailor specified signatures. As a result, it blocks the bytes that are not supposed to enter the network by taking appropriate actions to safeguard the targeted infrastructure.

    2

    API access

    This feature allows you to tailor your own protection as needed by managing protection profiles and white/blacklists through the API.

    3

    Priority Support

    Dedicated technical support with faster response times and direct access to i3D.net's DDoS protection specialists.

    Warden Add-On:

    Warden is a part of the GLAD Premium package and provides enterprise-grade, protocol-aware DDoS protection.

    For unparalleled anti-DDoS protection, Warden is our custom software that filters traffic on a dynamic whitelist furnished by the customer. Its capabilities provide inline filtering, which allows you to achieve a higher level of specificity and detail when filtering their traffic stream.

    1

    Dynamic IP Whitelisting

    Real-time IP management with sub-second global propagation. API-driven whitelist, greylist, and blacklist operations supporting millions of daily changes.

    2

    Advanced Payload Fingerprinting

    Protocol-specific packet inspection with 32-bit payload analysis and configurable bit masks. Creates custom signatures for proprietary protocols and supports multiple client versions.

    3

    Zero-Latency Processing

    Direct NIC-level filtering that bypasses OS overhead, maintaining sub-millisecond processing times with fail-open reliability.

    4

    Protocol-Aware Intelligence

    Distinguishes legitimate traffic from attacks using application-specific patterns. Prevents false positives that block real users during DDoS events.

    Warden is designed to be flexible and adaptable. New features are continuously added whenever technically feasible, enabling you to benefit from the latest advancements in traffic filtering technology. In the event of server failures, Warden follows a fail-open system. If the redundant systems fail, instead of dropping traffic, Warden allows all traffic to pass through. This ensures that your network remains operational even in challenging situations.

    Warden also supports Active-Active setups, allowing horizontal scaling. This means we can expand the capacity of our filtering infrastructure by adding more instances of Warden, distributing the workload, and ensuring scalability.

    For more information on integrating Warden, please refer to Warden: Overview of how it works

    Product packages overview

    Below is an overview of our product packages, detailing the features included.

    Features
    Standard
    Advanced
    Premium

    Default ACL on VLAN

    X

    X

    X

    Automatic detection and auto null-route

    X

    X

    X

    Custom ACL on VLAN

    -

    X

    Getting Started

    • GLAD packages are available immediately upon service activation

    • Warden requires initial configuration consultation

    • GLAD API access for Warden is provided with comprehensive documentation at https://glad-api.i3d.net/

    For more information on integrating Warden, please refer to Warden: Overview of how it works

    Related topics

    • Attack types overview

    • DDoS category attack types

    • GLAD API reference: https://glad-api.i3d.net/

    What is GLAD?
    What is Warden?
    Explanation of the product and its features

    int

    The error code.

    errorMessage

    string

    Human readable version of the error.

    errors

    Array of ErrorDetail elements.

    Table 1: Error element structure

    ErrorDetails element structure

    The ErrorDetails (sub)element has the following structure:

    Property
    Value type
    Description

    property

    string

    Name of the form / element property that contains the error.

    message

    string

    Detailed error message.

    Table 2: ErrorDetails element structure

    Error element examples

    errorCode

    Fleet

    The Fleet is the second layer within the deployment configuration hierarchy. It's a direct descendant of the DeploymentEnvironment.

    Figure 1: Fleet's place in the Deployment Configuration

    Usage

    A Fleet is simply a sub-division of a DeploymentEnvironment. It does not represent a collection of hosts (bare metal or VM).

    You can have as many Fleets under a DeploymentEnvironment as you like. There are no limits to this. The only limit we have is that only one fleet at a time can be deployed on a host.

    Fleets are normally used to differentiate between different builds or platforms such as PC, Xbox, Playstation, Switch, etc. But it can also be used to deploy instances for temporary or testing purposes while keeping these separate from other fleets.

    Each Fleet has a number of template properties that will point to the following template types:

    • : defines which game build to deploy

    • : defines which utility build(s) to deploy

    • : defines which dependency (un-)installer to run for each Host

    • : defines how many application instances can be deployed onto a Host of a certain type

    Additionally you have to assign a , telling the Fleet in which regions and DC Locations to deploy.

    Automatic deployment and scaling can be controlled per Fleet and is determined by its .

    A Fleet's template properties can only be updated if there are no Application Instances deployed within that Fleet.

    Completing a Fleet's properties

    When you first create a new Fleet, you must provide a name and a deploymentEnvironmentId. All other properties / references can be left blank. This allows you to create a fleet before all other necessary elements have been created. Elements such as a and can be referenced at a later time. Note that a Fleet cannot be used before at least the DeploymentProfile and GameDeploymentTemplate properties have been populated.

    Please note if you delete a file or you update it on the CDN that is still in use in one or more of your fleets, your original file is not available anymore and will cause issues when you try to use in that fleet. You cannot have multiple versions from the same game running on the system. You must push a new file and use the PatchJob to patch your files.

    Operational status

    A Fleet's operational status determines whether automatic deployment and / or automatic scaling of s is enabled or not.

    Automatic deployment (operationalStatus = 1) will deploy ApplicationInstances according to the minimumCapacity setting of the DeploymentProfile linked to a Fleet. This will result in a statically deployed amount (DeploymentProfile.minimumCapacity) of ApplicationInstances. No dynamic up- or downscaling will occur.

    To enable dynamic up- or downscaling for a Fleet, you must set its operationalStatus value to 2 (automatic scaling enabled - implies automatic deployment).

    Setting operational status to disabled (operationalStatus = 0) means no deployment of any kind is performed. No up- or downscaling will be performed. If you have deployed applications in a Fleet, these will be left alone.

    An explanation of how dynamic and automatic scaling works can be found in the chapter.

    Operational status = 0 (manual)

    When isReserved is 0 you may deploy any Application Instance on the Host. As soon as the first Application Instance is deployed on the Host, the Host's fleetId is set to the Fleet that is attached to said Application Instance. From then on, the Host can only be used for Application Instances belonging to that Fleet.

    When isReserved is 1 this behaviour remains the same, but in addition when a Host is drained of Application Instances it will not be made available for another Fleet.

    When {:target=_blank} a Host for a Fleet which has Application Instances deployed you will need to manually remove these Application Instances in order for the Host to be eligible for deployment for Application Instances of another Fleet.

    Operational status = 1 (automatic deployment)

    The behaviour is the same as above. With automatic deployment however, you generally never reach the state where you organically drain Application Instances on a Host to cause it to reset its fleetId, since they will be automatically deployed again.

    Operational status = 2 (automatic scaling)

    A Host is assigned a fleetId when Application Instances are deployed on it. When isReserved is 0 the scaler will determine which Host is deployed for which Fleet. As soon as a Host drains of Application Instances, its fleetId will be reset to 0 and it may be used for any other Fleet that is eligible. When isReserved is 1 and automatic scaling is enabled the Host's fleetId will never be reset to 0 and the Host will always be available for said Fleet.

    When you {:target=_blank} a Host for a Fleet the Host will keep serving Application Instances until all Application Instances have been organically drained and eventually its fleetId is reset to 0. At that point the Host may be occupied by any other eligible Fleet (or the same Fleet if capacity is required again).

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: Fleet element structure

    API example

    Create a new Fleet within your i3D.net account.

    HTTP request

    Request body

    Response body

    The operationalStatus property is currently 0. This means automatic deployment is disabled. We will enable this in the next chapter, Starting Automatic Deployment after all configuration elements are in place.

    Reserving a Host for a Fleet

    Reserving a Host{:target=_blank} for a Fleet is the act of making sure that your Host may only ever deploy Application Instances that belong to that Fleet. Even if the Host is empty and could otherwise be used to deploy Application Instances for another Fleet it will remain empty until Application Instances are required for the reserved Fleet.

    The behaviour of the reserving of a Host is dependent on the Operational Status of the Fleet.

    Related topics

    Applicationproperty

    The ApplicationProperty is an element that adds meaning to the Application element. E.g. you can define that an application uses a certain network port, or requires a password or multiple ports, and a preset password, or have the system generate a unique password for each ApplicationInstance. These properties are necessary for the system to function properly.

    ApplicationProperties can only be set for the Application type Game.

    Element structure

    Property
    Value type
    Required
    Read-only
    Description

    Table 1: ApplicationProperty element structure

    propertyKey constraints

    The characters allowed for a propertyKey are : a-z, A-Z, 0-9, _ A property key must start with a lowercase character.

    The maximum length of a propertyKey is 50 characters.

    propertyValue constraints

    Any UTF-8 character is allowed in a propertyValue.

    The maximum length of a propertyValue is 150 characters.

    propertyType

    ApplicationProperty elements consist of a propertyType, a propertyKey and a propertyValue. The propertyType indicates the functionality of the property. The propertyKey gives the property a name and the value a value. Not all property types require a value. E.g. if you have a property of propertyType password16, you can leave propertyValue empty. This means we will generate a password, in this case with a length of 16 characters. If however you do enter a propertyValue, then we take that as the password and the system will not generate a new random password. You can find all available property types and usages in the next chapter.

    Available property types

    A propertyType is indicated by its numerical ID. The following types are available:

    ID
    Type
    Value type
    Value required?
    Description

    Table 2: Property types

    Public network port property explained

    When the platform deploys a new ApplicationInstance and you have added an ApplicationProperty of type public network port or private network port (or multiple), it will find a unique network port to use, per host. Which port is selected depends on the following logic:

    If you enter a value of 0 for the network port property, the platform will find a completely random port within the range of 10240 - 29999 (public range) or 30000 - 49151 (private range).

    If you enter a value between 10240 - 29999 (public) or 30000 - 49151 (private), the platform will take that value as the starting point to find a free port. If the given value is a free network port, then that will be used. If the port is already occupied by another instance, it is incremented and checked for availability again. This increment continues until a free network ports has been found for your application instance to use.

    We recommend always setting a network port value to 0 for random port generation. Only use specific values if you have a reason to do so.

    Public network ports can be accessed from the internet and as such must be used for connections of players to your game server.

    Public network port range property explained

    Just like with the single port property type, port ranges will be generated uniquely for each ApplicationInstance.

    In the property value, you indicate the size of the desired port range by entering a number between 2 - 200 (inclusive). Our platform will then generate a port range for each ApplicationInstance and make it available via . The port range notation of the variable at that point will be e.g.: 10500-10520.

    Private network port property explained

    All rules for also apply for private network ports. The only difference is that all ports generated for a private network port are not accessible from the internet and should only be used for internal services.

    Private network port range property explained

    All rules for also apply for private network port ranges. The only difference is that all ports generated for a private network port range are not accessible from the internet and should only be used for internal services.

    Property inheritance

    An Application's properties will be inherited by all elements belonging to said Application.

    Property value overrides

    An ApplicationProperty's value can be overridden at later stages, in the listed order:

    1. an ApplicationBuild will inherit an Application's properties. Its values can be overridden in the ApplicationBuild ()

    2. a DeploymentRegion can override a property on a per-region basis. This can be useful if you want to define different property values for each deployment region, allowing you to start your applications with region-based startup parameters ()

    As such, an override on DeploymentRegion level always wins. If no override for a DeploymentRegion is present, an override of the ApplicationBuild will win. If no override for an ApplicationBuild is present, the original property value defined for the Application will win.

    Property usage

    Every property you define will become available as platform variables that can be used in configuration related properties: ApplicationBuild.startupParameters and ApplicationBuildConfiguration.configContents. Please see the topic for more details.

    Restrictions

    You can assign any number of ApplicationProperties to an Application. There is no limitation there. The only rule is that you must have unique propertyKey names per Application.

    Relations

    See also:

    Related topics

    Available Opcodes

    We provide support for Arcusv2. Any previous versions of Arcus are no longer supported by Development.

    Initialization

    Opcode: 0x01

    Our Agent will connect to your Arcus port and send this initialization packet. You must reply with an Acknowledged packet when everything is ok. If something is wrong, e.g. an invalid password, you must close the connection.

    Schema:

    Body example:

    Acknowledged

    Opcode: 0x10

    Let the our Agent know that the packet has been received correctly.

    Unknown Opcode

    Opcode: 0x02

    The requested opcode is not implemented. Informs the caller that it does not support this opcode.

    Soft Stop

    Opcode: 0x30

    Send a request to stop itself when the round is over, or when the game server is empty, with a maximum timeout value defined in the body. It will force close after that timeout period.

    Schema:

    Body example:

    Allocated

    Opcode: 0x60

    Inform the application that it has been allocated by an external source, for example a matchmaking system.

    Meta Data

    Opcode: 0x40

    Receive new metadata directly.

    Schema:

    Body example:

    Server Information Request

    Opcode: 0x20

    Request server information from the game server. Mandatory values are:

    • current players

    • max players

    • server name

    • map

    Server Information Response Opcode: 0x21 Description: Response to the server information request packet that tells the current players, max players, server name, map, mode, version of that moment.

    Schema:

    Body example:

    Custom Command

    Opcode: 0x50

    For any use case where a specific function call needs to be called we can send this request packet to let the software know that he need to perform that custom command.

    opcode: this is just an identifier that you can use to identify what kind of custom command you receive and how to parse the data that has been provided. data: anything you want to pass through.

    Schema:

    Automatic Deployment

    Opposite the manual deployment process is the automatic deployment process whereby our platform takes care of deploying game servers and utilities (side cars) for you. This is done according to the Deployment Configuration you have setup for a Fleet.

    Prerequisites

    For automatic deployment to be possible, you must first create the following elements:

    • a Deployment Environment

    • a with:

      • at least a

      • optionally a

      • a with at least one

    Of course you must also have created at least and , otherwise you have nothing to deploy.

    Fleet operational status

    There are two modes of automatic deployment, which are defined by the of a :

    • Automatic deployment

    • Automatic scaling

    These two modes are explained in the following chapters:

    Automatic deployment

    In this mode, the amount of instances defined by will be (statically) deployed, per region. So if you want to deploy a certain, static amount of application instances, you can use this option.

    You can adjust the number of deployed instances at any time by changing the value. The system will then create or destroy the amount of instances necessary to match the new value. Note that minimumCapacity can be as well.

    For more information, refer to the chapter.

    Automatic scaling

    In this mode, at least the amount of instances defined by will be deployed, per region, as described in the previous paragraph. When additional capacity is required due to game servers becoming or occupied, more game servers will automatically be deployed, first on your bare metal servers, or when these have been saturated, on cloud VMs as defined in the s of each .

    The same is valid for downscaling. If there are too many (empty) instances, the platform will remove any unused instances (on a per region basis).

    For a full explanation on how automatic scaling works, please refer to the chapter.

    Minimum capacity deployments

    When you enable or on a Fleet, our scaling mechanism will start by deploying the number of Application Instances defined by the value. The number of deployed instances will never drop below this value, even if there are no players at all. The minimumCapacity value as such can be used in preparation for a new release, to ensure you have enough game servers to begin with upon release of your game. Coincidentally, minimumCapacity could also be used by you to manually scale game servers, by changing this value whenever you need more or less game servers.

    If the DeploymentProfile.minimumCapacity value exceeds your bare metal capacity, the scaler will continue to deploy in the cloud, provided cloud locations have been defined for the relevant regions.

    The DeploymentProfile.minimumCapacity value defines minimumCapacity for each individual region. You can this value per region in case you would like more instances deployed in a region where you expect more players. But keep in mind, minimumCapacity is mainly meant for the initial deployment of instances. Our scaling mechanism will of course start scaling instances if more players are needed [in a certain region].

    The bufferValue

    The bufferValue only applies to the automatic scaling mode of a Fleet.

    Besides the minimumCapacity setting, there is the bufferValue setting which determines the size of the pool of ApplicationInstances that must be available at all times. The purpose of this buffer is to catch sudden increases in the number of players and as such, to attempt (to ensure) there are always sufficient free game servers for your clients to join. In other words, the bufferValue is there to compensate for the time it takes to deploy game servers. The longer that takes (related to the size of your build files), the larger the buffer should be. The larger the buffer, the less risc there is of running out of available game servers. It is therefore important not to set this value too low.

    The bufferValue can be defined in and can be per region, just like the minimumCapacity from the previous paragraph.

    GameLift Anywhere integration

    Introduction

    This document describes the automation and integration between Amazon GameLift Anywhere and the i3D.net ONE Deployment Platform (ODP).

    In our article , you can find more background information on the integration between Amazon GameLift Anywhere and i3D.net.

    To get started with the integration, you can request a .

    Forced Deployment Manually

    The classical approach to updating game servers is to update them all at the same time, within a maintenance window.

    Instance selection

    When you you can select the instances to create the tasks for you in multiple ways.

    Normally this is quite easy, assuming you want to update all instances in a , or , or for example all instances currently running on a certain . In that case you can simply enter any of these IDs during task creation in the Task request body (see below) and deployment tasks for all instances in said element will be created.

    In other cases you may want to update really specific instances. If you do, you can first do a listing of the application instances you are interested in, by using any

    Matchmaker Allocation

    If you use a game with a matchmaker in its backend, it will want to figure out which game server to send players who are waiting to start a new match. Your matchmaker can request an unused game server with an API allocation call. This process is an application instance allocation which is the key to helping to host multiplayer games. I3d.net's service allows for a seamless experience when using an allocation request.

    What are the endpoint details?

    Here is an example with an API allocation call using the ApplicationInstance element:

    "/v3/applicationInstance/game/{applicationId}/empty/allocateWithErrors?filters=regionId=1 and fleetId=456".

    Env From Scratch

    In this example you will be shown how to create and configure a deployment environment for your game. It will have a basic setup with one general purpose Fleet meant to host game servers for a PC build or community. You can easily duplicate this Fleet for other platforms like PS4 or XBOne, or any other platform you want to target. Here is a simple diagram of such a setup:

    It is highly recommended to create multiple environments for e.g. Development, Test, Production, etc. For development, a deployment flow that automatically creates and destroys environments is very useful as well.

    The following elements will be created in this chapter:

    {
      "name": 0,
      "i3dDcLocationIds": [
        0
      ],
      "i3dDcLocationIdsToBeRemoved": [
        0
      ],
      "minimumCapacity": 0,
      "maximumCapacity": 0,
      "bufferValue": 0,
      "bufferValueType": 0,
      "bufferValueMin": 0,
      "bufferValueMax": 0,
      "strategyType": 0,
      "containers": [
        {
          "id": 0,
          "containerLocations": [
            {
              "id": 0,
              "cloudProviderId": 0,
              "dcLocationId": 0,
              "primaryInstanceTypeName": 0,
              "secondaryInstanceTypeName": 0,
              "cpuPlatform": 0
            }
          ]
        }
      ]
    }
    [
      {
        "id": 0,
        "name": 0,
        "i3dDcLocationIds": [
          0
        ],
        "i3dDcLocationIdsToBeRemoved": [
          0
        ],
        "minimumCapacity": 0,
        "maximumCapacity": 0,
        "bufferValue": 0,
        "bufferValueType": 0,
        "bufferValueMin": 0,
        "bufferValueMax": 0,
        "strategyType": 0,
        "markedForDeletion": 0,
        "containers": [
          {
            "id": 0,
            "markedForDeletion": 0,
            "containerLocations": [
              {
                "id": 0,
                "cloudProviderId": 0,
                "dcLocationId": 0,
                "primaryInstanceTypeName": 0,
                "secondaryInstanceTypeName": 0,
                "cpuPlatform": 0,
                "markedForDeletion": 0
              }
            ]
          }
        ]
      }
    ]
    {
        "deploymentEnvironmentId": "3142271489856081055",
        "applicationId": "1623002410560965042",
        "applicationBuild": [
            {
                "newApplicationBuildId": "5282598825997197979",
                "oldApplicationBuildId": "7890311781321404840"
            }
        ],
        "fleet": [
            {
                "fleetId":"2329870940606592031"
            }
        ],
        "patchJobName": "Patch to build B",
        "patchJobMethodId": 1,
        "stopMethodId": 9,
        "stopMethodTimeout": 900,
        "comments": "",
        "schedulerStartTime": 1593072000,
        "email": [
            {
                "email": "[email protected]",
                "progressReport": 1,
                "resultReport":1
            }
        ]
    }
    [
        {
            "id":"6732998643443795030",
            "deploymentEnvironmentId":"3142271489856081055",
            "applicationId":"1623002410560965042",
            "patchJobMethodId":1,
            "patchJobMethod":"Forced deployment",
            "patchJobName":"Patch to build B",
            "status":1,
            "stopMethodId":9,
            "stopMethodName":"Arcus",
            "stopMethodTimeout":900,
            "comments":"",
            "schedulerStartTime":1593072000,
            "patchJobStartTime":0,
            "patchJobOverallProgress":null,
            "applicationBuild":[
                {
                    "id":"2590904313587865362",
                    "oldApplicationBuildId":"7890311781321404840",
                    "newApplicationBuildId":"5282598825997197979"
                }
            ],
            "fleet":[
                {
                    "id":"8956749585727486343",
                    "fleetId":"2329870940606592031"
                }
            ],
            "email":[
                {
                    "id":"3804546952601287130",
                    "email":"[email protected]",
                    "progressReport":1,
                    "resultReport":1,
                    "createdAt":1592915978,
                    "changedAt":0
                }
            ],
            "createdAt":1592915978,
            "changedAt":0,
            "finishedAt":0,
            "isRevertable":1
        }
    ]
    [
        {
            "idx": 0,
            "actionType": "Download software build",
            "requiredParams": {
                "buildId": "The ID of the applicationBuild. Its build archive will be downloaded."
            }
        },
        {
            "idx": 1,
            "actionType": "Extract software build",
            "requiredParams": {
                "buildId": "The ID of the applicationBuild. This action will extract the build archive that has been downloaded."
            }
        },
        {
            "idx": 2,
            "actionType": "Stop instance",
            "requiredParams": {
                "methodId": "The ID of the stop-method, indicating how you want to stop the application instance.",
                "timeout": "If the stop-method is graceful, you can indicate a maximum time to wait here, before the application instance is forcefully terminated."
            }
        },
        {
            "idx": 3,
            "actionType": "Deploy software build to instance",
            "requiredParams": {
                "buildId": "The ID of the applicationBuild. This action expects the build archive to already have been downloaded and extracted onto the host."
            }
        },
        {
            "idx": 4,
            "actionType": "Start instance",
            "requiredParams": null
        }
    ]
    none
    [
        {
            "id": 12278257,
            "batchId": 0,
            "categoryId": 2,
            "entityId": 2897954287466354361,
            "currentActionIdx": 6,
            "executeAt": 1563469175,
            "lastActivityAt": 1563469176,
            "finishedAt": 1563469176,
            "resultCode": 127,
            "resultText": "Done"
        }
    ]
    none
    [
        {
            "id": 9,
            "createdAt": 1559829929,
            "executeAt": 1559829929,
            "finishedAt": 1559829934,
            "numTasks": 8,
            "numTasksOk": 8,
            "numTasksFailed": 0,
            "numTasksCancelled": 0,
            "taskIds": {
                "11238257": 127,
                "11238258": 127,
                "11238259": 127,
                "11238260": 127,
                "11238261": 127,
                "11238262": 127,
                "11238263": 127,
                "11238264": 127
            }
        }
    ]
    {
        "errorCode": 11001,
        "errorMessage": "Errors in form",
        "errors": [
            {
                "property": "propertyType",
                "message": "Invalid propertyType, the possible values are: 0: raw value, 1: network port, 2: password (8 chars), 3: password (16 chars), 4: password (24 chars)"
            }
        ]
    }
    {
        "errorCode": 11001,
        "errorMessage": "Errors in form",
        "errors": [
            {
                "property": "type",
                "message": "Invalid application type, the possible values are: 1: Game, 2: Utility"
            },
            {
                "property": "managementProtocol",
                "message": "Invalid managementProtocol, the possible values are: 0: None, 1: A2S, 2: ARCUS"
            }
        ]
    }

    lastActivityAt

    Unix timestamp of when the system received a sign of life for this Task

    finishedAt

    Unix timestamp of when this task finished processing

    resultCode

    The result of the Task in numerical form

    resultText

    The result of the Task in human readable form

    Unix timestamp of when the last Tasks was finished executing

    numTasks

    int

    Total number of Tasks in this TaskBatch

    numTasksOk

    int

    Number of successfully executed Tasks

    numTasksFailed

    int

    Number of failed Tasks

    numTasksCancelled

    int

    Number of cancelled Tasks

    taskIds

    [int]

    Array of key-value pairs indicating Task ID vs Task Result Code

    Its usefulness is therefore very limited for the actual application you’re trying to protect;
    hard discard or accept methods are often more appropriate
    .

    X

    Rate limiting

    -

    X

    X

    Byte matching

    -

    -

    X

    API Access

    -

    -

    X

    Priority Support

    -

    -

    X

    Dynamic IP Whitelisting (Warden)

    -

    -

    X

    Advanced Payload Fingerprinting (Warden)

    -

    -

    X

    Protocol-Aware Intelligence (Warden)

    -

    -

    X

    Zero-Latency Processing (Warden)

    -

    -

    X

    Fleet
    GameDeploymentTemplate
    UtilityDeploymentTemplate
    DeploymentProfile
    DeploymentRegion
    one Application element
    one ApplicationBuild element
    operational status
    Fleet
    DeploymentProfile.minimumCapacity
    DeploymentProfile.minimumCapacity
    overridden per region
    Minimum capacity deployments
    DeploymentProfile.minimumCapacity
    allocated
    DeploymentContainerLocation
    DeploymentRegion
    Automatic Scaling
    automatic deployment
    automatic scaling
    DeploymentProfile.minimumCapacity
    override
    DeploymentProfile.bufferValue
    overriden
    GET /cloud/dcLocation
    DeploymentContainer
    [ErrorDetails]
    mode
  • version.

  • DeploymentEnvironment

  • Fleet

  • GameDeploymentTemplate

  • UtilityDeploymentTemplate (optional)

  • DeploymentProfile

  • DeploymentRegion

  • Deployment Environment

    The DeploymentEnviroment element encapsulates all the deployment related configuration elements for your game / application. The element itself is easy to create; you only need to supply a name:

    Full API reference

    HTTP request

    POST /v3/deploymentEnvironment

    Request body

    Response body

    Fleet

    This example Fleet represents deployments for a PC platform or community.

    Amongst a Fleet's properties is deploymentEnvironmentId. We take this value from the response of previous request, assigning the Fleet to the DeploymentEnvironment we've just created. Other properties like deploymentProfileId, gameDeploymentTemplateId and utilityDeploymentTemplateId can be left empty for now. We will be creating these elements next and add them to the Fleet afterwards.

    Full API reference

    HTTP request

    POST /v3/fleet

    Request body

    Response body

    The operationalStatus property in the response is 0. This means automatic deployment is disabled. We will enable this in the next chapter, Starting Automatic Deployment after all configuration elements are in place.

    Game Deployment Template

    The GameDeploymentTemplate element defines which game ApplicationBuild you want to deploy.

    Full API reference

    HTTP request

    POST /v3/deploymentTemplate/game

    Request body

    Response body

    Utility Deployment Template (optional)

    The UtilityDeploymentTemplate describes any utilities (sidecars) you want to deploy onto each host that we deploy game instances onto.

    You can indicate whether these should be installed on BM, VM or both and how many per DC location.

    Full API reference

    HTTP request

    POST /v3/deploymentTemplate/game

    Request body

    Response body

    Deployment Profile

    Next, we create a DeploymentProfile. You create one per Fleet and as such has a 1:1 relation with a Fleet.

    This element describes how to deploy your applications. You must set the deployment strategy, minimum deployment figures and the buffer value defining the pool of warm game servers that are ready to be allocated. These are global values that apply per DeploymentRegion and can be overridden on a per-DeploymentRegion basis.

    A DeploymentProfile contains the DeploymentRegions that define where to deploy your applications. These are added to the DeploymentProfile afterwards.

    Full API reference

    HTTP request

    POST /v3/deploymentProfile

    Request body

    Response body

    Deployment Region

    Next add a DeploymentRegion to the profile we have just created. This tells the platform in which data center(s) you want to deploy your game. Each DeploymentRegion is based on an i3D.net bare metal location (PoP) to which cloud datacenters can be added for the purpose of bursting onto when running out of bare metal capacity.

    You can optionally override global DeploymentProfile parameters such as deployment strategy, minimumCapacity and buffer value if desired.

    You can repeat this step for all the DeploymentRegions you want to create in your profile.

    Full API reference

    HTTP request

    POST /v3/deploymentProfile/88465290039742335/deploymentRegion

    Request body

    Response body

    Finalize the Fleet

    Finally we can assign the previously created DeploymentTemplates and DeploymentProfile to the PC Fleet from earlier.

    Full API reference

    HTTP request

    PUT /v3/fleet/7420099900751948711

    Request body

    Response body

    Everything you need to start your first deployment is in place!

    {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "initialization",
      "type": "object",
      "title": "Initialization payload Schema",
      "required": [
        "password"
      ],
      "properties": {
        "password": {
          "$id": "#/properties/password",
          "type": "string",
          "title": "Management password",
          "default": "",
          "examples": [
            ""
          ],
          "pattern": "^(.*)$"
        }
      }
    }
    {
      "password": "9e74txt7o6"
    }
    {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "http://example.com/root.json",
      "type": "object",
      "title": "The Root Schema",
      "required": [
        "timeout"
      ],
      "properties": {
        "timeout": {
          "$id": "#/properties/timeout",
          "type": "integer",
          "title": "The Timeout Schema",
          "default": 0,
          "examples": [
            1600
          ]
        }
      }
    }
    {
        "timeout": 100
    }
    {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "metadata",
      "type": "object",
      "title": "Metadata Schema",
      "required": [
        "data"
      ],
      "properties": {
        "data": {
          "$id": "#/properties/data",
          "type": "array",
          "title": "Metadata Schema",
          "items": {
            "$id": "#/properties/data/items",
            "type": "string",
            "title": "The Items Schema",
            "default": "",
            "examples": [
              "key",
              "value"
            ],
            "pattern": "^(.*)$"
          }
        }
      }
    }
    {
      "data": [
        {
          "key": "map",
          "value": "tokyo_large"
        },
        {
          "key": "maxPlayers",
          "value": "16"
        }
      ]
    }
    {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "http://example.com/root.json",
      "type": "object",
      "title": "The Root Schema",
      "required": [
        "players",
        "maxPlayers",
        "name",
        "map",
        "mode",
        "version"
      ],
      "properties": {
        "players": {
          "$id": "#/properties/players",
          "type": "integer",
          "title": "The Players Schema",
          "default": 0,
          "examples": [
            0
          ]
        },
        "maxPlayers": {
          "$id": "#/properties/maxPlayers",
          "type": "integer",
          "title": "The Maxplayers Schema",
          "default": 0,
          "examples": [
            16
          ]
        },
        "name": {
          "$id": "#/properties/name",
          "type": "string",
          "title": "The Name Schema",
          "default": "",
          "examples": [
            "My awesome Game Server"
          ],
          "pattern": "^(.*)$"
        },
        "map": {
          "$id": "#/properties/map",
          "type": "string",
          "title": "The Map Schema",
          "default": "",
          "examples": [
            "islands"
          ],
          "pattern": "^(.*)$"
        },
        "mode": {
          "$id": "#/properties/mode",
          "type": "string",
          "title": "The Mode Schema",
          "default": "",
          "examples": [
            "DEATHMATCH"
          ],
          "pattern": "^(.*)$"
        },
        "version": {
          "$id": "#/properties/version",
          "type": "string",
          "title": "The Version Schema",
          "default": "",
          "examples": [
            "1.0.0.1"
          ],
          "pattern": "^(.*)$"
        }
      }
    }
    {
      "players": 5,
      "maxPlayers": 16,
      "name": "My awesome Game Server",
      "map": "islands",
      "mode": "DEATHMATCH",
      "version", "1.0.0.1"
    }
    {
      "definitions": {},
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "http://example.com/root.json",
      "type": "object",
      "title": "The Root Schema",
      "required": [
        "opcode",
        "data"
      ],
      "properties": {
        "opcode": {
          "$id": "#/properties/code",
          "type": "integer",
          "title": "The OpCode Schema",
          "default": 0,
          "examples": [
            0
          ]
        },
        "data": {
          "$id": "#/properties/data",
          "type": "object",
          "title": "The Data Schema"
        }
      }
    }
    {
      "name": "Bluewolf"
    }
    [
      {
        "id": "173892217340309897",
        "name": "Bluewolf",
        "createdAt": 1568312996
      }
    ]
    {
      "name": "Bluewolf PC",
      "deploymentEnvironmentId": "173892217340309897",
      "deploymentProfileId": "",
      "gameDeploymentTemplateId": "",
      "utilityDeploymentTemplateId": ""
    }
    [
      {
        "id": "7420099900751948711",
        "name": "Bluewolf PC",
        "deploymentEnvironmentId": "173892217340309897",
        "deploymentProfileId": "",
        "gameDeploymentTemplateId": "",
        "utilityDeploymentTemplateId": "",
        "operationalStatus": 0
      }
    ]
    {
      "name": "Bluewolf-server PC Game Deployment Template",
      "gameDeploymentTemplateBuild": [
        {
          "applicationBuildId": "2324653987059528218"
        }
      ]
    }
    [
      {
        "id": "4748702875218694016",
        "fleetIds": [],
        "name": "Bluewolf-server PC Game Deployment Template",
        "inUse": 0,
        "createdAt": 1568371305,
        "gameDeploymentTemplateBuild": [
          {
            "applicationBuildId": "2324653987059528218"
          }
        ]
      }
    ]
    {
      "name": "Bluewolf-server PC Utility Deployment Template",
      "utilityDeploymentTemplateBuild": [
        {
          "applicationBuildId": "3801243597300703061",
          "deployOn": 3,
          "installsPerLocation": 0
        }
      ]
    }
    [
      {
        "id": "6793353982360875057",
        "fleetIds": [],
        "name": "Bluewolf-server PC Utility Deployment Template",
        "inUse": 0,
        "createdAt": 1568371472,
        "utilityDeploymentTemplateBuild": [
          {
            "applicationBuildId": "3801243597300703061",
            "deployOn": 3,
            "installsPerLocation": 0
          }
        ]
      }
    ]
    {
      "name": "Bluewolf-server PC Deployment Profile",
      "description": "PC Fleet Deployment Profile",
      "strategyType": 1,
      "minimumCapacity": 0,
      "maximumCapacity": 0,
      "bufferValue": 0,
      "bufferValueType": 0,
      "bufferValueMin": 0,
      "bufferValueMax": 0
    }
    [
      {
        "id": "88465290039742335",
        "fleetIds": [],
        "name": "Bluewolf-server PC Deployment Profile",
        "description": "PC Fleet Deployment Profile",
        "strategyType": 1,
        "minimumCapacity": 0,
        "maximumCapacity": 0,
        "bufferValue": 0,
        "bufferValueType": 0,
        "bufferValueMin": 0,
        "bufferValueMax": 0,
        "markedForDeletion": 0,
        "inUse": 0,
        "deploymentRegions": [],
        "createdAt": 1568376027
      }
    ]
    {
      "name": "EU: Rotterdam",
      "i3dDcLocationIds": [
        6
      ],
      "containers": [
        {
          "containerLocations": [
            {
              "cloudProviderId": 31,
              "dcLocationId": 63,
              "primaryInstanceTypeName": "n1-highcpu-64",
              "secondaryInstanceTypeName": "n1-highcpu-32",
              "cpuPlatform": "Intel Broadwell"
            }
          ]
        }
      ]
    }
    [
      {
        "id": "2468882381297501628",
        "name": "EU: Rotterdam",
        "i3dDcLocationIds": [
          6
        ],
        "i3dDcLocationIdsToBeRemoved": [],
        "minimumCapacity": null,
        "maximumCapacity": null,
        "bufferValue": null,
        "bufferValueType": null,
        "bufferValueMin": null,
        "bufferValueMax": null,
        "strategyType": null,
        "markedForDeletion": 0,
        "containers": [
          {
            "id": "345414563890737521",
            "markedForDeletion": 0,
            "containerLocations": [
              {
                "id": "403382638377965874",
                "cloudProviderId": 31,
                "dcLocationId": 63,
                "primaryInstanceTypeName": "n1-highcpu-64",
                "secondaryInstanceTypeName": "n1-highcpu-32",
                "cpuPlatform": "Intel Broadwell",
                "markedForDeletion": 0
              }
            ]
          }
        ],
        "inUse": 0
      }
    ]
    {
      "deploymentProfileId": "88465290039742335",
      "gameDeploymentTemplateId": "4748702875218694016",
      "utilityDeploymentTemplateId": "6793353982360875057"
    }
    [
      {
        "id": "7420099900751948711",
        "name": "Bluewolf PC",
        "deploymentEnvironmentId": "173892217340309897",
        "deploymentProfileId": "88465290039742335",
        "gameDeploymentTemplateId": "4748702875218694016",
        "utilityDeploymentTemplateId": "6793353982360875057",
        "operationalStatus": 0
      }
    ]

    deploymentProfileId

    string

    No

    Identifier of the for this Fleet.

    gameDeploymentTemplateId

    string

    No

    Identifier of the for this Fleet.

    utilityDeploymentTemplateId

    string

    No

    Identifier of the for this Fleet.

    dependencyDeploymentTemplateId

    string

    No

    Identifier of the for this Fleet.

    hostCapacityTemplateId

    string

    No

    Identifier of the for this Fleet.

    operationalStatus

    int

    Yes

    Indicator of how this Fleet is operating with regards to automatic deployment and scaling: 0: Disabled 1: Automatic deployment enabled 2: Automatic scaling enabled (implies automatic deployment)

    id

    string

    Read-only

    Unique identifier of this element

    name

    string

    Yes

    Name of the deployment environment

    deploymentEnvironmentId

    string

    Yes

    Game Template
    Utility Template
    Dependency Template
    Host Capacity Template
    DeploymentProfile
    operational status
    DeploymentProfile
    GameDeploymentTemplate
    ApplicationInstance
    Automatic Deployment
    un-reserving
    un-reserve
    Full API reference
    POST /v3/fleet
    Orchestrator Overview
    Game Deployment Quick Start Guide
    i3d.net API documentation

    Identifier of the this Fleet belongs to.

    No

    The value of the property

    password8

    string

    no

    An 8 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    3

    password16

    string

    no

    A 16 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    4

    password24

    string

    no

    A 24 character password. If no value provided, we generate a unique password for every ApplicationInstance.

    5

    public network port range

    a number between 2 and 200

    yes

    A number indicating the size of the desired public port range.

    6

    private network port

    0 or a number between 30000 - 49151

    yes

    Indicates a default or random network port for your application to use. Please see the for more information.

    7

    private network port range

    a number between 2 and 200

    yes

    A number indicating the size of the desired private port range.

    propertyId

    string

    N/A

    Yes

    Unique identifier of the element

    propertyType

    int

    Yes

    No

    Type ID of the property

    propertyKey

    string

    Yes

    No

    The name of the property

    propertyValue

    mixed

    0

    raw value

    mixed

    yes

    A custom raw value. This property's key and value will be passed to ApplicationBuilds, ApplicationInstances and labels as-is.

    1

    public network port

    0 or a number between 10240 - 29999 (inclusive)

    yes

    Indicates a default or random network port for your application to use. Please see the paragraph below for more information.

    platform variables
    public network ports
    public network port ranges
    ApplicationBuild
    API documentation
    API documentation
    platform variables
    Application element relations
    Orchestrator Overview
    Game Deployment Quick Start Guide
    i3d.net API documentation

    Only for network port

    2

    This integration is currently in Beta phase and will be subject to changes and quality of life improvements in the upcoming months.

    Setup part 1 - Connect your Amazon GameLift account to i3D.net One Deployment Platform (ODP)

    To get started with the Amazon GameLift Anywhere integration, the following setup needs to be available for a customer. There are several prerequisites to run the i3D.net One Deployment Platform (ODP) together with Amazon GameLift Anywhere.

    Step 1 - Prerequisites

    1.1 i3D.net Prerequisites

    1. i3D.net account with ODP enabled

    2. i3D.net account with CDN enabled (for the upload game servers)

    1.2 Amazon GameLift Anywhere Prerequisites

    To use the integration, you need to have an Amazon account with GameLift Anywhere enabled. This account needs to have the following permissions set:

    To use the system the client needs to register in the i3D.net system the following:

    1. AccessKeyId

    2. SecretAccessKey

    3. defaultRegion for deployment (all fleets created by ODP will be created in this region)

    Step 2 – Create your Amazon GameLift Anywhere cloud account within the i3D.net ODP

    Go to one.i3d.net to create your GameLift Anywhere cloud account within the i3D.net One Deployment Platform (ODP). Navigate to the Game Hosting page. On the Game Hosting page, you will find the GameLift Accounts page.

    URL: https://one.i3d.net/Game-Hosting/GameLift-Accounts

    In the overview below click on the “New account” button at the top right. See figure 2-1.

    GameLift Accounts page

    Figure 2-1: GameLift Accounts page

    In the overview below you need to fill out the requested information. The default region is where your new GameLift Anywhere i3D.net bare metal fleets will live. Click the checkbox “Activate Game Lift Anywhere” and activate the account.

    Add GameLift Anywhere Account

    Figure 2-2: Add GameLift Anywhere Account

    Be aware that that you can only create 10 fleets by default in Game Lift Anywhere and 20 custom regions. You can only have one GameLift Anywhere account in the system at this moment.

    Step 3 - Create an application

    For the integration with Amazon GameLift Anywhere you need to setup everything within the i3D.net One Deployment Platform (ODP). To make it easier to follow we will use the frontend for the setup in this part of the documentation.

    Before you start, make sure you have uploaded your game server to the i3D.net CDN.

    See Application build provisioning, build distribution via CDN.

    3.1 Create an Amazon GameLift Anywhere application

    Navigate to Application Management within the i3D.net ODP.

    URL: https://one.i3d.net/Game-Hosting/Application-Management/Applications

    In step 1 in the overview below you will fill out the form with the name of your application and all additional information that you want to add. In step 2 (see figure 3-1) you need to set the Application Type to Game and select the checkbox “Game Lift Anywhere”. When you clicked the checkbox, it will automatically generate and add specific GameLift Anywhere properties in step 3 (figure 3-2).

    create application

    Figure 3-1: Create GameLift Anywhere application

    Do not remove or change these specific GameLift Anywhere properties as they are important properties within the integration between i3D.net ODP and Amazon GameLift Anywhere. You need to fill these specific GameLift Anywhere properties in the start parameters in the application build. See in the next step (step 4) more details on the Application Build. See figure 3-2 for a view of the specific GameLift Anywhere properties. You are allowed to add your own properties if needed.

    Choose "Linux" as the "Operating System Group"

    create application

    Figure 3-2: GameLift Anywhere application properties

    Step 4 - Application build

    The application build is the actual game server that will be deployed on the server. In the start parameters of the application build, you need to add the values which are specified inside of the application setup. The properties will automatically be copied over when you create the build.

    4.1 Start parameters

    Based on our test application, you can set the properties in the start parameters as follows:

    Figure 4-1: start parameters

    application build setup

    Figure 4-2: application build setup

    4.2 Update or upload a new application build

    In the current beta implementation, if you want to use a different build or a new version of your build, you must follow these steps:

    1. Scale down your fleet.

    2. Manually upload the new build.

    3. Link it to the correct application and application template.

    4. Scale up your fleet.

    The patching method is not supported in the current implementation. For more information about when this feature is available, please contact us.

    Step 5 – Create Game template

    After creating your application build, you need to create a game template following our regular process. See more details here:

    URL: https://one.i3d.net/Game-Hosting/Template-Management/Game/

    Create a game template in the below overview:

    create game template

    Figure 5-1: Game template overview

    In the view below you create the game template and you need to select your game build in the drop-down menu:

    create game template

    Figure Figure 5-2: Create game template

    Setup part 2 – Your Deployment

    In this section we explain how you can deploy your game servers on i3D.net Bare Metal servers.

    Step 1 - Deployment environment

    You need to create a deployment environment according to the standard process.

    URL: https://one.i3d.net/Game-Hosting/Deployment-Management/Environments/

    Create a deployment environment in the below overview.

    Deployment environment overview

    Figure 1-1: Deployment environment overview

    Click on the create environment button and create your deployment environment.

    Create deployment environment

    Figure 1-2: Create deployment environment

    Step 2 - Deployment Profile

    Once the deployment environment is ready, create a deployment profile.

    URL: https://one.i3d.net/Game-Hosting/Deployment-Management/Profiles/

    deployment profile

    Figure 2-1: deployment profile

    When you created the deployment profile, click on the gear button next to the just created deployment profile, to create your region. Click on the Create region button in the overview below.

    It is very important to use a region name that does not already exist in Amazon GameLift Anywhere. The region name will automatically be transformed in an Amazon GameLift Anywhere region by the system.

    Create region within the deployment profile

    Figure 2-2: Create region within the deployment profile

    In the overview below please choose the Region in which you received the i3D.net Bare Metal servers and click next.

    When selecting a location, ensure it is the location where you have your test Bare Metal Servers you received from i3D.net. All regions need to be setup before you add the fleet.

    Select region

    Figure 2-3: Select region

    You cannot add any cloud providers to the regions.

    Step 3 - Fleet

    In this last step you need to create a fleet to finalize your deployment. The fleet name must be unique and cannot exist inside of your Amazon GameLift account. The fleet will automatically be generated inside of Amazon GameLift Anywhere.

    To make a fleet a specific GameLift Anywhere fleet you need to check the checkbox Game Lift Anywhere on the fleet create page. When you have created a GameLift Anywhere fleet you cannot change it back to a normal fleet after saving. See figure 3-1.

    Create fleet

    Figure 3-1 Create fleet

    Now click on the orange tool-icon and choose Fully Automatic deployment on the right side and proceed.

    Deployment Mode

    Figure 3-2 Deployment Mode

    Summary

    1. Select deployment environment that you have created

    2. Create a new fleet

      1. Region name cannot exist inside of GameLift Anywhere and must be unique

      2. Region name will be automatically created in GameLift Anywhere as custom region

    3. Add to the fleet the game deployment template

    4. Add the deployment profile to the fleet

    5. Check the checkbox for Game Lift Anywhere

    6. Save the fleet

    7. Make sure that your credentials are setup on the API, so that i3D.net can connect with GameLift Anywhere

    8. After you are satisfied with your setup you need to activate the automatic process that will create the fleet in GameLift Anywhere

    9. Change the deployment Mode from manual to automatic deployment

    10. After you made this change automatically the fleet will be created in GameLift Anywhere

    Remarks

    In this Beta we did not provide the following:

    1. After the fleet is created it is as it is:

      1. Update or delete the fleet

      2. Add new regions to the fleet

    Start the Deployment

    The process of deploying a game server on the Bare Metal Servers is very straightforward. You need to change the minimum amount of game servers on the deployment profile to the amount of game servers that you want to deploy.

    When everything is configured correctly the game servers will be deployed through the Host Agent. The game servers will be started and enriched with the Amazon GameLift Anywhere properties that you have set on the application build.

    Please note that we do not install the GameLift Agent but the i3D.net host agent on the game server. This means the GameLift SDK must be installed in the regular way.

    Hybrid game server hosting for multiplayer games with Amazon GameLift Anywhere
    free test server
    GET
    endpoint listed in the
    of the API documentation, using any selection method you wish. You can then compile your list of application instance IDs, to be used in the deployment task that we'll be creating next.

    Below is a task request body illustrating the options for instance selection:

    The properties relevant for instance selection are:

    • applicationInstanceIds - supply an array of literal applicationInstance Ids

    • fleetId - supply a fleet Id to select all the application instances in it

    • regionId - supply a region Id to select all the application instances in it

    • labels - supply additional application instance labels for more precise selections:

      • application_id

      • host_id

      • dc_location_id

      • application_build_id

      • any custom label created by you

    You are not limited to using one filter property at a time; you can combine properties to create the final selection of instances.

    API example

    Below we will illustrate creating forced update tasks via the API.

    Step 1: find the appropriate Task Template ID

    Creating tasks is done by means of providing a Task Template for the task you want performed. A Task Template is a description of a certain task whereby a task contains one or more actions. An action can be a deployment, preload, start / stop instance, etc.

    HTTP request

    GET /applicationInstance/task/template

    Response body

    The template that we are interested in is displayed - the others have been snipped.

    This template with ID 2 is the deployment template. You can see the 5 actions it contains: download, extract, stop instance, deploy instance and start instance. Each of these actions has a requiredParams parameter detailing what information the action needs in order to be performed successfully. If the requiredParams value is null, the action does not require any parameters. These parameters must be provided in the taskActionParam parameter of the HTTP request to create the task later on.

    • buildId refers to the applicationBuild ID you want to deploy. Note that you see this parameter in three actions. You only need to provide it once later on in the HTTP request body.

    • methodId refers to the stop method to perform. The default value of 1 stands for "kill the process immediately". Other methods depend on whether your game supports graceful stop methods, allowing a game to finish before we take down the instance. [make a note here of how to obtain the methodIds].

    • timeout refers to the maximum length of the grace period the stop action will adhere to. If an instance has not stopped after <timeout> seconds, it will be forcefully shut down.

    These are all the parameters needed to use a deployment task template.

    Step 2: create the deployment tasks

    Now you can create the actual Tasks for the application instances you want to update. You do not have to create a Task for each ApplicationInstance individually; the following endpoint will create deployment Tasks for all the given application instances with one API call. They will all become part of a TaskBatch, an object that encapsulates and tracks the progress of all individual Tasks.

    HTTP request

    POST /applicationInstance/task

    Request body

    Here we request a deployment task to be created for:

    • two individual application instances

    • plus, all active application instances in the fleet with ID 1382702706111300109

    Because executeAt is 0, the tasks will be performed immediately. If you want to schedule tasks for future execution, enter a unix timestamp here.

    The taskActionParam field states:

    • deploy the ApplicationBuild with ID 3772131712593619554

    • stop all instances immediately (methodId = 1)

    • the timeout is 0, because the stop method is "immediately" and as such a timeout does not apply

    Response body

    The response contains a TaskBatch object, showing you a global status of all individual Tasks.

    Property
    Value type
    Description

    id

    int

    A unique TaskBatch identifier

    createdAt

    int

    Unix timestamp of creation time

    executeAt

    int

    Unix timestamp of execution time

    finishedAt

    int

    Table 1: TaskBatch element structure

    create a task through the API
    Fleet
    DeploymentRegion
    DcLocation
    ApplicationBuild
    ApplicationInstance section

    applicationId is the ID of the application.

  • Using allocateWithErrors will allow you (if the call comes back where you cannot allocate) to help you with error handling.

  • Using the regionId and fleetId filters will ensure that you are directed to the correct servers.

  • What are the prerequisites to enable a new allocation flow?

    You must create a firewall rule to allow traffic into the following port:

    Port
    Protocol
    Description

    6824

    TCP

    ODP uses HTTP to call into the Host Agent v2 to determine the current status of the application instance.

    How does the application instance allocation connection work?

    Here is a visual example:

    On the visual above, you see that when you send an application instance allocation, that our platform will always prioritize allocations on Bare Metal before allocating game servers on a Virtual Machine (VM), unless you perform an allocation request with an explicit filter to allocate a games server on a VM.

    How to perform an application instance allocation

    1. Request an unused game server using an API allocation call. (Example with filters used: "/v3/applicationInstance/game/{applicationId}/empty/allocateWithErrors?filters=regionId=1 and fleetId=456") For more information, see the ApplicationInstance reference documentation.

    2. The server will find Bare Metal (BM) application instances to use. The server will check for application instances with Status 4.

    3. If there are no BM application instances to use, then the server will select a VM application instance. If there are no application instances available, you will receive a return error message stating the same. See the next section for more information about error messages and how to handle them.

    4. Once an application instance is found, the server converts the Status from 4 (Online) to 6 (Allocating).

    5. The hostagent API is called for allocation. Then the hostagent API responds back with a Status from 6 (Allocating) to 5 (Allocated).

    6. Lastly, the customer/match maker receives a response back with the correct application instance.

    Filtering on the following parameters is currently not supported:

    autoRestart

    liveGameVersion

    liveHostName

    liveMap

    liveRules

    manuallyDeployed

    markedForDeletion

    numPlayers

    numPlayersMax

    properties

    ipAddress

    labelReadOnly

    labelPublic

    metadata

    pid

    pidChangedAt

    What are the allocation status codes?

    For your reference, here is a listing of the Status codes and descriptions:

    Status code

    Status name

    Description

    0

    inactive

    The instance is no longer in use

    1

    setup

    The instance is being setup / deployed for the first time

    2

    offline

    The instance is deployed but not running

    3

    starting

    The instance is currently starting up (optional)

    Using matchmaking with metadata

    Our platform also has a mechanism in place that allows your backend to send custom data (metadata) to game servers in the form of key / value pairs. This mechanism has primarily been created to reconfigure game servers during allocation, based on what kind of map it should run. However, you can use metadata in any way you see fit.

    Your matchmaker can collect game clients and then allocate (request and reserve) a game server by doing an allocation call towards the i3D.net API. During the allocation call, the matchmaker sends metadata along which will be stored for the allocated game servers. This same metadata can then be forwarded to the same game servers, which in turn can react to the metadata. For example, it can load another map or change the game mode.

    What are the requirements for metadata usage?

    In order for the platform to send metadata to your game servers, you must implement the Arcus protocol. This is currently the only game server management protocol that has a mechanism for receiving metadata.

    If your game already supports a way to receive custom information similar to the metadata described here, and you would like our platform to be compatible with that, please contact us and we may be able to support your management protocol.

    Host Agent error reference list

    Code

    Message

    Description

    HTTP status code

    76000

    Internal error in host agent

    The host agent returned an unexpected response.

    Internal Server Error (500)

    76001

    Unauthenticated

    The provided token is invalid.

    Unauthorized (403)

    76002

    Internal Server error

    The host agent encountered an unspecified internal server error.

    Unprocessable Entity (422)

    Error message reference list

    400: deploymentEnvironmentId An invalid filter column is provided.

    403: Invalid credentials.

    404: Invalid applicationId, or if any of the following filters contain a value that cannot be resolved to their respective entity (labels and nested objects not supported):

    • 1: deploymentEnvironmentId

    • 2: deploymentEnvironmentName

    • 3: fleetId

    • 4: fleetName

    • 5: regionId

    • 6: regionName

    • 7: dcLocationId

    • 8: deLocationName

    If no application instances can be allocated and if your application is configured to use the Arcus protocol, and there is a connection problem with Arcus or Arcus is not implemented properly in your application build, a separate error may be thrown. Alternatively, if your filters contain one (or more) of the following properties but they filter out application instances that would be available for allocation, a 404 error can be thrown detailing which filter caused no application instances to be found:

    • 1: deploymentEnvironmentId

    • 2: fleetId

    • 3: regionId

    • 4: dcLocationId

    500: Internal service error For more information about this error see the Deployment-Platform Endpoints documentation.

    Game server deallocation

    When the match of a game server is over, the operational status of said game server needs to be updated to indicate it is free again for other clients to join. It can then be allocated again by your matchmaker for other clients to join and start a match. For this to be possible, the status of the game server needs to be changed from Allocated (5) to Online (4).

    This can be achieved in several ways:

    • Your game server can make an API call to set its own status back to Online (4)

    • Your matchmaker, when aware of game match progression, can make an API call and set the status of a game server back to Online (4)

    • Your game server can shut itself down after a match. Our platform will automatically restart it with the result that the game server's status will automatically be set to a correct value again

    Host

    A Host represent a machine with an operating system, be it a physical - bare metal - machine, or a virtual machine.

    Degraded host

    If a host is failing due to hardware problems, its category will be set to Broken. Our platform will no longer use this host, until its category has been reverted to the original value, e.g. Dedicated Game Server, after it is mended. Do not confuse the wording "Dedicated Game Server" with an application instance (e.g. a deployed Game Server).

    Reserving a Host for a Fleet

    See .

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: Host element structure

    API example

    List all your Hosts.

    HTTP request

    Response body

    You can still add new templates, where there were none before, but changing or removing them can only be done when there are no ApplicationInstances in the Fleet.
    {
      "name": "Bluewolf PC",
      "deploymentEnvironmentId": "173892217340309897",
      "deploymentProfileId": "8068976724396537810",
      "gameDeploymentTemplateId": "2190484266497878757",
      "utilityDeploymentTemplateId": "1316371245160957961"
      "dependencyDeploymentTemplateId": "6537333393893172977",
      "hostCapacityTemplateId": ""
    }
    [
      {
        "id": "7420099900751948711",
        "name": "Bluewolf PC",
        "deploymentEnvironmentId": "173892217340309897",
        "deploymentProfileId": "8068976724396537810",
        "gameDeploymentTemplateId": "2190484266497878757",
        "utilityDeploymentTemplateId": "1316371245160957961",
        "dependencyDeploymentTemplateId": "6537333393893172977",
        "hostCapacityTemplateId": "",
        "operationalStatus": 0
      }
    ]
    {
      "version": "2012-10-17",
      "statement": [
        {
          "sid": "Statement1",
          "effect": "Allow",
          "action": [
            "gamelift:*"
          ],
          "resource": []
        }
      ]
    }
        -port VAR_PORT -endpoint VAR_AWSGL_ENDPOINT -fleet-id VAR_AWSGL_FLEETID -host-id VAR_AWSGL_HOSTNAME -region VAR_AWSGL_REGION -auth_token VAR_AWSGL_TOKEN
    {
      "taskTemplateId": 0,
      "applicationInstanceIds": [
        "string"
      ],
      "fleetId": "",
      "regionId": "",
      "labels": [
        {
          "key": "string",
          "value": "string"
        }
      ],
      "executeAt": 0,
      "taskActionParam": [
        {
          "paramName": "string",
          "paramValue": "string"
        }
      ]
    }
    [
        {
            ...
        },
        {
            "id": 2,
            "name": "Deploy a software build",
            "description": "Install a software build onto a server. This can be used to install an initial build of a new game instance, or to patch an existing instance. If the software build was previously downloaded (preloaded), it will not be downloaded again.",
            "actions": [
                {
                    "idx": 0,
                    "actionType": "Download software build",
                    "requiredParams": {
                        "buildId": "The ID of the applicationBuild. Its build archive will be downloaded."
                    }
                },
                {
                    "idx": 1,
                    "actionType": "Extract software build",
                    "requiredParams": {
                        "buildId": "The ID of the applicationBuild. This action will extract the build archive that has been downloaded."
                    }
                },
                {
                    "idx": 2,
                    "actionType": "Stop instance",
                    "requiredParams": {
                        "methodId": "The ID of the stop-method, indicating how you want to stop the application instance.",
                        "timeout": "If the stop-method is graceful, you can indicate a maximum time to wait here, before the application instance is forcefully terminated."
                    }
                },
                {
                    "idx": 3,
                    "actionType": "Deploy software build to instance",
                    "requiredParams": {
                        "buildId": "The ID of the applicationBuild. This action expects the build archive to already have been downloaded and extracted onto the host."
                    }
                },
                {
                    "idx": 4,
                    "actionType": "Start instance",
                    "requiredParams": null
                }
            ]
        },
        {
            ...
        }
    ]
    {
      "taskTemplateId": 2,
      "applicationInstanceIds": [
        "7307311272729997509", "1803671638346755523"
      ],
      "fleetId": "1382702706111300109",
      "executeAt": 0,
      "taskActionParam": [
        {
          "paramName": "buildId",
          "paramValue": "3772131712593619554"
        },
        {
          "paramName": "methodId",
          "paramValue": "1"
        },
        {
          "paramName": "timeout",
          "paramValue": "0"
        }
      ]
    }
    [
      {
        "id": 3874,
        "createdAt": 1567172470,
        "executeAt": 1567172470,
        "finishedAt": 0,
        "numTasks": 78,
        "numTasksOk": 0,
        "numTasksFailed": 0,
        "numTasksCancelled": 0,
        "taskIds": [
          285613,
          285614,
          285615,
          ... snipped ...
        ]
      }
    ]

    Unix timestamp of when the last Tasks was finished executing

    numTasks

    int

    Total number of Tasks in this TaskBatch

    numTasksOk

    int

    Number of successfully executed Tasks

    numTasksFailed

    int

    Number of failed Tasks

    numTasksCancelled

    int

    Number of cancelled Tasks

    taskIds

    [int]

    Array of key-value pairs indicating Task ID vs Task Result Code

    DeploymentEnvironment
    GET /deploymentEnvironment
    DeploymentProfile
    GET /deploymentProfile
    GameDeploymentTemplate
    GET /deploymentTemplate/game
    UtilityDeploymentTemplate
    GET /deploymentTemplate/utility
    DependencyDeploymentTemplate
    GET /deploymentTemplate/dependency
    HostCapacityTemplate
    GET /hostCapacityTemplate
    paragraph below

    startedAt

    status

    stoppedAt

    updatedAt

    4

    online

    The instance has started up and is fully working (and initialized)

    5

    allocated

    The instance has been allocated by a matchmaker

    6

    allocating

    The instance is in the stage of being allocated by a matchmaker

    76003

    The application instance does not exist on the host

    The found application instance (=session) was removed from the host and thus cannot be allocated.

    Not Found (404)

    76004

    The application instance is invalid and cannot be allocated on the host

    The application instance is found but not in an allocatable state.

    Not Found (404)

    76005

    The application instance is currently being allocated on the host

    The application instance is already in the process of being allocated - cannot allocate it again.

    Unprocessable Entity (422)

    76006

    The application instance is already allocated on the host

    The application instance is already allocated - cannot allocate it again.

    Unprocessable Entity (422)

    76007

    Failed to allocate the application instance on the host is aborted or timed out

    The allocation process on the host agent has timed out (5 seconds) or was aborted for another reason.

    Unprocessable Entity (422)

    76007

    Failed to allocate the application instance on the host is aborted or timed out

    The host agent was not reachable or did not respond to a request in a timely fashion.

    Gateway Timeout (504)

    isVirtual

    int

    Read-only

    0) a bare metal machine, 1) a virtual machine

    category

    string

    Read-only

    Host category. Normally "Dedicated Game Servers" or "Dedicated Servers", but can be "Broken" if the server is in a degraded state.

    locationId

    int

    Read-only

    Legacy location Id (not used for ODP)

    dcLocationId

    int

    Read-only

    Data center location Id. Points to one of /v3/cloud/dcLocation

    fleetId

    string

    Read-only

    The ODP fleet ID, if this host has been assigned to a fleet

    fleetAssociatedSince

    int

    Read-only

    Unix timestamp of the last Fleet association

    dateStart

    string

    Read-only

    The date at which this host was assigned to your account

    dateEnd

    string

    Read-only

    The date at which this host will expire

    dateCancelled

    string

    Read-only

    The date at which this host was cancelled

    dateEndContract

    string

    Read-only

    The date at which the contract ends (applicable only if a contract has been signed)

    contractPeriod

    int

    Read-only

    The contract period in months

    extendPeriod

    int

    Read-only

    The service extend period in months

    purchaseOrder

    string

    Read-only

    Purchase order, if one has been supplied via our billing department

    paymentTerm

    int

    Read-only

    The payment term in days (how many days are invoices generated before dateEnd)

    ipAddress

    []

    Read-only

    All IP addresses assigned to this host. Note that the public IP address of a VM is also listed, even though it is assigned via NAT and not actually allocated on the host itself.

    numCpu

    int

    Read-only

    Number of CPUs in this host

    cpuInfo

    string

    Read-only

    CPU Type, Family, Model and Stepping information

    cpuType

    string

    Read-only

    CPU type. e.g. "Intel(R) Xeon(R) CPU E3-1230 @ 3.20GHz"

    cpuLoad

    int

    Read-only

    CPU load

    cpu

    []

    Read-only

    CPU details

    disk

    []

    Read-only

    Disk drive details

    memory

    []

    Read-only

    Memory details

    isReserve

    int

    Read-only

    Indicates whether this host has been reserved for a fleet. This value can only be 1 if a fleetId is provided as well. You can set this property via

    labels

    []

    No

    Collection of client-defined labels

    isODP

    int

    Read-only

    If 1, this host has been assigned for use by the Game Hosting Platform and can be used for game deployment

    id

    int

    Read-only

    Unique identifier of this element

    serverId

    int

    Read-only

    Identifier of the physical or virtual machine (internal Id)

    serverName

    string

    Read-only

    Reserving a Host for a Fleet
    Full API reference
    GET /v3/host

    Name of the physical or virtual machine (internal name)

    Applicationinstance

    An ApplicationInstance is the element that represents a deployed (e.g. a deployed game server or utility). It describes an actual instance of your software deployed onto a host.

    With automatic deployments enabled, an ApplicationInstance is created, destroyed and controlled by the platform. You can also do this manually though and additionally get information about all your ApplicationInstance elements using the .

    Element structure

    Property
    Value type
    Required

    Applicationbuild

    The ApplicationBuild element points to your build archive which must be uploaded to the i3D.net CDN. You must provide information on how to run the build by assigning the name of the exectuable, provide startup parameters, which OS it must run on, etc.

    Element structure

    Property
    Value type
    Required
    Description
    [
        {
            "id": 42297,
            "serverId": 16514,
            "serverName": "Server 10309",
            "isVirtual": 0,
            "category": "Dedicated Game Servers",
            "osId": 151,
            "locationId": 18,
            "dcLocationId": 6,
            "fleetId": "0",
            "dateStart": "2016-02-16",
            "dateEnd": "2021-04-01",
            "dateCancelled": "2018-08-07",
            "dateEndContract": "2021-04-01",
            "contractPeriod": 1,
            "extendPeriod": 1,
            "purchaseOrder": "",
            "paymentTerm": 30,
            "ipAddress": [
                {
                    "ipAddress": "31.204.131.39",
                    "version": 4,
                    "type": 1,
                    "private": 0
                },
                {
                    "ipAddress": "172.16.38.144",
                    "version": 4,
                    "type": 2,
                    "private": 1
                },
                {
                    "ipAddress": "2a00:1630:2:1606::",
                    "version": 6,
                    "type": 1,
                    "private": 0
                }
            ],
            "numCpu": 1,
            "cpuInfo": "Type 0, Family 6, Model 42, Stepping 7",
            "cpuType": "Intel(R) Xeon(R) CPU E3-1270 v6 @ 3.80GHz",
            "cpuLoad": 0,
            "disk": [
                {
                    "diskType": "ATA Disk",
                    "diskMedium": "hdd",
                    "model": "Western Digital RE4",
                    "product": "WDC WD1003FBYX-18Y7B0",
                    "diskSerial": "WD-WCAW32130431",
                    "firmwareVersion": "01.01V02",
                    "rotationRate": 7200,
                    "sectorSizeLogical": 512,
                    "sectorSizePhysical": 512,
                    "size": 931000000000
                }
            ],
            "memory": [
                {
                    "brand": "01980000002C",
                    "model": "9965669-033.A00G",
                    "size": 17179869184,
                    "speed": 2400,
                    "ecc": 1,
                    "memoryBank": 0,
                    "memoryType": "DIMM DDR4 2400 MHz Synchronous, Unbuffered (Unregistered), ECC",
                    "memorySlot": "A1",
                    "memorySerial": "EE203736"
                },
                {
                    "brand": "0198000000AD",
                    "model": "9965669-026.A00G",
                    "size": 17179869184,
                    "speed": 2133,
                    "ecc": 1,
                    "memoryBank": 1,
                    "memoryType": "DIMM DDR4 2133 MHz Synchronous, Unbuffered (Unregistered), ECC",
                    "memorySlot": "A2",
                    "memorySerial": "E73C5BC0"
                }
            ],
            "isReserve": 0,
            "labels": []
        },
    ]
    HostIp
    HostCpu
    HostDisk
    HostMemory
    PUT /v3/fleet/{fleetId}/host/{hostId}/reserve
    Label
    Description

    id

    string

    Read-only

    Unique identifier of this element

    deploymentEnvironmentId

    string

    Read-only

    Unique identifier of the DeploymentEnvironment it's deployed in

    deploymentEnvironmentName

    string

    Read-only

    The name of the DeploymentEnvironment it's deployed in

    fleetId

    string

    Read-only

    Unique identifier of the Fleet it's deployed in

    fleetName

    Table 1: ApplicationInstance element structure

    Application instance status

    During the lifetime of an ApplicationInstance it goes through several operational statuses. This is stored in the status property of the element. The different status levels and what they represent are explained in the following tables:

    Game and Utility instances

    Status code
    Status name
    Description

    0

    inactive

    The instance is no longer in use

    1

    setup

    The instance is being setup / deployed for the first time

    2

    offline

    The instance is deployed but not running

    3

    starting

    Table 2: Game and Utility ApplicationInstance operational statuses

    Dependency (Un-)Installer instances

    Status code
    Status name
    Description

    0

    inactive

    The instance is no longer in use

    101

    setup

    The instance is being setup / deployed for the first time

    102

    offline

    The instance is deployed but not running

    103

    starting

    Table 2: Dependency (Un-)Installer ApplicationInstance operational statuses

    Startup initialization period

    By default the status of a game instance will be set to ONLINE (4) after it's been started. This status means your game instance is ready to accept players. If however your game server requires an initialization period before it can accept players and you want our system to know about this, then you can do the following:

    In your ApplicationBuild, enable the instanceDoesReadyCallback option. With this checked, our platform will set the status of your game instances to STARTING (3). Next, you must have your game instance tell our backend when it is ready to accept players by having it perform a callback to our API. The status will then be set to ONLINE (4) and our platform then knows the game instance can be allocated (if applicable).

    Property inheritance

    Any properties defined for an ApplicationBuild will be inherited by an ApplicationInstance.

    Labels

    A user can define custom labels (key / value pairs) for an ApplicationInstance, to allow for easy identification and filtering of ApplicationInstance elements.

    Alongside client-defined labels there will also be additional read-only labels generated by the platform:

    • application_id

    • fleet_id

    • host_id

    • dc_location_id

    • region_id

    • application_build_id

    Read more about Labels.

    Relations

    An ApplicationInstance is deployed according to an ApplicationBuild.

    ApplicationBuild
    API endpoints for an ApplicationInstance

    id

    string

    Read-only

    Unique identifier of this element

    name

    string

    Yes

    User defined name of this element

    applicationId

    string

    Read-only

    Unique identifier of the Application element this belongs to

    osId

    int

    Yes

    ID of the operating system (see )

    stopMethod

    Table 1: ApplicationBuild element structure

    Executable & startupParameters

    You must provide us with the file name of the executable inside your build archive, in order for us to be able to run your application. If the executable is inside of a subfolder, you must provide this path as well. Note that the path here is relative.

    When starting your application, we will append the contents of the startupParameters property to the executable. You can enter any command line arguments you need for your application to run properly. You can use variables inside the startupParameters to use dynamic values such as a game server's network port, IP address, host ID, game server ID, etc. All available variables are explained in the Platform Variables chapter. It includes an example with fictional startupParameters.

    Running with lowered privileges

    By default we will run your applications with the root or administrator user. If you prefer, for security reasons, to run your utilities and / or game servers with lowered privileges, you can set the property runAsNonePrivileged to 1.

    This feature is only available on Linux as this time. Builds meant to run on Windows will always be exectued with the Administrator user.

    Supported operating systems

    The platform currently supports the following operating systems that you can use to run your applications on:

    • Ubuntu 18.04

    • Ubuntu 20.04

    • Ubuntu 22.04

    • Centos 8

    • Debian 10

    • Debian 12

    • Windows Server 2022 Standard

    You can also programmatically fetch the list of supported operating systems via GET /v3/operatingsystem and applying a filter on the 'odpSupported' property.

    If you need to use an OS that is currently not supported, you can request support for this by filing a ticket with us.

    ApplicationBuild labels

    A user can define custom labels (key / value pairs) for an ApplicationBuild, to allow for easy identification and filtering of ApplicationBuild elements.

    ApplicationBuildProperty

    Just like with the Application element, an ApplicationBuild can be assigned properties, by assigning ApplicationBuildProperty elements to an ApplicationBuild.

    Note that properties assigned to an Application will already be inherited by an ApplicationBuild, so there is no need to re-define those for each ApplicationBuild. Unless you want to override a certain property for an ApplicationBuild.

    ApplicationBuild creation process flow

    An ApplicationBuild is created by calling the endpoint POST /applicationBuild and is the final stage of the ApplicationBuild creation process:

    Relations

    See also: Application element relations

    Restrictions

    You can have any number of ApplicationBuilds on your account. There is no limit.

    Related topics

    • Orchestrator Overview

    • Game Deployment Quick Start Guide

    • i3d.net API documentation

    More information on Build Provisioning

    string

    Read-only

    The name of the Fleet it's deployed in

    hostId

    int

    Read-only

    Unique identifier of the Host it's deployed on

    isVirtual

    int

    Read-only

    1 if it's deployed onto a VM, 0 if deployed onto bare metal

    applicationId

    string

    Read-only

    Unique identifier of the Application this instance is based on

    applicationName

    string

    Read-only

    The name of the Application this instance is based on

    applicationType

    int

    Read-only

    The type of application as inherited from its parent Application: 1: Game server 2: Utility 3 DependencyInstaller 4 DependencyUninstaller

    applicationBuildId

    string

    Read-only

    Unique identifier of the ApplicationBuild this instance is based on

    dcLocationId

    int

    Read-only

    Host data center location ID

    dcLocationName

    string

    Read-only

    Host data center location name

    regionId

    int

    Read-only

    Unique identifier of the deployment region it's deployed in

    regionName

    string

    Read-only

    The name of the deployment region it's deployed in

    status

    int

    Read-only

    Game and Utility instances: 0: inactive 1: setup 2: offline 3: starting 4: online 5: allocated Dependency (Un-)Installer instances: 0: inactive 101: setup 102: offline 103: starting 104: running 105: completed 106: error

    manuallyDeployed

    int

    Read-only

    0: automatically deployed 1: manually deployed

    createdAt

    int

    Read-only

    Unix timestamp of when this element was created

    updatedAt

    int

    Read-only

    Unix timestamp of the last change to this element

    startedAt

    int

    Read-only

    Unix timestamp of when this element was last started

    stoppedAt

    int

    Read-only

    Unix timestamp of when this element was last stopped

    deletedAt

    int

    Read-only

    Unix timestamp of the Application instance deletion

    pid

    int

    Read-only

    PID of the instance

    pidChangedAt

    int

    Read-only

    Unix timestamp of the last PID change

    startupParams

    string

    Read-only

    The exact startup parameters that were used to start this application instance with all properties resolved to their respective values. Will be null if the instance has not been started, but will retain its previous value if it was stopped. Once set it will never be cleared again

    executable

    string

    Read-only

    The name of the executable that was ran when the application instance started. Will be null if the instance has not been started, but will retain its previous value if it was stopped. Once set it will never be cleared again

    ipAddress

    [ApplicationInstanceIP]

    Read-only

    All IP addresses active for this instance

    numPlayersMax

    int

    Read-only

    Maximum number of players allowed on a game server [only applies to instances of type Game Server]

    numPlayers

    int

    Read-only

    Current number of players on the game server [only applies to instances of type Game Server]

    liveHostName

    string

    Read-only

    Current game server name [only applies to instances of type Game Server]

    liveMap

    string

    Read-only

    Current map running on the game server [only applies to instances of type Game Server]

    liveGameVersion

    string

    Read-only

    Current version of the game server software [only applies to instances of type Game Server]

    liveRules

    string

    Read-only

    Current "rules" of the game server [only applies to instances of type Game Server]

    autoRestart

    int

    Read-only

    If auto restart is 1, the application instance will automatically restart after (self-)shutdown

    properties

    [ApplicationInstanceProperty]

    Read-only

    Properties inherited from the related ApplicationBuild

    labelReadOnly

    [Label]

    Read-only

    Collection of read-only labels generated by the system

    labelPublic

    [Label]

    No

    Collection of client-defined labels

    metadata

    [Metadata]

    No

    Metadata

    markedForDeletion

    int

    Read-only

    1 if the application instance is about to be destroyed

    The instance is currently starting up (optional)

    4

    online

    The instance has started up and is fully working (and initialized)

    5

    allocated

    The instance has been allocated by a matchmaker

    6

    allocating

    The instance is in the process of being allocated by a matchmaker

    The instance is currently starting up (optional)

    104

    running

    The instance has started up and is currently running

    105

    completed

    The instance has stopped without error

    106

    error

    The instance has stopped with error. To get the console output of the instance, see /v3/applicationInstance/{applicationInstanceId}/log

    int

    No

    The stop method that will be used on restart or destroy of an application instance. The default is taken from the value of Application.stopMethod - any value submitted here overrides that Application default

    stopTimeout

    int

    No

    The timeout that will be used on restart or destroy of an application instance. The default is taken from the value of Application.stopTimeout - any value submitted here overrides that Application default

    executable

    string

    Yes

    Name of the executable file that our system must run to start the application

    startupParameters

    string

    Yes

    Startup parameters passed to the executable

    runAsNonePrivileged

    int

    No

    0: run as root user (default) 1: run as non-privileged user. This currently only works for builds deployed onto a Linux operating system. Windows builds will always run as administrator.

    instanceDoesReadyCallback

    int

    No

    Set to 1 if a deployed application instance will inform the platform it's done with initializing and is ready to accept players. Defaults to 0 if not set, which means an instance's status will go directly to ONLINE (4) after starting

    type

    int

    Read-only

    The application build type. A list of types can be found in: GET /application/type

    applicationBuildFile

    ApplicationBuildFile

    Yes

    An object describing the location of the original build archive.

    buildProvisioningStorageType

    int

    Yes

    Type of storage being used. You can find all types in GET/v3/builds

    hostCapacityTemplateId

    int

    No

    ID of the HostCapacityTemplate to assign to this ApplicationBuild

    label

    [Label]

    No

    Collection of client-defined labels

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    Supported operating systems

    Patching

    The PatchJob element represents a scheduled patching process. This chapter only describes the PatchJob element itself and refers to directly related elements. For explanations on how the patching process itself works and which different patching methods are available (and how they work), please refer to the Patching Process chapter.

    A PatchJob has several properties that define which ApplicationInstances you want to update:

    • DeploymentEnvironment ID (PatchJob.deploymentEnvironmentId property)

    • Application ID (PatchJob.applicationId property)

    • One or more old ApplicationBuild IDs (PatchJob.applicationBuild property)

    • One or more Fleet IDs (PatchJob.fleet property)

    You can preview your instance selection using the endpoint which takes the above arguments and returns an array of regions along with the number of instances per region that fall within your selection.

    All other properties define how the PatchJob behaves. An important one is the patchJobMethodId property which states which patching method will be used. E.g. forced update, rolling update or A/B deployment.

    Element structure

    Property
    Value type
    Required
    Description

    Table 1: PatchJob element structure

    Making adjustments to an existing PatchJob

    Updating a PatchJob is only allowed up to 5 minutes before the start time of the job. The only exception to this rule are the reporting email addresses, which can be updated at any time.

    The reason for this is to prevent the system from becoming confused with sudden changes being introduced when the PatchJob has just started running. Additionally, the platform will perform certain operations in preparation for the start of the PatchJob. E.g. we will start distributing the new build software to the hosts 5 minutes before the start time of the job, in order to have a more swift patching process itself.

    Once you created a Patch Job for an application that is of type Game, you cannot update it to switch to an application that is of type Utility (or vice-versa).

    Running PatchJobs in parallel

    It is possible to create multiple PatchJobs and have them run in parallel, as long as the instance selections of the PatchJobs do not overlap. In other words, if you have more than one PatchJob scheduled at or around the same time and they will (partially) apply to the same ApplicationInstances, only one PatchJob will run at the time - the other one(s) will wait for the first to finish before starting.

    Cancelling a PatchJob

    You can cancel a pending or running PatchJob at any time. If it has not yet started, its status will simply be changed to CANCELLED and the PatchJob will never run.

    When you attempt to cancel a PatchJob, you will have two choices:

    • Cancel and revert.

    • Cancel and wrap-up (don't do anything).

    API example

    Create a new PatchJob within your i3D.net account.

    HTTP request

    Request body

    Response body

    patchJobMethodId

    int

    Yes

    The patching method. You can find a list of available methods via

    patchJobMethod

    string

    Read-only

    The name of the selected patching method

    patchJobName

    string

    Yes

    The name of the PatchJob

    status

    int

    Read-only

    The status of the PatchJob. You can find a list of available codes via

    stopMethodId

    int

    No

    The stop method ID to apply if instances need to be stopped. You can find the list available stop methods via

    stopMethodName

    string

    Read-only

    The name of the selected stop method

    stopMethodTimeout

    int

    No

    The maximum time in seconds the system will wait for a graceful stop command to be executed. If the maximum timeout is reached, an implicit, forced stop will be performed

    comments

    string

    No

    Custom comments

    schedulerStartTime

    int

    No

    A unix timestamp for when to start the PatchJob. Must be at least 5 minutes from the time of submission

    patchJobStartTime

    int

    Read-only

    A unix timestamp indicating the actual start time of the PatchJob

    patchJobRunTime

    int

    No

    The maximum run time of a PatchJob. If exceeded, the PatchJob will be forcefully finalized

    patchJobRuntimeType

    int

    No

    patchJobRunTime unit: 0: seconds (default) 1: minutes 2: hours 3: days

    patchJobRuntime

    string

    Read-only

    The name of the patchJobRuntimeType

    patchJobOverallProgress

    Read-only

    Current overall state of the PatchJob

    applicationBuild

    []

    Yes

    A list of elements defining which ApplicationBuilds must be replaced

    fleet

    []

    Yes

    The PatchJob will apply to instances in these Fleets

    email

    []

    No

    A list of PatchJob related email addresses, indicating who to send reports to and which report types

    createdAt

    int

    Read-only

    A unix timestamp of when this element was created

    updatedAt

    int

    Read-only

    A unix timestamp of when this element was last updated

    id

    string

    Read-only

    Unique identifier of this element

    deploymentEnvironmentId

    string

    Yes

    The PatchJob will apply to instances within this DeploymentEnvironment

    applicationId

    string

    Yes

    POST /v3/patchJob/applicationInstancePreview
    Full API reference
    POST /v3/patchJob

    The PatchJob will apply to instances of this

    {
      "deploymentEnvironmentId": "7089186347851060494",
      "applicationId": "8939460394116420757",
      "patchJobMethodId": 1,
      "patchJobName": "Demo Patch Job",
      "stopMethodId": 0,
      "stopMethodTimeout": 0,
      "comments": "Deployment of v2.0.5 - fixes a number of bugs",
      "schedulerStartTime": 1587405918,
      "patchJobRunTime": 0,
      "patchJobRuntimeType": 0,
      "applicationBuild": [
        {
          "oldApplicationBuildId": "7302942857359174099",
          "newApplicationBuildId": "6257774125730552445"
        }
      ],
      "fleet": [
        {
          "fleetId": "7089186347851060494"
        }
      ],
      "email": [
        {
          "email": "[email protected]",
          "progressReport": 1,
          "resultReport": 1
        }
      ]
    }
    [
        {
            "id": "7089186347851060494",
            "deploymentEnvironmentId": "6133202252238171791",
            "applicationId": "8939460394116420757",
            "patchJobMethodId": 1,
            "patchJobMethod": "Forced deployment",
            "patchJobName": "Demo Patch Job",
            "status": 8,
            "stopMethodId": 0,
            "stopMethodName": "Hard kill",
            "stopMethodTimeout": 0,
            "comments": "Deployment of v2.0.5 - fixes a number of bugs",
            "schedulerStartTime": 1587405918,
            "patchJobStartTime": 0,
            "patchJobInstanceRunTime": "Seconds",
            "patchJobInstanceRuntimeTypeId": 0,
            "patchJobInstanceRuntime": "Seconds",
            "patchJobOverallProgress": null,
            "applicationBuild": [
                {
                    "id": "6585830247739430646",
                    "oldApplicationBuildId": "7302942857359174099",
                    "newApplicationBuildId": "6257774125730552445"
                }
            ],
            "fleet": [
                {
                    "id": "2956430507214878357",
                    "fleetId": "7089186347851060494"
                }
            ],
            "email": [
                {
                    "id": "5874260432191151466",
                    "email": "[email protected]",
                    "progressReport": 1,
                    "resultReport": 1,
                    "createdAt": 1587746121,
                    "changedAt": 0
                }
            ],
            "createdAt": 1587395426,
            "changedAt": 0
        }
    ]
    Application
    GET /v3/patchJob/type
    GET /v3/patchJob/status
    GET /v3/application/stopMethod
    PatchJobOverallProgress
    PatchJobApplicationBuild
    PatchJobFleet
    PatchJobEmail

    Request Response

    Health

    Arcus provides a health check mechanism that determines whether client and server properly respond to traffic.

    The game server (server) must send a health packet when no data has been received by the host agent (client) within 30 seconds. In case the host agent (client) closed the connection but somehow the game server (server) didn't get notified about this, sending the health packet will fail and the game server must close the connection. The host agent will continuously attempt to re-establish the connection.

    The host agent (client) uses the same mechanism but adds a small buffer to the interval and will never send a simple health packet when it didn't receive any message in the set interval + buffer value the connection will be closed and reopened.

    The default interval is 30 seconds, and the default buffer is 1 second.

    Direction flow This request is sent from a game server (server) > host agent (client).

    Packet structure

    Data
    Type
    Value

    Soft Stop

    With a soft stop it's possible to inform the application to gracefully shut itself down. By providing a timeout value higher than "0" the platform will hard stop the application in case it didn't gracefully shutdown yet.

    Soft stop can be applied for instance patching For more information on patching .

    Timeout unit is in seconds, an zero value will disable the timeout and the stop request will never timeout.

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload

    The default behavior of the platform will always hard stop your application, Its required to configure a soft stop method for your application before this packet will be send to your application.


    Allocated

    Inside one platform, it's possible to mark a game server as allocated this way the platform knows that the server is in use. Most matchmakers are taking care of this part with the help of arcus we could inform the game servers them self about this as well. A game server can already start loading maps or doing other tasks before the players are connected to improve the player waiting times for example.

    In a couple of cases game servers needs to know what to load for example: which map does it need to load? this can be controlled with the help of meta data. An allocation request has a optional body containing a JSON object with key value pairs for meta data this keys and values are definable by the customer.

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload


    MetaData

    With this packet it's possible to transfer from the ONE platform to the game server without the need of an allocation call first. This may be of use if you want to send extra information to the game server, such as: Load map "islands_large", Game mode: "Battle royal", Type: "Squads". The game server can prepare / load everything already before a single player has joined the server.

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload


    Reverse MetaData

    With this packet it's possible to transfer from the game server to the ONE platform. This may be of use if you want to send information from the game server to the ONE platform.

    Example situation: There are situations where the game server made a decision which changed the inside the game server. To receive this information from the game server this packet can be used to send the changed metadata back to the ONE platform.

    Direction flow This request is sent from the game server (server) > host agent (client).

    Packet structure

    Data
    Type
    Value

    Example payload


    Live state

    Live state packet is meant to sync up the game state in the server with the platform and inform if the game is in use by players. To make sure the data is in sync, this packet will always be sent to new connections to sync up the current state. After the connection has been established it will be sent on every game state that update the state with a new player amount.

    The payload of the response will contain a JSON object with the mandatory values, an developer can always add more information to the response.

    Mandatory values

    • current players

    • max players

    • server name

    • map

    Direction flow This request is sent from a game server (server) > host agent (client).

    Packet structure

    Data
    Type
    Value

    Example payload


    Host information

    On all new connections the client will send the Host Information to the server. To inform the server on what type of host he is running.

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload


    ApplicationInstance information

    On all new connections the client will send the ApplicationInstance information message to the server. This will contain information that is known for the instance by our one platform.

    Below you will find an example object that will be send to indicate what kind of information you can expect.

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload


    ApplicationInstance status

    This packet is meant to sync the game status in the server with the platform and inform on what status it's is running. To make sure the data is in sync, this packet will always been sent to new connections to sync up the current state. After the connection has been established it will be sent on every game status state update.

    The payload of the response will contain a JSON object with the mandatory values.

    List of possible values

    Status code
    Status name
    Description

    More information see

    Direction flow This request is sent from a game server (server) > host agent (client).

    Packet structure

    Data
    Type
    Value

    Example payload


    Custom Command

    This packet can be used to create your own custom commands to fit your needs. The structure of the packet is pre-defined, it's a simple key value object with 2 predefined keys command, arguments.

    Example An example command can be command:kickplayer argument:<name> <reason>. Below you will find an example object

    Direction flow This request is sent from the host agent (client) > game server (server).

    Packet structure

    Data
    Type
    Value

    Example payload

    PacketID

    uint

    Any positive integer, chosen by the server, will be mirrored back in the clients's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    No payload

    PacketID

    uint

    Any positive integer, chosen by the client, will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    JSON object with key value pair that contains the timeout value.

    PacketID

    uint

    Any positive integer, chosen by the client, will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    (optional) JSON object with key value pair that contains the meta data object.

    PacketID

    uint

    Any positive integer, chosen by the client. It will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    (optional) JSON object with key value pair that contains the metadata object.

    PacketID

    uint

    Any positive integer, chosen by the client. It will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    (optional) JSON object with key value pair that contains the metadata object.

    mode
  • version.

  • PacketID

    uint

    Any positive integer, chosen by the server, will be mirrored back in the clients's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    JSON object with key value pair that contains live state information.

    PacketID

    uint

    Any positive integer, chosen by the client. It will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Below you can find a example payload.

    PacketID

    uint

    Any positive integer, chosen by the client. It will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Payload see Example payload below

    PacketID

    uint

    Any positive integer chosen by the server. Will be mirrored back in the clients's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Json object with key status which contains the new status of the instance

    PacketID

    uint

    Any positive integer, chosen by the client. It will be mirrored back in the server's response

    Length

    uint

    Length of the payload data

    Payload

    JSON string

    Payload see Example payload below

    Flags

    byte

    0

    Opcode

    byte

    0x02

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x30

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x60

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x40

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x41

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x20

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x50

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x70

    Reserved

    byte

    0

    Reserved2

    byte

    0

    3

    starting

    The instance is currently starting up (optional)

    4

    online

    The instance has started up and is fully working (and initialized)

    5

    allocated

    The instance has been allocated by a matchmaker

    Flags

    byte

    0

    Opcode

    byte

    0x71

    Reserved

    byte

    0

    Reserved2

    byte

    0

    Flags

    byte

    0

    Opcode

    byte

    0x45

    Reserved

    byte

    0

    Reserved2

    byte

    0

    see patching
    metadata
    metadata
    metadata
    ApplicationInstance status
    {
        "timeout": 100
    }
    {
        "data": [
            {
                "key": "map",
                "value": "islands_large"
            },
            {
                "key": "maxPlayers",
                "value": "16"
            }
        ]
    }
    {
        "data": [
            {
                "key": "map",
                "value": "islands_large"
            },
            {
                "key": "mode",
                "value": "BR"
            },
            {
                "key": "type",
                "value": "squads"
            }
        ]
    }
    {
        "data": [
            {
                "key": "map",
                "value": "islands_large_xl"
            },
            {
                "key": "mode",
                "value": "kingofhill"
            },
            {
                "key": "type",
                "value": "duos"
            }
        ]
    }
    {
        "players": 5,
        "maxPlayers": 16,
        "name": "My awesome Game Server",
        "map": "islands",
        "mode": "DEATHMATCH",
        "version": "1.0.0.1"
    }
    [
        {
            "id": 0,
            "serverId": 0,
            "serverName": "string",
            "projectName": "string",
            "clientServerName": "string",
            "clientState": "string",
            "isVirtual": 0,
            "locationId": 0,
            "dcLocationId": 0,
            "fleetId": "string",
            "fleetAssociatedSince": 0,
            "serviceTag": "string",
            "ipAddress": [
                {
                    "ipAddress": "string",
                    "version": 0,
                    "type": 0,
                    "private": 0,
                    "interface": 0,
                    "macAddress": "string",
                    "rDns": "string",
                    "vlanId": 0,
                    "gateway": "string",
                    "netmask": "string",
                    "prefix": 0
                }
            ],
            "brand": "string",
            "model": "string",
            "numCpu": 0,
            "labels": [
                {
                    "key": "string",
                    "value": "string"
                }
            ]
        }
    ]
    {
        "fleetId": "string",
        "hostId": 0,
        "isVirtual": 0,
        "applicationId": "string",
        "applicationType": 0,
        "applicationBuildId": "string",
        "installId": "string",
        "dcLocationId": 0,
        "regionId": "string",
        "status": 0,
        "createdAt": 0,
        "startedAt": 0,
        "stoppedAt": 0,
        "pid": 0,
        "pidChangedAt": 0,
        "manuallyDeployed": 0,
        "properties": [
            {
                "id": "string",
                "propertyType": 0,
                "propertyKey": "string",
                "propertyValue": "string"
            }
        ],
        "ipAddress": [
            {
                "ipAddress": "string",
                "ipVersion": 0,
                "private": 0
            }
        ],
        "labels": [
            {
                "key": "string",
                "value": "string"
            }
        ],
        "metadata": [
            {
                "key": "string",
                "value": "string"
            }
        ],
        "autoRestart": 0
    }
    {
        "status": 4
    }
    {
        "data": [
            {
                "key": "command",
                "value": "kickplayer"
            },
            {
                "key": "arguments",
                "value": "player1 Hacking"
            }
        ]
    }

    API v3 error codes

    Error group codes

    These error group codes define error categories. Within each category there will be codes for specific errors. These are documented further down this page.

    Range Error code
    Error Group

    10000

    GENERIC_ERROR

    Table 1: Error group codes

    Generic

    Error Code
    Message

    Table 2: Generic error codes

    Account

    Error Code
    Message

    Table 3: Account group codes

    AgentSoftwareRelease

    Error Code
    Message

    Table 4: AgentSoftwareRelease error codes

    AgentSoftwareVersion

    Error Code
    Message

    Table 5: SoftwareVersion error codes

    ApiKey

    Error Code
    Message

    Table 6: ApiKey error codes

    ApiKeyWhitelist

    Error Code
    Message

    Table 7: ApiKeyWhitelist error codes

    ApiLog

    Error Code
    Message

    Table 8: ApiLog error codes

    Application

    Error Code
    Message

    Table 8: Application error codes

    ApplicationBuild

    Error Code
    Message

    Table 9: ApplicationBuild error codes

    ApplicationBuildConfiguration

    Error Code
    Message

    Table 10: ApplicationBuildConfiguration error codes

    ApplicationBuildProperty

    Error Code
    Message

    Table 11: ApplicationBuildConfiguration error codes

    ApplicationDeployment

    Error Code
    Message

    Table 12: ApplicationDeployment error codes

    ApplicationInstall

    Error Code
    Message

    Table 12: ApplicationInstall error codes

    ApplicationInstance

    Error Code
    Message

    Table 13: ApplicationInstance error codes

    ApplicationProperty

    Error Code
    Message

    Table 14: ApplicationProperty error codes

    ArcusCustomCommandError

    Error Code
    Message

    Table 15: ArcusCustomCommandError error codes

    AssignableFile

    Error Code
    Message

    Table 16: AssignableFile error codes

    BuildProvisioning

    Error Code
    Message

    Table 17: BuildProvisioning error codes

    BuildProvisioningFile

    Error Code
    Message

    Table 18: BuildProvisioningFile error codes

    Calc

    Error Code
    Message

    Table 19: Calc error codes

    CalcQuote

    Error Code
    Message

    Table 20: CalcQuote error codes

    CCU

    Error Code
    Message

    Table 21: CCU error codes

    Cloud

    Error Code
    Message

    Table 22: CCU error codes

    CloudDetail

    Error Code
    Message

    Table 23: CloudDetail error codes

    CloudProvider

    Error Code
    Message

    Table 24: CloudProvider error codes

    CoLocation

    Error Code
    Message

    Table 25: CoLocation error codes

    CoLocationAccess

    Error Code
    Message

    Table 26: CoLocationAccess error codes

    ColocationAlert

    Error Code
    Message

    Table 27: CoLocationAlert error codes

    Company

    Error Code
    Message

    Table 28: Company error codes

    Create Game Install

    Error Code
    Message

    Table 29: Create Game Install error codes

    CrossConnect

    Error Code
    Message

    Table 30: CrossConnect error codes

    DeploymentEnvironment

    Error Code
    Message

    Table 31: DeploymentEnvironment error codes

    DeploymentProfile

    Error Code
    Message

    Table 32: DeploymentProfile error codes

    DeploymentTemplate

    Error Code
    Message

    Table 33: DeploymentTemplate error codes

    EmailConfirmation

    Error Code
    Message

    Table 34: Email error codes

    Filter

    Error Code
    Message

    Table 35: Email error codes

    Fleet

    Error Code
    Message

    Table 36: Fleet error codes

    FlexMetalOrder

    Error Code
    Message

    Table 37: FlexMetalOrder error codes

    FormErrorCodes

    Error Code
    Message

    Table 38: Form error codes

    Game

    Error Code
    Message

    Table 39: Game error codes

    Game Instance

    Error Code
    Message

    Table 40: Game Instance error codes

    Host

    Error Code
    Message

    Table 41: Host error codes

    Host Agent

    Error Code
    Message

    Table 42: Host Agent error codes

    HostAgentAPIError

    Error Code
    Message

    Table 43: HostAgentAPIError codes

    HostAlert

    Error Code
    Message

    Table 44: HostAlert error codes

    HostCapacityTemplate

    Error Code
    Message

    Table 45: HostCapacityTemplate error codes

    InstanceType

    Error Code
    Message

    Table 46: InstanceType error codes

    InstanceTypeCapacity

    Error Code
    Message

    Table 47: InstanceTypeCapacity error codes

    Invoice

    Error Code
    Message

    Table 48: Invoice error codes

    Label

    Error Code
    Message

    Table 49: Label error codes

    Location

    Error Code
    Message

    Table 50: Location error codes

    Network

    Error Code
    Message

    Table 51: Network error codes

    OdpAgent

    Error Code
    Message

    Table 52: OdpAgent error codes

    OperatingSystem

    Error Code
    Message

    Table 53: OperatingSystem error codes

    OS

    Error Code
    Message

    Table 54: OS error codes

    PatchJob

    Error Code
    Message

    Table 55: PatchJob error codes

    Postman

    Error Code
    Message

    Table 55: Postman error codes

    PxeServer

    14000
    Invalid server ID

    Table 56: PxeServer error codes

    ReportEmail

    Error Code
    Message

    Table 57: ReportEmail error codes

    RunAsRootError

    Error Code
    Message

    Table 58: RunAsRootError codes

    Slack

    Error Code
    Message

    Table 59: Slack error codes

    SshKey

    Error Code
    Message

    Table 60: SshKey error codes

    Task

    Error Code
    Message

    Table 61: Task error codes

    Telemetry

    Error Code
    Message

    Table 62: Telemetry error codes

    Ticket

    Error Code
    Message

    Table 63: Ticket error codes

    Trigger

    Error Code
    Message

    Table 64: Trigger error codes

    Vetting

    Error Code
    Message

    Table 65: Vetting error codes

    Whitelist

    Error Code
    Message

    Table 66: Whitelist error codes

    Elements that don't have error codes

    • API Log

    • ApplicationBuildConfiguration

    • ApplicationBuildProperty

    • Application Deployment

    For more information, see the documentation.

    10007

    Internal server error

    10008

    An invalid parameter was provided

    10009

    Entity cannot be deleted due to conflict

    10010

    The supplied JSON request body does not have a valid structure

    10011

    No request body supplied

    10012

    API route not found

    10013

    RANGED-DATA header not found

    10014

    RANGED-DATA results cannot be larger than than %d

    10015

    RANGED-DATA sum of start and results must be less than or equal to %d

    10016

    Invalid filter column

    10017

    %s is not a valid column to filter on

    10018

    Invalid sort column

    10019

    %s is not a valid column to sort on

    10020

    Invalid sort order

    10021

    %s is not the valid sort order, only ASC and DESC are allowed

    10022

    The page has expired, please try again

    10023

    The %s is invalid

    10024

    Invalid label key

    10025

    Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character

    10026

    No application instance found for %s (%s)

    10027

    Service not available

    10028

    List of following fields are not available in model

    10029

    Not a valid field

    10030

    Invalid filter value

    10031

    %s value of '%s' is not a valid ID

    45007

    Cannot update the email address, it's already stored in your account

    10008

    An invalid parameter was provided

    10009

    Entity cannot be deleted due to conflict

    10010

    The supplied JSON request body does not have a valid structure

    10011

    No request body supplied

    10012

    API route not found

    10013

    RANGED-DATA header not found

    10014

    RANGED-DATA results cannot be larger than than %d

    10015

    RANGED-DATA sum of start and results must be less than or equal to %d

    10016

    Invalid filter column

    10017

    %s is not a valid column to filter on

    10018

    Invalid sort column

    10019

    %s is not a valid column to sort on

    10020

    Invalid sort order

    10021

    %s is not the valid sort order, only ASC and DESC are allowed

    10022

    The page has expired, please try again

    10023

    The %s is invalid

    10024

    Invalid label key

    10025

    Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character

    10026

    No application instance found for %s (%s)

    10027

    Service not available

    10028

    List of following fields are not available in model

    10029

    Not a valid field

    10030

    Invalid filter value

    10031

    %s value of '%s' is not a valid ID

    10008

    An invalid parameter was provided

    10009

    Entity cannot be deleted due to conflict

    10010

    The supplied JSON request body does not have a valid structure

    10011

    No request body supplied

    10012

    API route not found

    10013

    RANGED-DATA header not found

    10014

    RANGED-DATA results cannot be larger than than %d

    10015

    RANGED-DATA sum of start and results must be less than or equal to %d

    10016

    Invalid filter column

    10017

    %s is not a valid column to filter on

    10018

    Invalid sort column

    10019

    %s is not a valid column to sort on

    10020

    Invalid sort order

    10021

    %s is not the valid sort order, only ASC and DESC are allowed

    10022

    The page has expired, please try again

    10023

    The %s is invalid

    10024

    Invalid label key

    10025

    Only hyphens (-), underscores (_), lowercase characters and numbers are allowed. Keys must start with a lowercase character

    10026

    No application instance found for %s (%s)

    10027

    Service not available

    10028

    List of following fields are not available in model

    10029

    Not a valid field

    10030

    Invalid filter value

    10031

    %s value of '%s' is not a valid ID

    28007

    The application used by the application build is no longer valid, please modify it. Find the possible applicationIds in: GET /application and update the application build in: PUT /applicationBuild/{%d}

    28008

    The application used by the application install is no longer valid, please modify it. Find the possible applicationIds in: GET /application and update the application install in: PUT /applicationInstall/{%d}

    28009

    At least one application build exist for this application, therefore the application cannot be deleted

    28010

    The application must be of type Game, find the possible ids in: GET /application

    28011

    You can only set a management protocol on application type game

    28012

    The applicationId %s you set doesn't match the id (%s) already saved

    28013

    The chosen stop method ID %s doesn't belong to the operating system ID %s

    30007

    The application build is currently in use by some application instances, please delete them before trying to delete the application build

    30008

    Invalid applicationBuildId (%s), find the possible ids in: GET /applicationBuild

    30009

    You can only assign one application build

    30010

    oldApplicationBuildId and newApplicationBuildId is same

    30011

    The old application build and the new application build have different operating systems

    30012

    The application build file gave an error on checking the file on the server. The HTTP response code from server: %s. The URL used for the request was %s. Please correct the error or contact our help desk to help you solve this problem

    30013

    The provided build provisioning registration id %s is not valid

    30014

    In an update you cannot change the file, please create a new build and use the patch job to change the build

    30015

    You cannot change an application build from build provisioning type %s to %s, please create a new application build

    30016

    You must supply the applicationBuildFile

    30017

    The application build is currently in use by %s deployment template(s) %s, and in fleet(s) %s

    31007

    Invalid active value, the possible values are: 0: not active, 1: active

    31008

    Cannot create application build an application install with Id %s is still in the process of being created

    34011

    The value of the filter parameter is invalid, possible values can be fleetId, regionId, dcLocationId

    34012

    The filter value is required

    34013

    The startTime parameter is invalid, only numeric values are allowed

    34014

    The endTime parameter is invalid, only numeric values are allowed

    34015

    The type parameter is invalid, it may only be %s

    34016

    The status parameter is invalid, possible values can be: 3) starting, 4) online, 5) allocated (only possible if previous status is online)

    34017

    There is no application instance found.

    34018

    There is no known operation system set on the application instance

    34019

    The chosen stop method doesn't match the operation system, you can find the stop methods in GET /application/stopMethod

    34020

    The chosen stop method is not valid, you can find the stop methods in GET /application/stopMethod

    34021

    To use the Arcus stop method you need to have selected Arcus as management protocol on the application

    34022

    To use the A2S stop method you need to have selected A2S as management protocol on the application

    34023

    The application instance that you want to use has an stop task assigned to it, please use an other application instance.

    34024

    Something went wrong when creating the task

    34025

    Unable to change an application instance that is marked for deletion

    34026

    No application instances available with filters '%s'

    34027

    There are application instances available for allocation with your filters - but Arcus is not working for these instances

    34028

    The deploymentEnvironmentId is valid - but there are no application instances available that match your deploymentEnvironmentId filter

    34029

    The fleetId is valid - but there are no application instances available that match your fleetId filter

    34030

    The regionId is valid - but there are no application instances available that match your regionId filter

    34031

    The dcLocationId is valid - but there are no application instances available that match your dcLocationId filter

    34032

    The application instance that you want to stop is automatically created by the scaler and can't be stopped manually

    34033

    This application instance cannot restart due to a temporary disruption in service - please contact support at https://www.i3d.net/support/

    34034

    This application instance cannot start due to a temporary disruption in service - please contact support at https://www.i3d.net/support/

    34035

    No online game application instances exist for this application - no application instance can be allocated

    34036

    No online game application instances available for allocation - unable to determine a reason at this time

    34037

    No online game application instances available for allocation - even without filters enabled

    34038

    Application instance session not found

    34039

    No application instances available with nested filters '%s'

    29011

    The value of a property of type private network port must be between %s and %s (inclusive), or 0 for a random private network port

    12007

    File is not pdf

    12008

    Only one file expected

    12009

    No file found

    12010

    Price does not match internally calculated

    12011

    Item not found

    12020

    Unknown configuration

    24006

    Invalid credentialName, find the possible names in: GET /cloud/configuration/credential

    24013

    Resource name %s does not exist. Create a new Resource using the Azure API first: https://docs.microsoft.com/en-us/rest/api/resources/resourcegroups/createorupdate

    24007

    The cloud credentials already exist for the given cloud provider. The same credentials can only be set once

    24009

    The cloud credentials are invalid. You may not have permissions to access this project

    24005

    The credential name already exists, the name must be unique

    24012

    The param %s for %s is not of type %s

    24008

    The param %s for %s is required

    24014

    Unable to activate cloud credentials while VMs exist using the current cloud credentials. Please remove all existing VMs for this cloud provider and try again.

    24001

    Unknown cloud provider, find the possible cloud provider in: GET /cloud/provider

    19006

    Could not terminate VM instance

    19007

    Could not query VM instance status

    19008

    Could not associate static IP to VM instance

    13009

    Could not get VM instance regions

    19010

    Could not get VM instance types

    19011

    Could not get VM images

    19012

    Could not copy VM image

    19013

    Could not get VM cpu platforms

    19014

    The instance configuration is not supported, check instance types, regions, and operating systems

    19015

    Invalid key/pair name provided

    19016

    IP address quota has been reached / exceeded

    19017

    Ubisoft cloud network UUID is not valid

    19018

    VM Image is not found

    19019

    No default subnet for availability zone

    19020

    Failed to allocate the network(s) with error No fixed IP addresses available

    19021

    Instance type not available

    51007

    Unable to find a PDU for this colocation

    51008

    The IP address is out of range for this colocation

    51009

    An error occurred adding the PTR record

    18007

    The file Id is already being used in another application install, the same file cannot be used more than once

    18008

    The application install name already exists, the name must be unique

    32007

    The strategy type is invalid, the possible values are: 1: Round Robin

    32008

    The cpuPlatform cannot be null (it can be empty string '')

    32009

    The cpuPlatform is invalid, find the possible values in: GET /cloud/cpuPlatform

    32010

    The primaryInstanceTypeName for providerId %d is invalid, find the possible values in: GET /cloud/instanceType

    32011

    The primaryInstanceTypeName is not supported by our AMIs, change the instance type or contact i3D in order to create a custom AMI

    32012

    The secondaryInstanceTypeName for providerId %d is invalid, find the possible values in: GET /cloud/instanceType

    32013

    The secondaryInstanceTypeName is not supported by our AMIs, change the instance type or contact i3D in order to create a custom AMI

    32014

    The cloudImageName is invalid, find the possible values in: GET /cloud/image

    32015

    The cloudImageName is required, find the possible values in: GET /cloud/image

    32016

    Invalid deploymentRegionId, find the possible ids in: GET /deploymentProfile/{deploymentProfileId}

    32017

    The deployment region requires at least one i3dDcLocationId, find the possible ids in: GET /cloud/dcLocation

    32018

    The bufferValueType is invalid, the possible values are: 0: absolute value, 1: percentage value

    32019

    The dcLocationId = %d is invalid, find the possible ids in: GET /cloud/dcLocation

    32020

    The i3dDcLocationId = %d is already set in another deployment region of the same deployment profile

    32021

    The dcLocationId = %d does not belong to providerId = (%d)

    32022

    The dcLocationId is required, find the possible ids in: GET /cloud/dcLocation

    32023

    The dcLocationId = %d is already set in the deployment region

    32024

    Invalid deploymentContainerId, find the possible ids in: GET /deploymentRegion/{deploymentRegionId}

    32025

    Invalid deploymentContainerLocationId, find the possible ids in: GET /deploymentRegion/{deploymentRegionId}

    32026

    The cloudProviderId is required, find the possible cloud provider Ids in: GET /cloud/provider

    32027

    The primary and secondary instance types must be different

    32028

    Not all existing deployment containers belonging to the deployment region have been provided in your request

    32029

    Not all existing deployment container locations belonging to the deployment region have been provided in your request

    32030

    End time must be zero or bigger than start time

    32031

    This deployment profile cannot be deleted because it is used in the following fleet(s): %s

    32032

    Deletion of deployment region cannot be cancelled because its profile is marked for deletion

    32033

    Deletion of deployment container cannot be cancelled because its region is marked for deletion

    32034

    Deletion of deployment container location cannot be cancelled because its container is marked for deletion

    32035

    The deployment region is missing in deployment profile, add a deployment region to your deployment profile in: POST /deploymentProfile/%s/deploymentRegion

    32036

    The I3D location is missing in deployment region of deployment profile, find the possible ids in: GET /deploymentProfile

    32037

    The cloud image is missing in deployment profile, find the possible ids in: GET /deploymentProfile

    32038

    The instance type is missing in deployment region of deployment profile, find the possible ids in: GET /deploymentProfile

    32039

    The bufferValue and/or bufferValueType are missing. When overriding bufferValueMin or bufferValueMax these properties are required

    32040

    Cannot remove location, there are secondary cloud locations still. Remove those first before removing the last primary cloud location

    32041

    The minimumCapacity has to be smaller than or equal to maximumCapacity (if not null)

    32042

    The bufferValueMax (%d) must be greater than or equal to bufferValueMin (%d)

    32043

    There are still (%d) manually deployed instances active in the i3D dcLocationId %s, you must delete them first before deleting the i3D dcLocation

    32044

    Deployment profile is already in use by another fleet, you can only use a deployment profile once

    32045

    The application property does not exist, find possible ids in GET /application/{applicationId}/property

    32046

    Cannot override application property for this deployment region: it is already overridden in deployment region property %s. Use PUT /deploymentRegion/%s/property/%s to update it instead

    32047

    The given applicationPropertyId has an invalid property type, only raw properties may be overridden by a deployment region property

    32048

    Invalid regionName, find the possible ids in: GET /deploymentProfile/{deploymentProfileId}

    32049

    Invalid dcLocationName , find the possible ids in: GET /cloud/dcLocation

    32050

    Invalid dcLocationId , find the possible ids in: GET /cloud/dcLocation

    33007

    Only application builds with an application of type game are allowed to be used in game deployment template

    33008

    Only application builds with an application of type utility are allowed to be used in utility deployment template

    33009

    The following fleet(s) %s, still have operational status automatic deployment or automatic scaling, change the operational status on the fleet before removing the game deployment template

    33010

    Game deployment template doesn't have valid applicationBuildId

    33011

    Utility deployment template doesn't have valid applicationBuildId

    33012

    Invalid deploymentTemplateId, find the possible ids in: GET /deploymentTemplate/dependency

    33013

    Only application build with an application of type dependency installer is allowed to be used in dependency deployment template

    33014

    Only application build with an application of type dependency uninstaller is allowed to be used in dependency deployment template

    33015

    The following fleet(s) %s, still have operational status automatic deployment or automatic scaling, change the operational status on the fleet before removing the dependency deployment template

    33016

    You can only assign one application build to a game deployment template

    33017

    The %s with id %s doesn't exists in our database

    33018

    The dependencyTemplate chosen has dependencyBuild with osId %s, this doesn't match the applicationBuild that has osId %s

    33019

    The dependencyBuild OS of the installer doesn't match the uninstaller, OS installer: %s and OS uninstaller: %s

    33020

    The chosen game deployment template doesn't have an build assigned to it

    33021

    Currently the %s template is in use by application instances, you cannot change the application build for this template, please use patching for this

    33022

    Dependency deployment template doesn't have valid dependency installer applicationBuildId

    33023

    Utility deployment template doesn't have valid dependency uninstaller applicationBuildId

    26007

    Invalid fleetId, find the possible ids in: GET /fleet

    26008

    The fleet used in the creation of the application instance is no longer valid, please create a new application instance

    26009

    The fleet name already exists, the name must be unique

    26010

    Fleet %s's operational status must be 0 to unset the game deployment Id (current: %s). Set the fleet's operational status to 0 first in: PUT /fleet/%s/operationalStatus

    26011

    The host is already assigned to this fleet

    26012

    There is no game deployment template configured, unable to change the operational status to %s. Update the fleet with a game deployment template in: PUT /fleet/%s

    26013

    The fleet operational status must be 0, to (un)set the dependency deployment template, use PUT /fleet/%s/operationalStatus, to set the operationalStatus to 0 first

    26014

    For change the operational status you must send the field operationalStatus

    26015

    Unable to reserve host for fleet, there are %s application instances that do not belong to this fleet running on the host (fleet: %s, application instances: %s)

    26016

    You cannot change the %s on this fleet, because there are instances running for this fleet

    26017

    Invalid fleetId(s) (%s), find the possible ids in: GET /v3/fleet

    26018

    Cannot change the status of the fleet, because it's currently used by a patch job

    26019

    Invalid fleetName, find the possible ids in: GET /v3/fleet

    26020

    The fleet has no assigned game deployment template, unable to verify the target OS of requested servers

    26021

    Not able to remove marked for deletion deployment profile with id %s

    26022

    Something went wrong well deleting fleet with id %s

    39006

    The startTime parameter is invalid, only numeric values are allowed

    39007

    The endTime parameter is invalid, only numeric values are allowed

    39008

    Invalid period

    39009

    Host was already cancelled on %s

    39010

    Host is already active

    39011

    Host has expired on %s; it cannot be renewed

    39012

    Invalid dedicatedServerId, find the possible ids in: GET /dedicatedServer

    39013

    End time must be after start time

    39014

    The requested period does not overlap the contract period

    39015

    The requested period may not be longer than 12 months

    39016

    The IP address is invalid for this host

    39017

    An error occurred adding the PTR record

    39018

    Host (%d) is already assigned to a fleet (%s)

    39019

    No active host available in your account

    39020

    Host (%d) is not a valid host, only Bare Metal can be reserved

    39021

    Host id(%d) uplink is invalid

    39022

    Host (%d) is already in the process of reservation

    39023

    The host (%d) osId (%d) is not matched with the fleet osId (%d)

    76006

    The application instance is already allocated on the host

    76007

    Failed to allocate the application instance on the host is aborted or timed out

    50007

    Patch job scheduled time is less than current time

    50008

    Invalid patchJobReportEmailId, find the possible ids in: GET /v3/patchJob

    50009

    A completed patch job cannot be edited

    50010

    No actions can performed on reverted patch job

    50011

    The patch job is finished and cannot be edited anymore

    50012

    The patch job is running and cannot be edited anymore

    50013

    Only a running patch job can be stopped

    15011

    An error occurred uploading the attachment. Please try again

    15012

    The uploaded attachment is too big, the maximum file size is %s

    15013

    You may only upload a maximum of %s attachments.

    15014

    The uploaded attachment has an incorrect extension, files must have one of the following extensions: %s

    71007

    Event Action with id %s is invalid

    71008

    Rule Action with id %s is invalid

    71009

    Email address %s is invalid

    71010

    The name provided for the trigger has already being used

    71011

    The rule data type provided with id %s is invalid

    71012

    The value of conditionValue must be a numeric string or a number

    71013

    The value of rule must be a valid object of MemoryTriggerRule or CPUTriggerRule

    71014

    The value of action parameters must be a valid object of ApplicationInstanceStopMethod

    ApplicationProperty
  • DeploymentProfile

  • Host

  • Operating System

  • 11000

    FORM_ERROR

    12000

    CALC_QUOTE_ERROR

    13000

    CALC_ERROR

    15000

    TICKET_ERROR

    17000

    GAME_INSTANCE

    18000

    CREATE_GAME_INSTALL_ERROR

    21000

    ODP_AGENT_ERROR

    22000

    LABELS_ERROR

    23000

    TASK_ERROR

    24000

    CLOUD_ERROR

    25000

    DEPLOYMENT_ENVIRONMENT_ERROR

    26000

    FLEET_ERROR

    27000

    ASSIGNABLE_FILE_ERROR

    28000

    APPLICATION_ERROR

    29000

    APPLICATION_PROPERTY_ERROR

    30000

    APPLICATION_BUILD_ERROR

    31000

    APPLICATION_INSTALL_ERROR

    32000

    DEPLOYMENT_PROFILE_ERROR

    33000

    DEPLOYMENT_TEMPLATE_ERROR

    34000

    APPLICATION_INSTANCE_ERROR

    35000

    APPLICATION_DEPLOYMENT_ERROR

    36000

    OPERATING_SYSTEM_ERROR

    37000

    APPLICATION_BUILD_CONFIGURATION_ERROR

    38000

    APPLICATION_BUILD_PROPERTY_ERROR

    39000

    HOST_ERROR

    40000

    API_LOG_ERROR

    10001

    Entity not found

    10002

    No (valid) entity ID provided

    10003

    No access to entity

    10004

    Unauthenticated / invalid credentials for API request

    10005

    You are already logged in

    10006

    Unknown API version

    45001

    Invalid account ID

    45002

    Account already exists

    45003

    Too many accounts

    45004

    The confirmation expired, request a new confirmation and try again

    45005

    The confirmation is no longer valid

    45006

    The email address is already in use

    990001

    Invalid agentSoftwareReleaseId, find the possible ids in: GET /automation/agent/software/release

    990002

    The version number you try to insert is already in use (%s)

    990003

    You have given an invalid version.

    990004

    The given runtime identifier (%s) is not supported in the system

    45006

    The email address is already in use

    45007

    Cannot update the email address, it's already stored in your account

    48001

    Invalid softwareId, find the possible ids in: GET /admin/odp/agent/software/version

    48002

    Invalid software version, find the possible versions in: GET /admin/odp/agent/software/version

    52001

    Invalid apiKeyId, find the possible ids in: GET /account/apiKey

    48002

    Invalid software version, find the possible versions in: GET /admin/odp/agent/software/version

    56001

    Invalid apiKeyWhitelistId, find the possible ids in: GET /account/apiKey/{apiKeyId}/whitelist

    56002

    The IP range already exists for this API key, find the already existing IP ranges in: GET /account/apiKey/{apiKeyId}/whitelist

    40000

    the possible values are: GET, POST, PUT, DELETE

    56002

    The IP range already exists for this API key / find the already existing IP ranges in: GET /account/apiKey/{apiKeyId}/whitelis

    28001

    The application type can not be changed because the given application is already in use in a game deployment template

    28002

    The application type can not be changed because the given application is already in use in a utility deployment template

    28003

    Invalid applicationId, find the possible ids in: GET /application

    28004

    The application name must be unique, but this name is already in use by application with ID %s

    28005

    Invalid application type, the possible values are: %s

    28006

    Invalid managementProtocol, the possible values are: 0: None, 1: A2S, 2: ARCUS

    30001

    The application used in the body is of type Game. It needs at least one property of type public network port. You can create this property in: POST /application/{applicationId}/property

    30002

    The application used in the body has a management protocol bigger than 0, a property called "managementPort" of type network port is needed, you can create this property in POST /application/{applicationId}/property

    30003

    Invalid applicationBuildId, find the possible ids in: GET /applicationBuild

    30004

    The application build name already exists, the name must be unique

    30005

    The application build use in the deploy is no longer valid, please create a new application instance, find the possible applicationBuildIds in: GET /applicationBuild

    30006

    The application build must belong to a deployment template of the fleet

    37000

    Invalid applicationBuildConfigurationId, find the possible ids in: GET /applicationBuild/%d/configuration

    38000

    Invalid propertyId, find the possible ids in: GET /applicationBuild/%d/property

    38001

    Invalid network port, the network port is already used by application build property '%s' (%s)

    35000

    Invalid bmInstanceTypeId, find the possible ids in: GET /host/instanceType

    35001

    Invalid vmInstanceTypeId, find the possible ids in: GET /cloud/instanceType

    35002

    The amount of application instances on this bare metal instance type cannot be bigger than %d (this is equal to numCpu _ numCoresPerCpu _ ' . RelationApplicationInstanceEntity::UPPER_LIMIT . ')

    35003

    The amount of application instances on this cloud instance type cannot be bigger than %d (this is equal to numCpu * ' . RelationApplicationInstanceEntity::UPPER_LIMIT . ')

    31001

    No application found, find the possible ids in: GET /application

    31002

    Application install already exists for that application

    31003

    Invalid installId, find the possible ids in: GET /applicationInstall

    31004

    This application install is being use in at least one application build, thus it can not be deleted

    31005

    The application install name already exists, the name must be unique

    31006

    Invalid osGroupId, the possible values are: 1: windows, 2: linux

    34001

    The selected host is assigned to a different fleet that the one provided, please select another host or the fleet the host has assigned

    34002

    The application instance status cannot be manually set if the application instance is not running

    34003

    The application instance status cannot be manually set to allocated if the application instance is not online

    34004

    Invalid applicationInstanceId, find the possible ids in: GET /applicationInstance

    34006

    This stop method requires a timeout value that must be greater than 0

    34010

    Parameter value is not valid

    29001

    Invalid propertyId, find the possible ids in: GET /application/%d/property

    29004

    The propertyKey = %s already exists for the applicationId = %d

    29006

    The value of a property of type public network port must be between %s and %s (inclusive), or 0 for a random public network port

    29008

    Invalid property password, the property value you have chosen needs to be %d characters long

    29009

    This network port already used by application property '%s' (%s)

    29010

    The amount of network ports for a network port range must be between %s and %s

    75001

    Custom command model is empty, need to provide at lease one command

    75002

    The host that you want to do the custom command on has no game instances with the Arcus protocol implemented

    27001

    Invalid fileId, find the possible ids in: GET /applicationInstall/assignable

    60001

    The provided userId %s doesn't match the userId %s in the database

    60002

    User with userId %s has not been found!

    60003

    The user id must be bigger than 0

    60004

    The name provided for the registration already exists for this user

    68001

    Invalid build provisioning file id, find the possible ids in: GET /buildProvisioning/storage/file

    13001

    Unknown configuration

    13002

    Error in order properties

    13003

    Failed to save the order

    12001

    Error in quote properties

    12002

    Error in item quote properties

    12003

    Failed to save the quote

    12004

    Failed to save the item

    12005

    Errors in form

    12006

    File upload(s) expected but not found

    42001

    The value of the filter parameter is invalid, possible values can be %s

    42002

    Parameter value is not valid

    42003

    The startTime parameter is invalid, only numeric values are allowed

    42004

    The endTime parameter is invalid, only numeric values are allowed

    24010

    %s is not a valid region name for %s, find the possible region name in: GET /cloud/dcLocation

    24011

    Error validating credentials with AWS: An unknown error occurred

    24003

    Error validating credentials with AWS: Invalid accessKeyId

    24004

    Error validating credentials with AWS: Invalid secretAccessKey

    24002

    Error validating credentials with AWS: You do not have enough permissions

    24015

    Error validating credentials with Azure

    59001

    Invalid ucSettingId, find the possible ids in: GET /cloud/provider/uc/setting

    59002

    Invalid Ubisoft cloud projectId

    59003

    Invalid Ubisoft cloud region name, find the possible name's in: GET /v3/cloud/provider/dcLocation

    59004

    Invalid Ubisoft cloud public network UUID

    59005

    Invalid Ubisoft cloud private network UUID

    59006

    Invalid Ubisoft cloud security group UUID

    19000

    Undefined / unhandled error

    19001

    Instance quota has been reached / exceeded

    19002

    Instance zone resource pool exhausted

    19003

    Could not create VM instance

    19004

    Could not start VM instance

    19005

    Could not stop VM instance

    51001

    Invalid colocationId, find the possible Ids in: GET /colocation

    51002

    Service was already cancelled on :date

    51003

    Service is already active

    51004

    Service contract end date is invalid

    51005

    Service has expired on :date

    51006

    The supplied PDU does not match the PDU found for this colocation, find the possible pduIds in: GET /colocation

    56001

    Errors in form Invalid accessId, find the possible Ids in: GET /colocation/access File upload(s) expected but not found

    56002

    Invalid status, the possible values are: all, granted, suspended, pending, denied or revoked

    56003

    You are not allowed to request Data Center access. You don't have an active colocation server

    56004

    Transition to revoked status is only possible from Granted or Suspended statuses.

    56005

    The white list entry may be deleted only if it is in denied state.

    56006

    Invalid documentId, find the possible Ids in: GET /colocation/access/{accessId}/document

    57001

    Invalid colocationAlertId, find the possible ids in: GET /colocation/{colocationId}/alert

    44001

    Invalid companyId, find the possible Ids in: GET /company

    44002

    Duplicate company

    18001

    Invalid fileId, find the possible ids in: GET /applicationInstall/create

    18002

    The game executable was not found in the archive

    18003

    The archive cannot be handled due an unknown error

    18004

    The archive has an unhandled extension, do not know how to process it

    18005

    No game found

    18006

    No files found

    67001

    Invalid crossConnectId, find the possible Ids in: GET /crossConnect

    67002

    Cross connect was already cancelled on %s

    67003

    Cross connect is already active

    67004

    Cross connect contract end date is invalid

    67005

    Cross connect contract has expired on %s

    67006

    Invalid uplinkId, find the possible Ids in: GET /crossConnect/%s

    25001

    Cannot delete this deployment environment because it is used in a fleet

    25002

    Invalid deploymentEnvironmentId, find the possible ids in: GET /deploymentEnvironment

    25003

    The deployment environment name already exists, the name must be unique

    25004

    Invalid deploymentEnvironmentName, find the possible ids in: GET /deploymentEnvironment

    32001

    The entity is marked for deletion and thus it cannot be modified

    32002

    Invalid deploymentProfileId, find the possible ids in: GET /deploymentProfile

    32003

    The deployment profile name already exists, the name must be unique

    32004

    The deployment region name already exists for the deployment profile, the name must be unique for a deployment profile

    32005

    The maximumCapacity (if not null) has to be larger or equal to minimumCapacity

    32006

    The bufferValueMin (%d) must be smaller or equal to bufferValueMax (%d)

    33001

    BuildId and NewBuildId cannot be same

    33002

    Sum of BuildIdPercentage and NewBuildIdPercentage must be equal to 100

    33003

    Cannot delete the deployment template, it is already in use

    33004

    The deployment template name already exists, the name must be unique

    33005

    Invalid gameDeploymentTemplateId, find the possible ids in: GET /deploymentTemplate/game

    33006

    Invalid utilityDeploymentTemplateId, find the possible ids in: GET /deploymentTemplate/utility

    53001

    Invalid emailConfirmationId

    43001

    Filter is invalid

    43002

    Filter parameter is invalid, its possible values can be '%s'

    43003

    Filter parameter '%s' is not a valid '%s' (must be of type '%s')

    26001

    Cannot delete this fleet, it is already in use

    26002

    Host is already reserved by fleet '%s' (%s)

    26003

    Only reset if there are no active application instances on this host

    26004

    The elements of the fleet are not correctly set to start deploying application instances

    26005

    Cannot delete this fleet, there are %s active application instances on this fleet. Find the application instances that are still running on this fleet with GET /applicationInstance?filters=fleetId%%3D%s

    26006

    The host selected does not have that fleetId assigned or the hostId is not correct

    63001

    Out of stock

    63002

    Invalid Flex Metal order ID

    63003

    No active instances found

    63004

    Not a Flex Metal server

    11001

    Errors in form

    11002

    File upload(s) expected but not found

    16001

    Invalid game ID

    16002

    Not the owner of the given game ID

    17001

    Invalid game server ID

    17002

    Game server is already running

    17003

    Game server is already stopped

    17004

    Game server's status cannot be manually set if the process is not running

    17005

    Game server's status cannot be manually set to allocated if the process is not online

    17006

    Invalid filter query parameter

    39000

    Invalid hostId, find the possible ids in: GET /host

    39001

    The selected host is assigned to a different fleet that the one provided, please select another host or the fleet the host has assigned

    39002

    Host is already reserved, you can un-reserve it in: PUT /fleet/{fleetId}/host/{hostId}/unreserve

    39003

    There are active application instances in the host, it cannot be unreserved

    39004

    The value of the filter parameter is invalid, possible values can be %s

    39005

    Parameter value is not valid

    21001

    No ODP agent exists for this hostId please select another host

    76000

    Internal error in host agent

    76001

    Unauthenticated

    76002

    Internal Server error

    76003

    The application instance does not exist on the host

    76004

    The application instance is invalid and cannot be allocated on the host

    76005

    The application instance is currently being allocated on the host

    58001

    Invalid hostAlertId, find the possible ids in: GET /host/{hostId}/alert

    46001

    Cannot delete this host capacity template because it is used in fleet %s (id: %s)

    46002

    Cannot delete this host capacity template because it is used in application build %s (id: %s)

    46003

    Invalid hostCapacityTemplateId, find the possible Ids in: GET /hostCapacityTemplate

    46004

    This host capacity template name already exists, the name must be unique

    64001

    Invalid instance type, find possible instance types in: GET /host/flexmetal/instanceType

    47004

    This instance type does not exist, find the possible instance types in GET /host/instanceType

    47003

    This instance type does not exist, find the possible instance types in GET /cloud/instanceType

    47001

    Invalid instanceTypeCapacityId, find the possible Ids in: GET /hostCapacityTemplate/{hostCapacityTemplateId}/instanceTypeCapacity

    47005

    Capacity limit exceeded; you may only have up to %s application instances on this instanceType (%s per core * %s cores%s). Review the amount of cores for your chosen instanceType and adjust the capacity accordingly

    47002

    An instance type capacity already exists for this host capacity template/providerId/instance type combination

    70001

    Invalid invoiceId, find the possible ids in: GET /v3/account/invoice

    70002

    Invalid invoice number

    22001

    Invalid character in query, only AND/OR operators are allowed.

    22002

    Label must have unique key

    66001

    Invalid location, find possible locations in: GET /locations

    80001

    The ip-range not found

    21001

    No ODP agent exists for this hostId please select another host

    21002

    Invalid agentId, find the possible ids in: GET /odp/web/agent

    36000

    Invalid osId, find the possible ids in: GET /operatingsystem

    36001

    The operating system of the application build and the server don't match, please use another host

    36002

    The osId provided belongs to a osGroupId that does not match the osGroupId set in the application install, find the possible osIds in: GET /operatingsystem

    36003

    The OS is not available for Flex Metal usage. Find the possible osIds in: GET /operatingsystem

    36004

    The osId provided belongs to a osGroupId that does not match the osGroupId set in the application, find the possible osIds in: GET /operatingsystem

    36005

    You cannot change the osId for an application build, create a new application build instead

    65001

    Invalid operating system, find possible operating systems in: GET /operatingsystem

    50001

    The patch job name already exists, the name must be unique

    50002

    Invalid patchJobId, find the possible ids in: GET /v3/patchJob

    50003

    Patch job can no longer be updated since its scheduled start time less than 5 minutes away

    50004

    Patch job can only be put on hold if the patch job status is active or preload

    50005

    Patch job can only be unhold if patch job is put on hold

    50006

    A completed or cancelled patch job cannot be canceled anymore

    72001

    Unable to parse schema JSON

    14001

    No cactiId available for this interface

    14002

    Category is not allowed for this action

    14003

    Invalid speed, please provide speed in duplex format.

    14004

    Invalid state

    49001

    Email address (%s) is not unique

    73001

    Windows builds can only run as administrator

    73002

    Dependency installer and uninstaller can only be run as root

    41001

    The validation of the webHookUrl failed

    41002

    The slack setting name already exists, the name must be unique

    41003

    Invalid slackSettingId, find the possible ids in: GET /slackSetting

    73001

    Invalid sshKeyId, find the possible ids in: GET /sshKey

    23001

    Invalid task template ID

    23002

    Invalid task ID

    23003

    Task creation is missing a required parameter %s

    23004

    Invalid task action parameter

    23005

    Task status cannot be changed (anymore)

    23006

    Invalid task batch ID

    69001

    Parameter value is not valid

    69002

    The startTime parameter is invalid

    69003

    The endTime parameter is invalid

    69004

    Invalid interval parameter

    69005

    The endTime parameter value is smaller than startTime parameter value

    15005

    Ticket is permanently closed

    15006

    Ticket is already closed

    15007

    Ticket is already open

    15008

    The ticket can not be created, rate limit exceeded

    15009

    Attachment not found, unable to attach to ticket

    15010

    Unable to delete attachment that is already coupled to a ticket (reply)

    71001

    Invalid trigger ID

    71002

    You can not use this event %s with a rule based on server

    71003

    Must be an array %s

    71004

    Condition with conditionId %s and value %s is invalid

    71005

    Condition with id %s is not valid

    71006

    For event Action with id %s the value must be NULL

    61001

    Vetting level is not sufficient

    55001

    Invalid whitelistId, find the possible ids in: GET /account/whitelist

    ErrorDetails