示例#1
0
        public async Task Request()
        {
            project = await RepositoryCommonQueries.GetProjectByName(ProjectName).ConfigureAwait(false);

            releaseTask = RepositoryCommonQueries.GetReleaseByVersion(ReleaseVersionNumber, project, null).ConfigureAwait(false);
            tenants     = await RepositoryCommonQueries.FindTenants(TenantNames, TenantTags).ConfigureAwait(false);

            release = await releaseTask;

            foreach (var environmentName in EnvironmentNames)
            {
                environment = await RepositoryCommonQueries.GetEnvironmentByName(environmentName).ConfigureAwait(false);

                if (!tenants.Any())
                {
                    AddOverrideForEnvironment(project, environment, release);
                }
                else
                {
                    foreach (var tenant in tenants)
                    {
                        AddOverrideForTenant(project, environment, tenant, release);
                    }
                }
            }

            await Repository.Projects.Modify(project).ConfigureAwait(false);
        }
        async Task <OctopusJiraPayloadData> PrepareOctopusJiraPayload(string eventType,
                                                                      string serverUri,
                                                                      DeploymentResource deployment,
                                                                      IJiraApiDeployment jiraApiDeployment,
                                                                      CancellationToken cancellationToken,
                                                                      EnvironmentResource deploymentEnvironment,
                                                                      DeploymentEnvironmentSettingsMetadataProvider.JiraDeploymentEnvironmentSettings
                                                                      environmentSettings)
        {
            var project = (await mediator.Request(new GetProjectRequest(deployment.ProjectId), cancellationToken)).Project;

            var release    = (await mediator.Request(new GetReleaseRequest(deployment.ReleaseId), cancellationToken)).Release;
            var serverTask = (await mediator.Request(new GetServerTaskRequest(deployment.TaskId), cancellationToken)).Task;

            TenantResource?tenant = null;

            if (deployment.TenantId?.Value is not null)
            {
                tenant = (await mediator.Request(new GetTenantByIdOrNameRequest(deployment.TenantId.Value.ToTenantIdOrName()), cancellationToken)).Resource;
            }

            return(new OctopusJiraPayloadData
            {
                InstallationId = installationIdProvider.GetInstallationId().ToString(),
                BaseHostUrl = store.GetBaseUrl() ?? string.Empty,
                DeploymentsInfo = new JiraPayloadData
                {
                    Deployments = new[]
示例#3
0
        /// <summary>
        /// Get the DeploymentResource at the input environment of specific release version.
        /// If the version is not specified, it will return the last deployment at the input environment
        /// </summary>
        /// <param name="env"></param>
        /// <param name="releaseResource"></param>
        /// <returns></returns>
        public DeploymentResource GetDeployment(EnvironmentResource env, ReleaseResource releaseResource = null)
        {
            if (releaseResource != null)
            {
                return(GetAllDeployment(releaseResource).FirstOrDefault(deployment => deployment.EnvironmentId
                                                                        == env.Id));
            }

            DeploymentResource lastDeployment = null;

            foreach (var release in GetAllReleases().Take(int.Parse(ConfigurationManager
                                                                    .AppSettings["ReleasesSelectionRange"])))
            {
                var deploy = GetAllDeployment(release).FirstOrDefault(deployment => deployment.EnvironmentId == env.Id);
                if (deploy == null)
                {
                    continue;
                }
                if (lastDeployment == null)
                {
                    lastDeployment = deploy;
                }
                if (deploy.Created > lastDeployment.Created)
                {
                    lastDeployment = deploy;
                }
            }
            return(lastDeployment);
        }
示例#4
0
        public async Task Request()
        {
            project = await Repository.Projects.FindByNameOrIdOrFail(ProjectNameOrId).ConfigureAwait(false);

            environment = await Repository.Environments.FindByNameOrIdOrFail(FromEnvironmentNameOrId).ConfigureAwait(false);

            var dashboard = await Repository.Dashboards.GetDynamicDashboard(new[] { project.Id }, new[] { environment.Id }).ConfigureAwait(false);

            var dashboardItem = dashboard.Items.Where(e => e.EnvironmentId == environment.Id && e.ProjectId == project.Id)
                                .OrderByDescending(i => SemanticVersion.Parse(i.ReleaseVersion))
                                .FirstOrDefault();

            if (dashboardItem == null)
            {
                throw new CouldNotFindException("latest deployment of the project for this environment. Please check that a deployment for this project/environment exists on the dashboard.");
            }

            commandOutputProvider.Debug("Finding release details for release {Version:l}", dashboardItem.ReleaseVersion);

            release = await Repository.Projects.GetReleaseByVersion(project, dashboardItem.ReleaseVersion).ConfigureAwait(false);

            if (UpdateVariableSnapshot)
            {
                commandOutputProvider.Debug("Updating the release variable snapshot with variables from the project");
                await Repository.Releases.SnapshotVariables(release).ConfigureAwait(false);
            }

            await DeployRelease(project, release).ConfigureAwait(false);
        }
示例#5
0
        private void CleanUpEnvironment(List <MachineResource> filteredMachines, EnvironmentResource environmentResource)
        {
            Log.Information("Found {MachineCount} machines in {Environment:l} with the status {Status:l}", filteredMachines.Count, environmentResource.Name, GetStateFilterDescription());

            if (filteredMachines.Any(m => m.EnvironmentIds.Count > 1))
            {
                Log.Information("Note: Some of these machines belong to multiple environments. Instead of being deleted, these machines will be removed from the {Environment:l} environment.", environmentResource.Name);
            }

            foreach (var machine in filteredMachines)
            {
                // If the machine belongs to more than one environment, we should remove the machine from the environment rather than delete it altogether.
                if (machine.EnvironmentIds.Count > 1)
                {
                    Log.Information("Removing {Machine:l} {Status} (ID: {Id:l}) from {Environment:l}", machine.Name, machine.Status, machine.Id,
                                    environmentResource.Name);
                    machine.EnvironmentIds.Remove(environmentResource.Id);
                    Repository.Machines.Modify(machine);
                }
                else
                {
                    Log.Information("Deleting {Machine:l} {Status} (ID: {Id:l})", machine.Name, machine.Status, machine.Id);
                    Repository.Machines.Delete(machine);
                }
            }
        }
示例#6
0
        private EnvironmentResource[] CreateEnvironments(int prefix, IReadOnlyList <MachineResource> machines)
        {
            var envs = new EnvironmentResource[EnvironmentsPerGroup.Get()];

            Enumerable.Range(1, envs.Length)
            .AsParallel()
            .ForAll(e =>
            {
                var name    = $"Env-{prefix:000}-{e}";
                var envRes  = Repository.Environments.FindByName(name);
                envs[e - 1] = envRes ?? Repository.Environments.Create(new EnvironmentResource()
                {
                    Name = name
                });
            });

            lock (this)
            {
                foreach (var env in envs)
                {
                    if (machines.Any())
                    {
                        var machine = machines[Program.Rnd.Next(0, machines.Count)];
                        Repository.Machines.Refresh(machine);
                        machine.EnvironmentIds.Add(env.Id);
                        Repository.Machines.Modify(machine);
                    }
                }
            }
            return(envs);
        }
        protected override void ProcessRecord()
        {
            object baseresource = null;

            switch (Resource)
            {
            case "Environment":
                baseresource = new EnvironmentResource();
                break;

            case "Project":
                baseresource = new ProjectResource();
                break;

            case "ProjectGroup":
                baseresource = new ProjectGroupResource();
                break;

            case "NugetFeed":
            case "ExternalFeed":
                baseresource = new NuGetFeedResource();
                break;

            case "LibraryVariableSet":
                baseresource = new LibraryVariableSetResource();
                break;

            case "Machine":
            case "Target":
                baseresource = new MachineResource();
                break;

            case "Lifecycle":
                baseresource = new LifecycleResource();
                break;

            case "Team":
                baseresource = new TeamResource();
                break;

            case "User":
                baseresource = new UserResource();
                break;

            case "Channel":
                baseresource = new ChannelResource();
                break;

            case "Tenant":
                baseresource = new TenantResource();
                break;

            case "TagSet":
                baseresource = new TagSetResource();
                break;
            }

            WriteObject(baseresource);
        }
示例#8
0
 public static DeploymentEnvironment ToDeploymentEnvironment(this EnvironmentResource environment)
 {
     return(new DeploymentEnvironment
     {
         EnvironmentId = environment.Id,
         Name = environment.Name,
     });
 }
示例#9
0
        public async Task <IActionResult> SyncReleaseBatch([FromRoute] string idOrName, [FromBody] string environmentIdOrName = null)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var releaseBatch = await GetReleaseBatch(idOrName, true, false);

            if (releaseBatch == null)
            {
                return(NotFound());
            }

            if (releaseBatch.IsLocked)
            {
                return(GetLockedForbiddenUpdateResult(releaseBatch));
            }

            if (releaseBatch.Items != null && releaseBatch.Items.Any())
            {
                EnvironmentResource environment = null;
                if (!String.IsNullOrEmpty(environmentIdOrName))
                {
                    environment = await _octopusProxy.GetEnvironmentAsync(environmentIdOrName);

                    if (environment == null)
                    {
                        return(BadRequest("Environment Not Found"));
                    }
                }

                foreach (var releaseBatchItem in releaseBatch.Items)
                {
                    var releaseResource =
                        await
                            (environment == null
                            ? _octopusProxy.GetLatestReleaseAsync(releaseBatchItem.ProjectId)
                            : _octopusProxy.GetLatestDeployedReleaseAsync(releaseBatchItem.ProjectId, environment.Id));
                    releaseBatchItem.ReleaseId      = releaseResource?.Id;
                    releaseBatchItem.ReleaseVersion = releaseResource?.Version;

                    var projectResource = await _octopusProxy.GetProjectAsync(releaseBatchItem.ProjectId);

                    releaseBatchItem.ProjectName = projectResource.Name;
                    releaseBatchItem.ProjectSlug = projectResource.Slug;
                }

                releaseBatch.SyncDateTime        = DateTimeOffset.Now;
                releaseBatch.SyncEnvironmentId   = environment?.Id;
                releaseBatch.SyncEnvironmentName = environment?.Name ?? "(Latest)";
                releaseBatch.SyncUserName        = User.Identity.Name;
            }

            await _context.SaveChangesAsync();

            return(Ok(releaseBatch));
        }
示例#10
0
        public void SetUp()
        {
            createAutoDeployOverrideCommand = new CreateAutoDeployOverrideCommand(RepositoryFactory, FileSystem, ClientFactory, CommandOutputProvider);

            environment = new EnvironmentResource {
                Name = "Production", Id = "Environments-001"
            };
            project       = new ProjectResource("Projects-1", "OctoFx", "OctoFx");
            release       = new ReleaseResource("1.2.0", "Projects-1", "Channels-1");
            release2      = new ReleaseResource("somedockertag", "Projects-1", "Channels-1");
            octopusTenant = new TenantResource
            {
                Id   = "Tenants-1",
                Name = "Octopus",
                ProjectEnvironments = { ["Projects-1"] = new ReferenceCollection("Environments-001") }
            };

            Repository.Environments.FindByName("Production")
            .Returns(
                environment
                );

            Repository.Projects.FindByName("OctoFx")
            .Returns(
                project
                );

            Repository.Projects.GetReleaseByVersion(Arg.Any <ProjectResource>(), "1.2.0")
            .Returns(
                release
                );

            Repository.Projects.GetReleaseByVersion(Arg.Any <ProjectResource>(), "somedockertag")
            .Returns(
                release2
                );

            Repository.Tenants.FindByNames(Arg.Any <IEnumerable <string> >())
            .Returns(
                new List <TenantResource>
            {
                octopusTenant
            }
                );
            Repository.Tenants.FindAll(null, Arg.Any <string[]>())
            .Returns(
                new List <TenantResource>
            {
                octopusTenant
            }
                );

            Repository.Projects.When(x => x.Modify(Arg.Any <ProjectResource>()))
            .Do(x => savedProject = x.Args()[0] as ProjectResource);
        }
示例#11
0
        public async Task <Environment> CreateEnvironment(string name, string description)
        {
            var env = new EnvironmentResource {
                Name        = name,
                Description = description
            };

            env = await client.Repository.Environments.Create(env);

            return(ConvertEnvironment(env));
        }
示例#12
0
        public void Initialize()
        {
            _octopus = new OctopusRepository(new OctopusServerEndpoint(_serverAddress, _apiKey));

            // Get Production Environment
            _prodEnv = _octopus.Environments.FindByName(_environmentName);
            if (_prodEnv == null)
            {
                _logger.WriteError($"Could not find environment '{_environmentName}'");
            }
        }
        /// <summary>
        /// Creates an Environment
        /// </summary>
        /// <param name="octRepository">The repository to call against.</param>
        /// <param name="name">Name of the new Environment.</param>
        /// <param name="description">Description of the new Environment.</param>
        /// <param name="guidedFailure">Auto Enable GuidedFailure on Environment.</param>
        /// <returns>EnvironmentResource.</returns>
        public static EnvironmentResource CreateEnvironment(OctopusRepository octRepository, string name, string description, bool guidedFailure)
        {
            var environmentToCreate = new EnvironmentResource()
            {
                Name             = name,
                UseGuidedFailure = guidedFailure,
                Description      = description
            };

            return(octRepository.Environments.Create(environmentToCreate));
        }
示例#14
0
 /// <summary>
 /// Promote Release from one environment to another. If the releaseVersion is not specified.
 /// The release has the latest deployment at sourceEnv will be chosen to deploy to the targetEnv.
 /// Skip creating the deployment if there is no release at the input Env
 /// </summary>
 /// <param name="project"></param>
 /// <param name="sourceEnv"></param>
 /// <param name="settings"></param>
 /// <returns></returns>
 public static DeploymentResource PromoteRelease(OctoProject project, EnvironmentResource sourceEnv,
                                                 SingleReleasePromotingSettings settings)
 {
     if (settings.Release == null)
     {
         var releaseRepo  = WebClient.GetWebClientRef().GetReleaseRepo();
         var sourceDeploy = project.GetDeployment(sourceEnv);
         settings.Release = sourceDeploy == null ? null : releaseRepo.Get(sourceDeploy.ReleaseId);
     }
     return(settings.Release == null ? null : CreateDeployment(project, settings.Release,
                                                               new SingleProjectDeploymentSettings(settings)));
 }
        /// <summary>
        /// Builds a base deployment with all steps enabled for the passed environment and release.
        /// </summary>
        /// <param name="release">Release to deploy.</param>
        /// <param name="environment">Environment to deploy to.</param>
        /// <param name="comment">Comment for the deployment.</param>
        /// <param name="guidedFailure">Enable Guided Failure.</param>
        /// <returns>DeploymentResource</returns>
        public static DeploymentResource BuildDeployment(ReleaseResource release, EnvironmentResource environment, string comment, bool guidedFailure)
        {
            var deploymentResource = new DeploymentResource
            {
                EnvironmentId            = environment.Id,
                ReleaseId                = release.Id,
                ForcePackageDownload     = false,
                UseGuidedFailure         = guidedFailure,
                ForcePackageRedeployment = true,
                Comments = comment
            };

            return(deploymentResource);
        }
示例#16
0
        public async Task JsonOutput_ShouldBeWellFormed()
        {
            var environmentResource = new EnvironmentResource {
                Name = "Development", Id = "Environments-001"
            };

            Repository.Environments.FindByName("Development").Returns(environmentResource);

            CommandLineArgs.Add("--outputFormat=json");
            CommandLineArgs.Add($"--environment={environmentResource.Name}");
            CommandLineArgs.Add("-status=Offline");

            var machineList = new List <MachineResource>
            {
                new MachineResource
                {
                    Name           = "PC01466",
                    Id             = "Machines-002",
                    Status         = MachineModelStatus.Offline,
                    EnvironmentIds = new ReferenceCollection(new[] { "Environments-001", "Environments-002" })
                },
                new MachineResource
                {
                    Name           = "PC01996",
                    Id             = "Machines-003",
                    Status         = MachineModelStatus.Offline,
                    EnvironmentIds = new ReferenceCollection("Environments-001")
                }
            };

            Repository.Machines.FindMany(Arg.Any <Func <MachineResource, bool> >()).Returns(machineList);

            await listMachinesCommand.Execute(CommandLineArgs.ToArray()).ConfigureAwait(false);

            var logoutput = LogOutput.ToString();

            Console.WriteLine(logoutput);
            JsonConvert.DeserializeObject(logoutput);
            Regex.Matches(logoutput, CleanEnvironmentCommand.MachineAction.Deleted.ToString())
            .Count.Should()
            .Be(1, "should only have one deleted machine");
            Regex.Matches(logoutput, CleanEnvironmentCommand.MachineAction.RemovedFromEnvironment.ToString())
            .Count.Should()
            .Be(1, "should only have one machine removed from the environment");
            logoutput.Should().Contain(machineList[0].Name);
            logoutput.Should().Contain(machineList[0].Id);
            logoutput.Should().Contain(machineList[1].Name);
            logoutput.Should().Contain(machineList[1].Id);
        }
        public void TestFetchResponse()
        {
            var twilioRestClient = Substitute.For <ITwilioRestClient>();

            twilioRestClient.AccountSid.Returns("ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            twilioRestClient.Request(Arg.Any <Request>())
            .Returns(new Response(
                         System.Net.HttpStatusCode.OK,
                         "{\"sid\": \"ZE00000000000000000000000000000000\",\"account_sid\": \"ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\"service_sid\": \"ZS00000000000000000000000000000000\",\"build_sid\": \"ZB00000000000000000000000000000000\",\"unique_name\": \"testing-environment\",\"domain_suffix\": \"testing\",\"domain_name\": \"foobar-1234-testing.twil.io\",\"date_created\": \"2018-11-10T20:00:00Z\",\"date_updated\": \"2018-11-10T20:00:00Z\",\"url\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments/ZE00000000000000000000000000000000\",\"links\": {\"variables\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments/ZE00000000000000000000000000000000/Variables\",\"deployments\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments/ZE00000000000000000000000000000000/Deployments\",\"logs\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments/ZE00000000000000000000000000000000/Logs\"}}"
                         ));

            var response = EnvironmentResource.Fetch("ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ZEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", client: twilioRestClient);

            Assert.NotNull(response);
        }
        public void TestReadEmptyResponse()
        {
            var twilioRestClient = Substitute.For <ITwilioRestClient>();

            twilioRestClient.AccountSid.Returns("ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            twilioRestClient.Request(Arg.Any <Request>())
            .Returns(new Response(
                         System.Net.HttpStatusCode.OK,
                         "{\"environments\": [],\"meta\": {\"first_page_url\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments?PageSize=50&Page=0\",\"key\": \"environments\",\"next_page_url\": null,\"page\": 0,\"page_size\": 50,\"previous_page_url\": null,\"url\": \"https://serverless.twilio.com/v1/Services/ZS00000000000000000000000000000000/Environments?PageSize=50&Page=0\"}}"
                         ));

            var response = EnvironmentResource.Read("ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", client: twilioRestClient);

            Assert.NotNull(response);
        }
示例#19
0
        private void DeleteOverrideForEnvironment(ProjectResource project, EnvironmentResource environment)
        {
            var autoDeployOverride = project.AutoDeployReleaseOverrides.SingleOrDefault(
                o => o.EnvironmentId == environment.Id && o.TenantId == null);

            if (autoDeployOverride == null)
            {
                Log.Warning("Did not find an auto deploy override for the project {Project:l} and environment {Environment:l}", project.Name, environment.Name);
            }
            else
            {
                project.AutoDeployReleaseOverrides.Remove(autoDeployOverride);
                Log.Information("Deleted auto deploy release override for the project {Project:l} to the environment {Environment:l}", project.Name, environment.Name);
            }
        }
        public void TestDeleteResponse()
        {
            var twilioRestClient = Substitute.For <ITwilioRestClient>();

            twilioRestClient.AccountSid.Returns("ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
            twilioRestClient.Request(Arg.Any <Request>())
            .Returns(new Response(
                         System.Net.HttpStatusCode.NoContent,
                         "null"
                         ));

            var response = EnvironmentResource.Delete("ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ZEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", client: twilioRestClient);

            Assert.NotNull(response);
        }
示例#21
0
        public void CreateAndRemoveEnvironment()
        {
            #region EnvironmentCreate

            var resource = new EnvironmentResource {
                Name = TestResourceName
            };

            var createParameters = new List <CmdletParameter>
            {
                new CmdletParameter()
                {
                    Name     = "Resource",
                    Resource = resource
                }
            };

            var createPowershell = new CmdletRunspace().CreatePowershellcmdlet(CreateCmdletName, CreateCmdletType, createParameters);

            //The fact that the line below doesn't throw is enough to prove that the cmdlet returns the expected object type really. Couldn't figure out a way to make the assert around the Powershell.invoke call
            var createResult = createPowershell.Invoke <EnvironmentResource>().FirstOrDefault();

            if (createResult != null)
            {
                Assert.AreEqual(createResult.Name, TestResourceName);
                Console.WriteLine("Created resource [{0}] of type [{1}]", createResult.Name, createResult.GetType());
            }

            #endregion

            #region EnvironmentDelete
            var removeParameters = new List <CmdletParameter>
            {
                new CmdletParameter()
                {
                    Name     = "Resource",
                    Resource = createResult
                }
            };

            var removePowershell = new CmdletRunspace().CreatePowershellcmdlet(RemoveCmdletName, RemoveCmdletType);

            var removeResult = removePowershell.Invoke <bool>(removeParameters).FirstOrDefault();

            Assert.IsTrue(removeResult);
            Console.WriteLine("Deleted resource [{0}] of type [{1}]", createResult.Name, createResult.GetType());
            #endregion
        }
        void AddOverrideForTenant(ProjectResource project, EnvironmentResource environment, TenantResource tenant, ReleaseResource release)
        {
            if (!tenant.ProjectEnvironments.ContainsKey(project.Id))
            {
                Log.Warning("The tenant {Tenant:l} was skipped because it has not been connected to the project {Project:l}", tenant.Name, project.Name);
                return;
            }
            if (!tenant.ProjectEnvironments[project.Id].Contains(environment.Id))
            {
                Log.Warning("The tenant {Tenant:l} was skipped because it has not been connected to the environment {Environment:l}", tenant.Name, environment.Name);
                return;
            }

            project.AddAutoDeployReleaseOverride(environment, tenant, release);
            Log.Information("Auto deploy will deploy version {Version:l} of the project {Project:l} to the environment {Environment:l} for the tenant {Tenant:l}", release.Version, project.Name, environment.Name, tenant.Name);
        }
示例#23
0
        private static void CreateAccount(EnvironmentResource environment, string accountName, xAccountType accountType)
        {
            var accountExists = _repository.Accounts.FindByName(accountName).Result;

            AccountResource account = null;

            switch (accountType)
            {
            case xAccountType.SSH:

                account = new SshKeyPairAccountResource()
                {
                    Id             = accountExists?.Id,
                    Name           = accountName,
                    EnvironmentIds = new ReferenceCollection(environment.Id),
                    PrivateKeyFile = new SensitiveValue()
                    {
                        HasValue = true, NewValue = "stuff"
                    },
                    Description = GeneralResourceProperty.ResourceDescription,
                    Username    = "******",
                    Links       = accountExists?.Links
                };
                break;

            default:
                break;
            }

            try
            {
                Log.Information($"Creating/Modifying Account [{account.Name}]");
                if (account.Id == null)
                {
                    _repository.Accounts.Create(account).Wait();
                }
                else
                {
                    _repository.Accounts.Modify(account).Wait();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
示例#24
0
        private EnvironmentResource[] CreateEnvironments(int prefix)
        {
            var envs = new EnvironmentResource[EnvironmentsPerGroup.Get()];

            Enumerable.Range(1, envs.Length)
            .AsParallel()
            .ForAll(e =>
            {
                var name    = $"Env-{prefix:000}-{e}";
                var envRes  = Repository.Environments.FindByName(name);
                envs[e - 1] = envRes ?? Repository.Environments.Create(new EnvironmentResource()
                {
                    Name = name
                });
            });
            return(envs);
        }
        public async Task Request()
        {
            if (string.IsNullOrWhiteSpace(environmentName))
            {
                throw new CommandException("Please specify an environment name using the parameter: --environment=XYZ");
            }
            if (!healthStatuses.Any() && !statuses.Any())
            {
                throw new CommandException("Please specify a status using the parameter: --status or --health-status");
            }

            environmentResource = await GetEnvironment().ConfigureAwait(false);

            machines = await FilterByEnvironment(environmentResource).ConfigureAwait(false);

            machines = await FilterByState(machines);

            await CleanUpEnvironment(machines.ToList(), environmentResource);
        }
        void DeleteOverrideForEnvironment(ProjectResource project, EnvironmentResource environment)
        {
            var autoDeployOverride = project.AutoDeployReleaseOverrides.SingleOrDefault(
                o => o.EnvironmentId == environment.Id && o.TenantId == null);

            if (autoDeployOverride == null)
            {
                deletedDeplomentOverrides.Add(
                    new Tuple <EnvironmentResource, TenantResource, DeletedOutcome>(environment, null, DeletedOutcome.NotFound));
                commandOutputProvider.Warning("Did not find an auto deploy override for the project {Project:l} and environment {Environment:l}", project.Name, environment.Name);
            }
            else
            {
                deletedDeplomentOverrides.Add(
                    new Tuple <EnvironmentResource, TenantResource, DeletedOutcome>(environment, null, DeletedOutcome.Deleted));
                project.AutoDeployReleaseOverrides.Remove(autoDeployOverride);
                commandOutputProvider.Information("Deleted auto deploy release override for the project {Project:l} to the environment {Environment:l}", project.Name, environment.Name);
            }
        }
示例#27
0
        void AddOverrideForTenant(ProjectResource project, EnvironmentResource environment, TenantResource tenant, ReleaseResource release)
        {
            if (!tenant.ProjectEnvironments.ContainsKey(project.Id))
            {
                createdDeploymentOverides.Add(new Tuple <EnvironmentResource, TenantResource, CreatedOutcome>(environment, tenant, CreatedOutcome.NotConnectedToProject));
                commandOutputProvider.Warning("The tenant {Tenant:l} was skipped because it has not been connected to the project {Project:l}", tenant.Name, project.Name);
                return;
            }
            if (!tenant.ProjectEnvironments[project.Id].Contains(environment.Id))
            {
                createdDeploymentOverides.Add(new Tuple <EnvironmentResource, TenantResource, CreatedOutcome>(environment, tenant, CreatedOutcome.NotConnectedToEnvironment));
                commandOutputProvider.Warning("The tenant {Tenant:l} was skipped because it has not been connected to the environment {Environment:l}", tenant.Name, environment.Name);
                return;
            }

            createdDeploymentOverides.Add(new Tuple <EnvironmentResource, TenantResource, CreatedOutcome>(environment, tenant, CreatedOutcome.Created));
            project.AddAutoDeployReleaseOverride(environment, tenant, release);
            commandOutputProvider.Information("Auto deploy will deploy version {Version:l} of the project {Project:l} to the environment {Environment:l} for the tenant {Tenant:l}", release.Version, project.Name, environment.Name, tenant.Name);
        }
        public void TestFetchRequest()
        {
            var twilioRestClient = Substitute.For <ITwilioRestClient>();
            var request          = new Request(
                HttpMethod.Get,
                Twilio.Rest.Domain.Serverless,
                "/v1/Services/ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Environments/ZEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                ""
                );

            twilioRestClient.Request(request).Throws(new ApiException("Server Error, no content"));

            try
            {
                EnvironmentResource.Fetch("ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ZEXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", client: twilioRestClient);
                Assert.Fail("Expected TwilioException to be thrown for 500");
            }
            catch (ApiException) {}
            twilioRestClient.Received().Request(request);
        }
        public void TestCreateRequest()
        {
            var twilioRestClient = Substitute.For <ITwilioRestClient>();
            var request          = new Request(
                HttpMethod.Post,
                Twilio.Rest.Domain.Serverless,
                "/v1/Services/ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Environments",
                ""
                );

            request.AddPostParam("UniqueName", Serialize("unique_name"));
            twilioRestClient.Request(request).Throws(new ApiException("Server Error, no content"));

            try
            {
                EnvironmentResource.Create("ZSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "unique_name", client: twilioRestClient);
                Assert.Fail("Expected TwilioException to be thrown for 500");
            }
            catch (ApiException) {}
            twilioRestClient.Received().Request(request);
        }
        public async Task Request()
        {
            project = await Repository.Projects.FindByNameOrIdOrFail(ProjectNameOrId).ConfigureAwait(false);

            environment = await Repository.Environments.FindByNameOrIdOrFail(FromEnvironmentNameOrId).ConfigureAwait(false);

            var dashboardItemsOptions = UseLatestSuccessfulRelease
                ? DashboardItemsOptions.IncludeCurrentAndPreviousSuccessfulDeployment
                : DashboardItemsOptions.IncludeCurrentDeploymentOnly;

            var dashboard = await Repository.Dashboards.GetDynamicDashboard(new[] { project.Id }, new[] { environment.Id }, dashboardItemsOptions).ConfigureAwait(false);

            var dashboardItems = dashboard.Items
                                 .Where(e => e.EnvironmentId == environment.Id && e.ProjectId == project.Id)
                                 .OrderByDescending(i => SemanticVersion.Parse(i.ReleaseVersion));

            var dashboardItem = UseLatestSuccessfulRelease
                ? dashboardItems.FirstOrDefault(x => x.State == TaskState.Success)
                : dashboardItems.FirstOrDefault();

            if (dashboardItem == null)
            {
                var deploymentType = UseLatestSuccessfulRelease ? "successful " : "";

                throw new CouldNotFindException($"latest {deploymentType}deployment of the project for this environment. Please check that a {deploymentType} deployment for this project/environment exists on the dashboard.");
            }

            commandOutputProvider.Debug("Finding release details for release {Version:l}", dashboardItem.ReleaseVersion);

            release = await Repository.Projects.GetReleaseByVersion(project, dashboardItem.ReleaseVersion).ConfigureAwait(false);

            if (UpdateVariableSnapshot)
            {
                commandOutputProvider.Debug("Updating the release variable snapshot with variables from the project");
                await Repository.Releases.SnapshotVariables(release).ConfigureAwait(false);
            }

            await DeployRelease(project, release).ConfigureAwait(false);
        }