Пример #1
0
        private static async Task <int> Apply(ApplyOptions opts)
        {
            var response = await Provisioner.ApplyTerraformRunAsync(opts.RunId);

            Console.WriteLine(response);
            return(0);
        }
Пример #2
0
 public void MatchRequestHandler(MatchRequestMessage message, Player player)
 {
     if (message.Type == MatchRequestType.Join)
     {
         // Add the player to a match or remove them.
         if (message.Value == 0)
         {
             Provisioner.PlayerLeft(player);
         }
         else
         {
             Provisioner.GetProvisioner(message.Value).AddPlayer(player);
         }
     }
     else if (message.Type == MatchRequestType.SetReady)
     {
         // Set the player as ready or not.
         if (message.Value == 1)
         {
             Provisioner.PlayerReady(player);
         }
         else if (message.Value == 0)
         {
             Provisioner.PlayerNotReady(player);
         }
     }
 }
Пример #3
0
        private static async Task <int> Destroy(DestroyOptions opts)
        {
            var response = await Provisioner.DestroyIfNeededAsync(opts.PipelinesPoolId, opts.TerraformWorkspaceId, opts.MinutesWithoutBuilds, "Destroy from CLI", opts.FileToWatch);

            Console.WriteLine(response);
            return(0);
        }
        public async Task <IActionResult> Edit(int id, [Bind("pID,Name,TelNumber")] Provisioner provisioner)
        {
            if (id != provisioner.pID)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                try
                {
                    _context.Update(provisioner);
                    await _context.SaveChangesAsync();
                }
                catch (DbUpdateConcurrencyException)
                {
                    if (!ProvisionerExists(provisioner.pID))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }
                return(RedirectToAction(nameof(Index)));
            }
            return(View(provisioner));
        }
Пример #5
0
        private static async Task <int> ApplyIfNeeded(ApplyIfNeededOptions opts)
        {
            var response = await Provisioner.ApplyTerraformRunIfNeededAsync(opts.TerraformWorkspaceId);

            Console.WriteLine(response);
            return(0);
        }
Пример #6
0
 public static ProvisionerDto ProvisionerModelToDto(Provisioner model)
 {
     return(new ProvisionerDto()
     {
         Id = model.Id,
         Name = model.Name
     });
 }
        public async Task <IActionResult> Create([Bind("pID,Name,TelNumber")] Provisioner provisioner)
        {
            if (ModelState.IsValid)
            {
                _context.Add(provisioner);
                await _context.SaveChangesAsync();

                return(RedirectToAction(nameof(Index)));
            }
            return(View(provisioner));
        }
Пример #8
0
        public Provisioner AddProvisioner()
        {
            var provisioner = new Provisioner()
            {
                Name = "Новый поставщик " + DateTime.Now
            };

            _unitOfWork.BeginTransaction();
            _provisionerRepository.Create(provisioner);
            _unitOfWork.Commit();
            return(provisioner);
        }
Пример #9
0
        private static async Task <int> Create(CreateOptions opts)
        {
            var response = await Provisioner.EnsureThereIsAnAgentAsync(opts.PipelinesPoolId, opts.TerraformWorkspaceId, "Created from CLI");

            Console.WriteLine(response);

            if (response.RunId.HasValue() && opts.MinutesToWait.HasValue)
            {
                Console.WriteLine("Waiting for environment creation...");
                var started = DateTime.UtcNow;
                while ((DateTime.UtcNow - started).TotalMinutes < opts.MinutesToWait.Value)
                {
                    var run = await Provisioner.GetTerraformRunAsync(response.RunId);

                    Console.WriteLine("Status: " + run.Status);

                    if (run.Status.IsFinished())
                    {
                        Console.WriteLine("It has finished!");
                        if (run.Status.IsErrored())
                        {
                            Console.WriteLine("With errors :(");
                        }

                        break;
                    }
                    await Task.Delay(5000);
                }

                // wait for Azure to report the agent as online
                while ((DateTime.UtcNow - started).TotalMinutes < opts.MinutesToWait.Value)
                {
                    var isOnline = await Provisioner.ThereIsAPipelineAgentRunning(opts.PipelinesPoolId);

                    Console.WriteLine("There is an agent online: " + isOnline);
                    if (isOnline)
                    {
                        break;
                    }
                    await Task.Delay(5000);
                }
            }

            return(0);
        }
Пример #10
0
        /// <summary>
        ///     Update ingress details for the database server.
        /// </summary>
        /// <returns>
        ///     A <see cref="Task"/> representing the operation.
        /// </returns>
        async Task UpdateServerIngressDetails()
        {
            int?externalPort = await Provisioner.GetPublicPort();

            if (externalPort != null)
            {
                string serverFQDN = $"{Provisioner.State.Name}.database.{KubeOptions.ClusterPublicFQDN}";
                if (serverFQDN != Provisioner.State.PublicFQDN || externalPort != Provisioner.State.PublicPort)
                {
                    Log.Info("Server {ServerName} is accessible at {ClusterPublicFQDN}:{PublicPortPort}",
                             Provisioner.State.Name,
                             serverFQDN,
                             externalPort.Value
                             );

                    DataAccess.Tell(
                        new ServerIngressChanged(ServerId, serverFQDN, externalPort)
                        );

                    // Capture current ingress details to enable subsequent provisioning actions (if any).
                    Provisioner.State.PublicFQDN = serverFQDN;
                    Provisioner.State.PublicPort = externalPort;
                }

                if (Provisioner.State.Phase == ServerProvisioningPhase.Ingress)
                {
                    CompleteCurrentAction();
                }
            }
            else
            {
                Log.Debug("Cannot determine public port for server {ServerName}.", Provisioner.State.Name);

                if (Provisioner.State.PublicFQDN != null)
                {
                    DataAccess.Tell(
                        new ServerIngressChanged(ServerId, publicFQDN: null, publicPort: null)
                        );
                }
            }
        }
Пример #11
0
 public void UpdateProvisioner(Provisioner provisioner)
 {
     _unitOfWork.BeginTransaction();
     _provisionerRepository.Update(provisioner);
     _unitOfWork.Commit();
 }
Пример #12
0
        /// <summary>
        ///     Destroy an instance of SQL Server.
        /// </summary>
        /// <returns>
        ///     A <see cref="Task"/> representing the operation.
        /// </returns>
        async Task DeprovisionServer()
        {
            switch (Provisioner.State.Phase)
            {
            case ServerProvisioningPhase.None:
            {
                goto case ServerProvisioningPhase.Ingress;
            }

            case ServerProvisioningPhase.Ingress:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Ingress);

                await Provisioner.EnsureExternalServiceAbsent();

                goto case ServerProvisioningPhase.Monitoring;
            }

            case ServerProvisioningPhase.Monitoring:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Monitoring);

                await Provisioner.EnsureServiceMonitorAbsent();

                goto case ServerProvisioningPhase.Network;
            }

            case ServerProvisioningPhase.Network:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Network);

                await Provisioner.EnsureInternalServiceAbsent();

                goto case ServerProvisioningPhase.Instance;
            }

            case ServerProvisioningPhase.Instance:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Instance);

                await Provisioner.EnsureDeploymentAbsent();

                goto case ServerProvisioningPhase.Security;
            }

            case ServerProvisioningPhase.Security:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Security);

                await CredentialsProvisioner.EnsureCredentialsSecretAbsent();

                goto case ServerProvisioningPhase.Storage;
            }

            case ServerProvisioningPhase.Storage:
            {
                StartDeprovisioningPhase(ServerProvisioningPhase.Storage);

                await Provisioner.EnsureDataVolumeClaimAbsent();

                goto case ServerProvisioningPhase.Done;
            }

            case ServerProvisioningPhase.Done:
            {
                CompleteCurrentAction();

                break;
            }
            }
        }
Пример #13
0
        /// <summary>
        ///     Reconfigure / repair an instance of SQL Server.
        /// </summary>
        /// <returns>
        ///     A <see cref="Task"/> representing the operation.
        /// </returns>
        async Task ReconfigureServer()
        {
            switch (Provisioner.State.Phase)
            {
            case ServerProvisioningPhase.None:
            {
                goto case ServerProvisioningPhase.Storage;
            }

            case ServerProvisioningPhase.Storage:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Storage);

                await Provisioner.EnsureDataVolumeClaimPresent();

                goto case ServerProvisioningPhase.Security;
            }

            case ServerProvisioningPhase.Security:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Security);

                await CredentialsProvisioner.EnsureCredentialsSecretPresent();

                goto case ServerProvisioningPhase.Instance;
            }

            case ServerProvisioningPhase.Instance:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Instance);

                await Provisioner.EnsureDeploymentPresent();

                goto case ServerProvisioningPhase.Network;
            }

            case ServerProvisioningPhase.Network:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Network);

                await Provisioner.EnsureInternalServicePresent();

                goto case ServerProvisioningPhase.Monitoring;
            }

            case ServerProvisioningPhase.Monitoring:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Monitoring);

                await Provisioner.EnsureServiceMonitorPresent();

                Become(WaitForServerAvailable);     // We can't proceed until the deployment becomes available.

                break;
            }

            case ServerProvisioningPhase.Configuration:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Configuration);

                await Provisioner.InitialiseServerConfiguration();

                goto case ServerProvisioningPhase.Ingress;
            }

            case ServerProvisioningPhase.Ingress:
            {
                StartReconfigurationPhase(ServerProvisioningPhase.Ingress);

                await Provisioner.EnsureExternalServicePresent();

                break;
            }

                // Reconfiguration completes when the server has valid Ingress details.
            }
        }
Пример #14
0
        /// <summary>
        ///     Called when the actor is waiting for the server's Deployment to indicate that all replicas are Available.
        /// </summary>
        void WaitForServerAvailable()
        {
            Log.Info("Waiting for server {ServerId}'s Deployment to become Available...", ServerId);

            StartPolling(Signal.PollDeployment);

            ReceiveAsync <Signal>(async signal =>
            {
                string actionDescription;
                switch (Provisioner.State.Action)
                {
                case ProvisioningAction.Provision:
                    {
                        actionDescription = "Provisioning";

                        break;
                    }

                case ProvisioningAction.Reconfigure:
                    {
                        actionDescription = "Reconfiguration";

                        break;
                    }

                case ProvisioningAction.Deprovision:
                    {
                        actionDescription = "De-provisioning";

                        break;
                    }

                default:
                    {
                        return;
                    }
                }

                switch (signal)
                {
                case Signal.PollDeployment:
                    {
                        if (Provisioner.State.Status == ProvisioningStatus.Ready)
                        {
                            Become(Ready);

                            break;
                        }

                        DeploymentV1Beta1 deployment = await Provisioner.FindDeployment();
                        if (deployment == null)
                        {
                            Log.Warning("{Action} failed - cannot find Deployment for server {ServerId}.", actionDescription, ServerId);

                            FailCurrentAction(
                                reason: $"Cannot find server's associated Deployment in Kubernetes."
                                );

                            Become(Ready);
                        }
                        else if (deployment.Status.AvailableReplicas == deployment.Status.Replicas)
                        {
                            Log.Info("Server {ServerID} is now available ({AvailableReplicaCount} of {ReplicaCount} replicas are marked as Available).",
                                     ServerId,
                                     deployment.Status.AvailableReplicas,
                                     deployment.Status.Replicas
                                     );

                            // We're done with the Deployment now that it's marked as Available, so we're ready to initialise the server configuration.
                            if (Provisioner.State.Action == ProvisioningAction.Provision)
                            {
                                StartProvisioningPhase(ServerProvisioningPhase.Configuration);
                            }
                            else if (Provisioner.State.Action == ProvisioningAction.Reconfigure)
                            {
                                StartReconfigurationPhase(ServerProvisioningPhase.Configuration);
                            }
                            else
                            {
                                Log.Error("WaitForServerAvailable: Unexpected provisioning action '{Action}' on server {ServerId}.",
                                          Provisioner.State.Action,
                                          Provisioner.State.Id
                                          );

                                FailCurrentAction(
                                    reason: $"Server has unexpected provisioning action ({Provisioner.State.Action})."
                                    );

                                return;
                            }

                            Become(Ready);
                        }
                        else
                        {
                            Log.Debug("Server {ServerID} is not available yet ({AvailableReplicaCount} of {ReplicaCount} replicas are marked as Available).",
                                      ServerId,
                                      deployment.Status.AvailableReplicas,
                                      deployment.Status.Replicas
                                      );
                        }

                        break;
                    }

                case Signal.Timeout:
                    {
                        Log.Warning("{Action} failed - timed out waiting server {ServerId}'s Deployment to become ready.", actionDescription, ServerId);

                        FailCurrentAction(
                            reason: "Timed out waiting for server's associated Deployment in Kubernetes to become available."
                            );

                        Become(Ready);

                        break;
                    }

                default:
                    {
                        Unhandled(signal);

                        break;
                    }
                }
            });
            Receive <DatabaseServer>(_ =>
            {
                Log.Debug("Ignoring DatabaseServer state message (waiting for server's Deployment to become Available).'");
            });
            Receive <Terminated>(
                terminated => HandleTermination(terminated)
                );
        }
Пример #15
0
 /// <summary>
 /// Adds a destroyer to destroy infrastructure from a configuration.
 /// </summary>
 /// <typeparam name="T">The type of configuration the destroyer
 /// destroys.</typeparam>
 /// <param name="destroyer">The destroyer to add.</param>
 protected void AddDestroyer <T>(Provisioner <T> destroyer)
 {
     Add(KnownDestroyers, destroyer);
 }
Пример #16
0
        private static string[] InitAndTweakArgs(string[] args)
        {
            if (args.Length == 0)
            {
                return(args);
            }

            var    position   = Math.Max(Array.IndexOf(args, "-" + ConfigFileShortName), Array.IndexOf(args, "--" + ConfigFileLongName));
            string configFile = null;

            if (position != -1)
            {
                configFile = args[position + 1];
            }

            var pathToFile = configFile ?? Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".PipelinesAgentManager");

            var configFromFileResult = Config.TryCreateFromFile(pathToFile, out var configFromFile);
            var configFromEnv        = Config.CreateFromEnvironment();

            Config[] configsToUse;

            if (configFile.HasValue())
            {
                // if there's a file specified, use only that
                if (configFromFileResult != Config.CreateFromFileResult.Success)
                {
                    throw new Exception($"Could not load file {pathToFile}. Result: {configFromFileResult}");
                }
                if (!configFromFile.IsValid)
                {
                    throw new Exception("Config file has missing fields. Ensure the 3 are set.");
                }

                configsToUse = new[] { configFromFile };
            }
            else
            {
                // use the env vars first, and only the file as backup
                configsToUse = new[] { configFromEnv, configFromFile };
            }

            string terraformToken = null, pipelinesPAT = null, pipelinesOrg = null, defaultWorkspaceId = null;
            int?   defaultPoolId = null;

            foreach (var config in configsToUse)
            {
                terraformToken ??= config.TerraformToken;
                pipelinesPAT ??= config.PipelinesPAT;
                pipelinesOrg ??= config.PipelinesOrg;
                defaultWorkspaceId ??= config.DefaultWorkspace;
                defaultPoolId ??= config.DefaultPoolId;
            }

            if (terraformToken.IsNullOrEmpty() || pipelinesPAT.IsNullOrEmpty() || pipelinesOrg.IsNullOrEmpty())
            {
                var sb = new StringBuilder("Could not retrieve values for: ");

                void addToSb(string value, string name)
                {
                    if (value.IsNullOrEmpty())
                    {
                        sb.Append(name);
                        sb.Append(", ");
                    }
                }

                addToSb(terraformToken, nameof(terraformToken));
                addToSb(pipelinesPAT, nameof(pipelinesPAT));
                addToSb(pipelinesOrg, nameof(pipelinesOrg));

                sb.Length -= 2;

                throw new Exception(sb.ToString());
            }

            Provisioner.Init(terraformToken, pipelinesPAT, pipelinesOrg);

            if (defaultWorkspaceId.HasValue() || defaultPoolId.HasValue)
            {
                var modifiedArgs = args.ToList();
                var verbType     = typeof(Program)
                                   .GetNestedTypes(System.Reflection.BindingFlags.NonPublic)
                                   .Where(t =>
                {
                    var verbAttributes = t.GetCustomAttributes(typeof(VerbAttribute), false);
                    return(verbAttributes.Length > 0 &&
                           verbAttributes[0] is VerbAttribute va &&
                           va.Name == args[0]);
                })
                                   .FirstOrDefault();

                if (verbType != null)
                {
                    var validOptions = verbType
                                       .GetMembers()
                                       .Where(m => m.IsDefined(typeof(OptionAttribute), false))
                                       .Select(m => (m.GetCustomAttributes(typeof(OptionAttribute), false)[0] as OptionAttribute).ShortName)
                                       .ToArray();

                    if (defaultWorkspaceId.HasValue() &&
                        validOptions.Contains(TerraformWorkspaceIdShortName.ToString()) &&
                        !args.Contains("-" + TerraformWorkspaceIdShortName) &&
                        !args.Contains("--" + TerraformWorkspaceIdLongName))
                    {
                        modifiedArgs.Add("-" + TerraformWorkspaceIdShortName);
                        modifiedArgs.Add(defaultWorkspaceId);
                    }

                    if (defaultPoolId.HasValue &&
                        validOptions.Contains(PipelinesPoolIdShortName.ToString()) &&
                        !args.Contains("-" + PipelinesPoolIdShortName) &&
                        !args.Contains("--" + PipelinesPoolIdLongName))
                    {
                        modifiedArgs.Add("-" + PipelinesPoolIdShortName);
                        modifiedArgs.Add(defaultPoolId.ToString());
                    }
                }
                args = modifiedArgs.ToArray();
            }

            return(args);
        }
 public DynamoProvisionerTests()
 {
     _provisioner = new Provisioner(CreateLocalStackDb(), "unittest_");
 }
Пример #18
0
 /// <summary>
 /// Adds a provisioner to create infrastructure from a configuration.
 /// </summary>
 /// <typeparam name="T">The type of configuration the provisioner
 /// provisions.</typeparam>
 /// <param name="provisioner">The provisioner to add.</param>
 protected void AddProvisioner <T>(Provisioner <T> provisioner)
 {
     Add(KnownProvisioners, provisioner);
 }
Пример #19
0
 /// <summary>
 /// Adds a provisioner/destroyer to the given dictionary.
 /// </summary>
 /// <typeparam name="T">The type of configuration the provisioner/destroyer
 /// provisions.</typeparam>
 /// <param name="provisioners">The dictionary to add the provisioner/destroyer
 /// to.</param>
 /// <param name="provisioner">The provisioner/destroyer to add.</param>
 private static void Add <T>(IDictionary provisioners, Provisioner <T> provisioner)
 {
     provisioners[typeof(T)] =
         (Action <object, bool>)((item, dryrun) =>
                                 provisioner((T)item, dryrun));
 }