void SCreateContainerFleetSection::PollDescribeContainerFleet()

in GameLiftPlugin/Source/GameLiftPlugin/Private/SMenu/Containers/SCreateContainerFleetSection.cpp [421:476]


void SCreateContainerFleetSection::PollDescribeContainerFleet()
{
	Async(EAsyncExecution::Thread,
		[this]() mutable
		{
			UGameLiftContainersStatus* ContainersStatus = GetMutableDefault<UGameLiftContainersStatus>();
			FString StackIdentifier = ContainersStatus->StackIdentifier;

			int i = 0;
			for (; i < WaitTimesCount; ++i) {
				// If the cgd is not setup, it means the whole thing is reset
				auto ContainerState = EDeploymentMessageStateFromString(ContainersStatus->Status.ToString());
				if (!ContainersStatus->IsCgdConfigurationFinished || ContainerState != EDeploymentMessageState::InProgressMessage) {
					return;
				}

				IGameLiftContainersHandler& Handler = IGameLiftCoreModule::Get().GetGameLiftContainersHandler();
				// Pass in StackIdentifier for the GameName field in the deployer as a quick workaround
				// to decouple containers and ec2 stack deployments and fix describe container fleet calls
				GameLiftDescribeContainerFleetResult DescribeContainerFleetResult = Handler.DescribeContainerFleet(StackIdentifier);
				Async(EAsyncExecution::TaskGraphMainThread,
					[this, DescribeContainerFleetResult = MoveTemp(DescribeContainerFleetResult)]() mutable
					{
						UGameLiftContainersStatus* ContainersStatus = GetMutableDefault<UGameLiftContainersStatus>();
						// Populate fields only when describe call is successful
						if (DescribeContainerFleetResult.bIsSuccessful) {
							ContainersStatus->FleetId = DescribeContainerFleetResult.FleetId;
							ContainersStatus->FleetStatus = DescribeContainerFleetResult.FleetStatus;
							ContainersStatus->FleetType = DescribeContainerFleetResult.FleetType;
							ContainersStatus->InstanceType = DescribeContainerFleetResult.InstanceType;
							PopulateFleetDetails();
							ContainersStatus->SaveConfig();
						}
					});

				if (DescribeContainerFleetResult.bIsSuccessful) {
					return;
				}

				FPlatformProcess::Sleep(WaitIntervalSeconds);
			}
			if (i == WaitTimesCount) {
				Async(EAsyncExecution::TaskGraphMainThread,
					[this]() mutable
					{
						UGameLiftContainersStatus* ContainersStatus = GetMutableDefault<UGameLiftContainersStatus>();
						UpdateStepStatusUI(EDeploymentMessageState::FailureMessage);
						ContainersStatus->ErrorCreatingContainerFleet = true;
						ErrorTextBlock->SetText(Menu::DeployContainers::kTimedOutPollingDeploymentStatusErrorMessage);
						ContainersStatus->ErrorMessageCreatingContainerFleet = Menu::DeployContainers::kTimedOutPollingDeploymentStatusErrorMessage;
						UE_LOG(GameLiftPluginLog, Display, TEXT("Timed out polling for deployment status"));
						ContainersStatus->SaveConfig();
					});
			}
		});
}