Beispiel #1
0
        /// <summary>
        ///     Update server provisioning status.
        /// </summary>
        /// <param name="serverIngressChanged">
        ///     A <see cref="ServerStatusChanged"/> message describing the change.
        /// </param>
        /// <returns>
        ///     A <see cref="Task"/> representing the operation.
        /// </returns>
        async Task UpdateServerProvisioningStatus(ServerStatusChanged serverProvisioningNotification)
        {
            if (serverProvisioningNotification == null)
            {
                throw new ArgumentNullException(nameof(serverProvisioningNotification));
            }

            Log.Debug("Updating provisioning status for server {ServerId} due to {NotificationType} notification...",
                      serverProvisioningNotification.ServerId,
                      serverProvisioningNotification.GetType().Name
                      );

            using (IAsyncDocumentSession session = DocumentStore.OpenAsyncSession())
            {
                DatabaseServer server = await session.LoadAsync <DatabaseServer>(serverProvisioningNotification.ServerId);

                if (server == null)
                {
                    Log.Warning("Received ServerStatusChanged notification for non-existent server (Id:{ServerId}).",
                                serverProvisioningNotification.ServerId
                                );

                    return;
                }

                Log.Debug("Existing provisioning status for server {ServerId} is {Action}:{Status}:{Phase}.",
                          server.Id,
                          server.Action,
                          server.Status,
                          server.Phase
                          );

                ProvisioningAction action = server.Action;

                if (serverProvisioningNotification.Status.HasValue)
                {
                    server.Status = serverProvisioningNotification.Status.Value;

                    switch (server.Status)
                    {
                    case ProvisioningStatus.Ready:
                    case ProvisioningStatus.Error:
                    {
                        server.Action = ProvisioningAction.None;
                        server.Phase  = ServerProvisioningPhase.None;

                        break;
                    }

                    case ProvisioningStatus.Deprovisioned:
                    {
                        session.Delete(server);

                        break;
                    }
                    }
                }

                if (serverProvisioningNotification.Phase.HasValue)
                {
                    server.Phase = serverProvisioningNotification.Phase.Value;
                }

                Log.Debug("New provisioning status for server {ServerId} is {Action}:{Status}:{Phase}.",
                          server.Id,
                          server.Action,
                          server.Status,
                          server.Phase
                          );

                server.AddProvisioningEvent(serverProvisioningNotification.Messages);

                await session.SaveChangesAsync();
            }

            Log.Debug("Updated provisioning status for server {ServerId}.", serverProvisioningNotification.ServerId);
        }