Ejemplo n.º 1
0
        async Task <List <TenantResource> > GetTenants(IOctopusSpaceAsyncRepository repository)
        {
            if (Tenants == null || !Tenants.Any())
            {
                return(new List <TenantResource>());
            }

            var tenantsByName = new List <TenantResource>();

            foreach (var tenantName in Tenants)
            {
                var tenant = await repository.Tenants.FindByName(tenantName).ConfigureAwait(false);

                if (tenant != null)
                {
                    tenantsByName.Add(tenant);
                }
            }

            var missing = Tenants.Except(tenantsByName.Select(e => e.Name), StringComparer.OrdinalIgnoreCase).ToArray();

            var tenantsById = await repository.Tenants.Get(missing).ConfigureAwait(false);

            missing = missing.Except(tenantsById.Select(e => e.Id), StringComparer.OrdinalIgnoreCase).ToArray();

            if (missing.Any())
            {
                throw new ArgumentException(CouldNotFindMessage("tenant", missing));
            }

            return(tenantsById.Concat(tenantsByName).ToList());
        }
Ejemplo n.º 2
0
        List <TenantResource> GetTenants(IOctopusSpaceRepository repository)
        {
            if (Tenants == null || !Tenants.Any())
            {
                return(new List <TenantResource>());
            }
            var tenantsByName = repository.Tenants.FindByNames(Tenants);
            var missing       = Tenants.Except(tenantsByName.Select(e => e.Name), StringComparer.OrdinalIgnoreCase).ToArray();


            var tenantsById = repository.Tenants.Get(missing);

            missing = missing.Except(tenantsById.Select(e => e.Id), StringComparer.OrdinalIgnoreCase).ToArray();

            if (missing.Any())
            {
                throw new ArgumentException(CouldNotFindMessage("tenant", missing));
            }

            return(tenantsById.Concat(tenantsByName).ToList());
        }
Ejemplo n.º 3
0
        List <TenantResource> GetTenants(OctopusRepository repository)
        {
            if (Tenants == null || !Tenants.Any())
            {
                return(new List <TenantResource>());
            }
            var tenantsByName = repository.Tenants.FindByNames(Tenants);
            var missing       = Tenants.Except(tenantsByName.Select(e => e.Name), StringComparer.OrdinalIgnoreCase).ToArray();


            var tenantsById = repository.Tenants.Get(missing);

            missing = missing.Except(tenantsById.Select(e => e.Id), StringComparer.OrdinalIgnoreCase).ToArray();

            if (missing.Any())
            {
                throw new ArgumentException($"Could not find the {"tenant" + (missing.Length == 1 ? "" : "s")} {string.Join(", ", missing)} on the Octopus server.");
            }

            return(tenantsById.Concat(tenantsByName).ToList());
        }
Ejemplo n.º 4
0
        public IEnumerable <ValidationResult> Validate(ValidationContext validationContext)
        {
            if (Tenants == null || Tenants.Count == 0)
            {
                yield return(new ValidationResult("There must be at least 1 tenant"));
            }
            else if (Tenants.Count(c => c.IsAdult && c.IsLeadTenant) < 1)
            {
                yield return(new ValidationResult("There must be at least 1 lead adult tenant"));
            }

            if (Tenants.Any(c => c.IsAdult && (c.Contacts == null || c.Contacts.Count < 1)))
            {
                yield return(new ValidationResult("All tenants must have at least one contact"));
            }

            if (Tenants.Any(c => c.IsAdult && (c.Addresses == null || c.Addresses.Count < 1)))
            {
                yield return(new ValidationResult("All tenants must have at least one previous address"));
            }

            foreach (var tenantViewModel in Tenants)
            {
                if (tenantViewModel.IsAdult)
                {
                    var start = DateTime.Now.Date.StartOfMonth();
                    foreach (var tenantAddressViewModel in tenantViewModel.Addresses)
                    {
                        start = start.Date.AddYears(tenantAddressViewModel.YearsAtAddress * -1).AddMonths(tenantAddressViewModel.MonthsAtAddress * -1);
                    }

                    if (start > DateTime.Now.Date.StartOfMonth().AddYears(-3))
                    {
                        yield return(new ValidationResult("Each tenant must supply at least 3 years address details"));
                    }
                }
            }
        }
Ejemplo n.º 5
0
        private async Task <List <TenantResource> > GetTenants(ProjectResource project, string environmentName, ReleaseResource release,
                                                               DeploymentTemplateResource releaseTemplate)
        {
            if (!Tenants.Any() && !TenantTags.Any())
            {
                return(new List <TenantResource>());
            }

            var deployableTenants = new List <TenantResource>();

            if (Tenants.Contains("*"))
            {
                var tenantPromotions = releaseTemplate.TenantPromotions.Where(
                    tp => tp.PromoteTo.Any(
                        promo => promo.Name.Equals(environmentName, StringComparison.CurrentCultureIgnoreCase))).Select(tp => tp.Id).ToArray();

                var tentats = await Repository.Tenants.Get(tenantPromotions).ConfigureAwait(false);

                deployableTenants.AddRange(tentats);

                Log.Information("Found {NumberOfTenants} Tenants who can deploy {Project:l} {Version:l} to {Environment:l}", deployableTenants.Count, project.Name, release.Version, environmentName);
            }
            else
            {
                if (Tenants.Any())
                {
                    var tenantsByName = await Repository.Tenants.FindByNames(Tenants).ConfigureAwait(false);

                    var missing = tenantsByName == null || !tenantsByName.Any()
                        ? Tenants.ToArray()
                        : Tenants.Except(tenantsByName.Select(e => e.Name), StringComparer.OrdinalIgnoreCase).ToArray();

                    var tenantsById = await Repository.Tenants.Get(missing).ConfigureAwait(false);

                    missing = tenantsById == null || !tenantsById.Any()
                        ? missing
                        : missing.Except(tenantsById.Select(e => e.Id), StringComparer.OrdinalIgnoreCase).ToArray();

                    if (missing.Any())
                    {
                        throw new ArgumentException(
                                  $"Could not find the {"tenant" + (missing.Length == 1 ? "" : "s")} {string.Join(", ", missing)} on the Octopus server.");
                    }

                    deployableTenants.AddRange(tenantsByName);
                    deployableTenants.AddRange(tenantsById);

                    var unDeployableTenants =
                        deployableTenants.Where(dt => !dt.ProjectEnvironments.ContainsKey(project.Id))
                        .Select(dt => $"'{dt.Name}'")
                        .ToList();
                    if (unDeployableTenants.Any())
                    {
                        throw new CommandException(
                                  string.Format(
                                      "Release '{0}' of project '{1}' cannot be deployed for tenant{2} {3}. This may be because either a) {4} not connected to this project, or b) you do not have permission to deploy {5} to this project.",
                                      release.Version,
                                      project.Name,
                                      unDeployableTenants.Count == 1 ? "" : "s",
                                      string.Join(" or ", unDeployableTenants),
                                      unDeployableTenants.Count == 1 ? "it is" : "they are",
                                      unDeployableTenants.Count == 1 ? "it" : "them"));
                    }

                    unDeployableTenants = deployableTenants.Where(dt =>
                    {
                        var tenantPromo = releaseTemplate.TenantPromotions.FirstOrDefault(tp => tp.Id == dt.Id);
                        return(tenantPromo == null ||
                               !tenantPromo.PromoteTo.Any(
                                   tdt => tdt.Name.Equals(environmentName, StringComparison.CurrentCultureIgnoreCase)));
                    }).Select(dt => $"'{dt.Name}'").ToList();
                    if (unDeployableTenants.Any())
                    {
                        throw new CommandException(
                                  string.Format(
                                      "Release '{0}' of project '{1}' cannot be deployed for tenant{2} {3} to environment '{4}'. This may be because a) the tenant{2} {5} not connected to this environment, a) the environment does not exist or is misspelled, b) The lifecycle has not reached this phase, possibly due to previous deployment failure,  c) you don't have permission to deploy to this environment, d) the environment is not in the list of environments defined by the lifecycle, or e) {6} unable to deploy to this channel.",
                                      release.Version,
                                      project.Name,
                                      unDeployableTenants.Count == 1 ? "" : "s",
                                      string.Join(" or ", unDeployableTenants),
                                      environmentName,
                                      unDeployableTenants.Count == 1 ? "is" : "are",
                                      unDeployableTenants.Count == 1 ? "it is" : "they are"));
                    }
                }

                if (TenantTags.Any())
                {
                    var tenantsByTag = await Repository.Tenants.FindAll(null, TenantTags.ToArray()).ConfigureAwait(false);

                    var deployableByTag = tenantsByTag.Where(dt =>
                    {
                        var tenantPromo = releaseTemplate.TenantPromotions.FirstOrDefault(tp => tp.Id == dt.Id);
                        return(tenantPromo != null && tenantPromo.PromoteTo.Any(tdt => tdt.Name.Equals(environmentName, StringComparison.CurrentCultureIgnoreCase)));
                    }).Where(tenant => !deployableTenants.Any(deployable => deployable.Id == tenant.Id));
                    deployableTenants.AddRange(deployableByTag);
                }
            }

            if (!deployableTenants.Any())
            {
                throw new CommandException(
                          string.Format(
                              "No tenants are available to be deployed for release '{0}' of project '{1}' to environment '{2}'.  This may be because a) No tenants matched the tags provided b) The tenants that do match are not connected to this project or environment, c) The tenants that do match are not yet able to release to this lifecycle phase, or d) you do not have the appropriate deployment permissions.",
                              release.Version, project.Name, environmentName));
            }


            return(deployableTenants);
        }