production-deployment-sample-script/deployment.py (44 lines of code) (raw):
import argparse
from models import ParsedBuild, ParsedFleet
from utils import GameLiftClient, utilities
# Parse out command line arguments and print help if needed
def _parse(args=None):
parser = argparse.ArgumentParser(description='Script for deploying a new Build/Fleet version and deleting older resources.')
parser.add_argument("-r", "--region", required=True, help='AWS Region, ex. us-west-2')
parser.add_argument("-f", "--fleet-id", required=True, help='Existing FleetId being replaced, ex. fleet-1234-5678-90')
parser.add_argument("-a", "--alias-id", required=True, help='Existing AliasId to update with new FleetId, ex. alias-1234-5678-90')
parser.add_argument("-bj", "--build-json", required=True, help='Json file modeling the new Build resource, ex. ./new_build.json')
parser.add_argument("-fj", "--fleet-json", required=True, help='Json file modeling the new Fleet resource, ex. ./new_fleet.json')
parsed_args = vars(parser.parse_args())
start(parsed_args)
# The main method of the script for performing the game server deployment
def start(args):
# Validate input json files before moving on to network calls
print("Opening Build json file: %s" % args['build_json'])
parsed_build = ParsedBuild(args['build_json'])
print("Opening Fleet json file: %s" % args['fleet_json'])
parsed_fleet = ParsedFleet(args['fleet_json'])
# Validate input FleetId and AliasId exist
game_lift_client = GameLiftClient()
previous_fleet_id = args['fleet_id']
alias_id = args['alias_id']
utilities.validate_fleet_exists(game_lift_client, previous_fleet_id)
utilities.validate_alias_exists(game_lift_client, alias_id)
# Create the Build based on input file
print("\nCreating new Build with Name: %s" % parsed_build.name)
create_build_response = game_lift_client.create_build(parsed_build)
new_build_id = create_build_response['Build']['BuildId']
print("Build %s created." % new_build_id)
# Loop to wait until the Build is READY
utilities.wait_for_build_to_be_ready(game_lift_client, new_build_id)
print("Build %s is READY!" % new_build_id)
# Create the Fleet based on inputs - Make sure to apply the new BuildId when creating the Fleet
parsed_fleet.build_id = new_build_id
print("\nCreating new Fleet with Name: %s, BuildId: %s" % (parsed_fleet.name, parsed_fleet.build_id))
create_fleet_response = game_lift_client.create_fleet(parsed_fleet)
new_fleet_id = create_fleet_response['FleetAttributes']['FleetId']
print("Fleet %s created." % new_fleet_id)
# Loop until Fleet is ACTIVE
utilities.wait_for_fleet_to_be_active(game_lift_client, new_fleet_id)
print("All Fleet locations on %s are ACTIVE!" % new_fleet_id)
# ===============================================================================================================================
# NOTE: If your new Fleet requires more than 1 instance, this is where to insert calls to UpdateFleetCapacity / PutScalingPolicy.
# ===============================================================================================================================
# Update the Alias with the new FleetId
print("\nUpdating Alias %s from Fleet %s to new Fleet %s" % (alias_id, previous_fleet_id, new_fleet_id))
update_alias_response = game_lift_client.update_alias(alias_id, new_fleet_id)
# Loop on existing Fleet and wait for all GameSessions to end. This can take a long time.
utilities.wait_for_game_sessions_to_terminate(game_lift_client, previous_fleet_id)
print("Fleet %s has 0 GameSessions, all traffic has transitioned to new Fleet %s." % (previous_fleet_id, new_fleet_id))
# Delete the previous Fleet
print("\nDeleting previous Fleet %s." % previous_fleet_id)
game_lift_client.delete_fleet(previous_fleet_id)
print("Deployment complete to Fleet %s!" % new_fleet_id)
# When called from the command line, will call into _parse, then start
if __name__ == "__main__":
_parse()