public async Task <IEnumerable <CreatableMachineDto> > Handle(GetCreatableMachinesForAccountQuery request, CancellationToken cancellationToken)
        {
            var account = await _context.Set <Account>()
                          .Include(x => x.LicenseConfig)
                          .Include(x => x.Sites)
                          .FirstOrDefaultAsync(x => !x.IsDeleted && !x.IsTemplate && x.Id == request.Id, cancellationToken);

            if (account == null)
            {
                throw new EntityNotFoundException(nameof(Account), request.Id);
            }

            var machines = await _context.Set <Machine>().Where(x => x.AccountId == account.Id)
                           .ToListAsync(cancellationToken);

            var licenseConfig = account.LicenseConfig;

            var sites = account.Sites;

            var creatableMachines = new List <CreatableMachineDto>();
            var launcherMachine   = machines.FirstOrDefault(x => x.IsLauncher);

            if (launcherMachine == null)
            {
                var site = licenseConfig.InstancePolicy == ServerInstancePolicy.AllInOne
                    ? sites.FirstOrDefault()
                    : null;

                creatableMachines.Add(new CreatableMachineDto()
                {
                    IsLauncher   = true,
                    IsSiteMaster = licenseConfig.InstancePolicy == ServerInstancePolicy.AllInOne,
                    Name         = AccountUtils.GenerateMachineName(account.UrlFriendlyName, licenseConfig.InstancePolicy, "Launcher"),
                    SiteId       = site?.Id,
                    SiteName     = site?.UrlFriendlyName
                });
            }

            if (licenseConfig.InstancePolicy == ServerInstancePolicy.InstancePerSiteMaster)
            {
                foreach (var site in sites)
                {
                    var machine = machines.FirstOrDefault(x => x.SiteName == site.UrlFriendlyName);
                    if (machine == null)
                    {
                        creatableMachines.Add(new CreatableMachineDto()
                        {
                            IsLauncher   = false,
                            IsSiteMaster = true,
                            Name         = AccountUtils.GenerateMachineName(account.UrlFriendlyName, licenseConfig.InstancePolicy, site.UrlFriendlyName),
                            SiteId       = site.Id,
                            SiteName     = site.UrlFriendlyName
                        });
                    }
                }
            }

            return(creatableMachines);
        }
Ejemplo n.º 2
0
        public override async Task <long> Handle(CreateAccountCommand command, CancellationToken cancellationToken)
        {
            var account       = Mapper.Map <Account>(command);
            var machineConfig = account.MachineConfig;

            account.IsActive     = true;
            account.CreationTime = DateTimeOffset.Now;
            account.Creator      = command.User;

            var userTokenKeyPair   = _keysManager.GenerateUserTokenKeyPair(!command.UseUniqueKey);
            var interServerKeyPair = _keysManager.GenerateInterServerKeyPair(!command.UseUniqueKey);
            var licenseKeyPair     = _keysManager.GenerateLicenseKeyPair(!command.UseUniqueKey);

            var apiPassword = StringUtils.GeneratePassword(16);

            account.Keys = new Keys()
            {
                UserTokenPrivate   = userTokenKeyPair.PrivateKey,
                UserTokenPublic    = userTokenKeyPair.PublicKey,
                InterServerPrivate = interServerKeyPair.PrivateKey,
                InterServerPublic  = interServerKeyPair.PublicKey,
                LicensePrivate     = licenseKeyPair.PrivateKey,
                LicensePublic      = licenseKeyPair.PublicKey,
                ApiPassword        = apiPassword,
                AccountFile        = $"{account.UrlFriendlyName}:{apiPassword}".ToBase64(),
                SqlExportPass      = StringUtils.GeneratePassword(24)
            };

            var licenseBytes = LicenseUtils.GenerateLicense(account.LicenseConfig, account.Keys.LicensePrivate);

            account.License = Convert.ToBase64String(licenseBytes);

            var launcherVersion = _versionResolver.Resolve(Softwares.Launcher, command.LauncherVersionMode, command.LauncherHash);

            machineConfig.LauncherHash = launcherVersion?.ToString();

            var reportingVersion = _versionResolver.Resolve(Softwares.Reporting, command.ReportingVersionMode, command.ReportingHash);

            machineConfig.ReportingHash = reportingVersion?.ToString();

            var clientVersion = _versionResolver.Resolve(Softwares.WebClient, command.ClientVersionMode, command.ClientHash);

            machineConfig.ClientHash = clientVersion?.ToString();

            var siteMasterVersion = _versionResolver.Resolve(Softwares.SiteMaster, command.SiteMasterVersionMode, command.SiteMasterHash);

            machineConfig.SiteMasterHash = siteMasterVersion?.ToString();

            var mmaClass = await Context.Set <Class>().Include(x => x.MmaInstances).FirstOrDefaultAsync(x => x.Id == command.ClassId, cancellationToken);

            var deployerVersion = _versionResolver.Resolve(Softwares.Deployer, command.DeployerVersionMode, command.DeployerHash, mmaClass?.MmaInstance?.DeployerVer);

            machineConfig.DeployerHash = deployerVersion?.ToString();

            var pdfExportVersion = _versionResolver.Resolve(Softwares.PdfExport, command.PdfExportVersionMode, command.PdfExportHash);

            machineConfig.PdfExportHash = pdfExportVersion?.ToString();

            var relExportVersion = _versionResolver.Resolve(Softwares.RelationalExport, command.RelExportVersionMode, command.RelExportHash);

            machineConfig.RelExportHash = relExportVersion?.ToString();

            var populateVersion = _versionResolver.Resolve(Softwares.Populate, command.PopulateVersionMode, command.PopulateHash);

            machineConfig.PopulateHash = populateVersion?.ToString();

            var linkwareVersion = _versionResolver.Resolve(Softwares.Linkware, command.LinkwareVersionMode, command.LinkwareHash);

            machineConfig.LinkwareHash = linkwareVersion?.ToString();

            var mainLibraryFiles = _versionResolver.GetLibraryFiles(command.MainLibraryFiles, command.MainLibraryMode, machineConfig.MainLibraryFiles.DeserializeArray <long>());

            machineConfig.MainLibraryFiles = mainLibraryFiles.Serialize();
            machineConfig.MainLibraryFile  = mainLibraryFiles.FirstOrDefault();
            machineConfig.MainLibraryMode  = machineConfig.MainLibraryFiles.Any()
                ? LibraryFileModes.Select : LibraryFileModes.None;

            var accountLibraryFiles = _versionResolver.GetLibraryFiles(command.AccountLibraryFile.HasValue ?
                                                                       new[] { command.AccountLibraryFile.Value } : new long[0],
                                                                       command.AccountLibraryMode,
                                                                       machineConfig.AccountLibraryFile.HasValue ? new[] { machineConfig.AccountLibraryFile.Value } : new long[0]);

            if (accountLibraryFiles.Any())
            {
                machineConfig.AccountLibraryFile = accountLibraryFiles.First();
                machineConfig.AccountLibraryMode = LibraryFileModes.Select;
            }
            else
            {
                machineConfig.AccountLibraryFile = null;
                machineConfig.AccountLibraryMode = LibraryFileModes.None;
            }

            var state = new State()
            {
                Launcher   = launcherVersion.IsNone() ? Versions.None : launcherVersion.Hash,
                Reporting  = reportingVersion.IsNone() ? Versions.None : reportingVersion.Hash,
                PdfExport  = pdfExportVersion.IsNone() ? Versions.None : pdfExportVersion.Hash,
                Client     = clientVersion.IsNone() ? Versions.None : clientVersion.Hash,
                SiteMaster = siteMasterVersion.IsNone() ? Versions.None : siteMasterVersion.Hash,
                Deployer   = deployerVersion.IsNone() ? Versions.None : deployerVersion.Hash,

                RelExport = relExportVersion.IsNone() ? Versions.None : relExportVersion.Hash,
                Populate  = populateVersion.IsNone() ? Versions.None : populateVersion.Hash,

                Linkware = linkwareVersion.IsNone() ? Versions.None : linkwareVersion.Hash,

                LibraryFile        = machineConfig.MainLibraryFile ?? 0,
                LibraryFiles       = machineConfig.MainLibraryFiles,
                AccountLibraryFile = machineConfig.AccountLibraryFile ?? 0,

                Locked            = false,
                Desired           = true,
                SslEnabled        = command.EnableSsl,
                MonitoringEnabled = command.ShowInGrafana
            };

            var baseDomainUrl = "";
            var machine       = new Machine()
            {
                CloudInstanceTypeId = command.CloudInstanceType,
                IsLauncher          = true,
                CreationMailSent    = false,
                LauncherUrl         = $"{(command.EnableSsl ? "https" : "http")}://{account.UrlFriendlyName}.{baseDomainUrl}",
                MailTo   = command.ContactEmail,
                RdpUsers = JsonConvert.SerializeObject(new {}),
                States   = new List <State>()
                {
                    state
                },
                ClassId     = command.ClassId,
                Managed     = command.Managed,
                Region      = command.Region,
                VmImageName = command.VmImageName,
                SampleData  = command.IncludeSampleData,
                Turbo       = true
            };

            account.Machines.Add(machine);

            var serverInstancePolicy = command.InstancePolicy;

            if (serverInstancePolicy == ServerInstancePolicy.AllInOne)
            {
                var site = new Site()
                {
                    Name              = command.SiteMasterName,
                    UrlFriendlyName   = command.SiteMasterUrlFriendlyName,
                    CloudInstanceType = command.CloudInstanceType
                };
                account.Sites.Add(site);

                machine.IsSiteMaster  = true;
                machine.SiteName      = site.UrlFriendlyName;
                machine.SiteMasterUrl = AccountUtils.GenerateSiteMasterUrl(account.UrlFriendlyName, site.UrlFriendlyName, command.EnableSsl);
                machine.Name          = AccountUtils.GenerateMachineName(command.UrlFriendlyName, command.InstancePolicy);

                site.Machine = machine;
            }
            else
            {
                machine.Name = AccountUtils.GenerateMachineName(command.UrlFriendlyName, command.InstancePolicy, "launcher");

                state.SiteMaster = Versions.None;
                state.Linkware   = Versions.None;
                state.Client     = Versions.None;
                state.RelExport  = Versions.None;
            }

            Context.Set <Account>().Add(account);

            await Context.SaveChangesAsync(cancellationToken);

            await Mediator.Publish(new AccountCreatedEvent()
            {
                User    = command.User,
                Account = account,
                Command = command
            }, cancellationToken);

            return(account.Id);
        }
        public override async Task <Unit> Handle(CreateMachineCommand command, CancellationToken cancellationToken)
        {
            var account = await Context.Set <Account>()
                          .Include(x => x.Contact)
                          .Include(x => x.LicenseConfig)
                          .Include(x => x.MachineConfig)
                          .Include(x => x.Sites)
                          .FirstOrDefaultAsync(x => !x.IsDeleted && !x.IsTemplate && x.Id == command.AccountId, cancellationToken);

            if (account == null)
            {
                throw new EntityNotFoundException(nameof(Account), command.AccountId);
            }

            var machines = await Context.Set <Machine>().Where(x => x.AccountId == account.Id)
                           .ToListAsync(cancellationToken);

            if (command.IsLauncher)
            {
                var launcherMachine = machines.FirstOrDefault(x => x.IsLauncher);
                if (launcherMachine != null)
                {
                    throw new CommandException();
                }
            }

            Site site = null;

            if (command.SiteId.HasValue)
            {
                site = account.Sites.FirstOrDefault(x => x.Id == command.SiteId);
                if (site == null)
                {
                    throw new CommandException();
                }

                var siteMachine = machines.FirstOrDefault(x => x.SiteName == site.UrlFriendlyName);
                if (siteMachine != null)
                {
                    throw new CommandException();
                }
            }

            var machineConfig = account.MachineConfig;
            var newState      = new State()
            {
                Launcher  = command.IsLauncher ? machineConfig.LauncherHash : Versions.None,
                PdfExport = command.IsLauncher ? machineConfig.PdfExportHash : Versions.None,
                Reporting = command.IsLauncher ? machineConfig.ReportingHash : Versions.None,

                Client     = machineConfig.ClientHash,
                SiteMaster = machineConfig.SiteMasterHash,
                RelExport  = machineConfig.RelExportHash,

                Deployer           = machineConfig.DeployerHash,
                Populate           = machineConfig.PopulateHash,
                LibraryFile        = machineConfig.MainLibraryFile ?? 0,
                LibraryFiles       = machineConfig.MainLibraryFiles,
                AccountLibraryFile = machineConfig.AccountLibraryFile ?? 0,

                Locked     = false,
                Desired    = true,
                SslEnabled = machineConfig.EnableSsl,
            };

            var machine = new Machine()
            {
                Name                = AccountUtils.GenerateMachineName(account.UrlFriendlyName, account.LicenseConfig.InstancePolicy),
                Account             = account,
                CloudInstanceTypeId = account.LicenseConfig.CloudInstanceType,
                IsLauncher          = command.IsLauncher,
                IsSiteMaster        = command.SiteId.HasValue,
                CreationMailSent    = false,
                MailTo              = account.Contact.Email,
                RdpUsers            = JsonConvert.SerializeObject(new { }),
                ClassId             = account.ClassId,
                Managed             = account.Managed,
                Region              = machineConfig.Region,
                VmImageName         = machineConfig.VmImageName,
                SiteName            = site?.UrlFriendlyName,
                SiteMasterUrl       = site == null ? null : AccountUtils.GenerateSiteMasterUrl(account.UrlFriendlyName, site.UrlFriendlyName, account.MachineConfig.EnableSsl),
                States              = new List <State>()
                {
                    newState
                },
                SampleData = machineConfig.IncludeSampleData
            };

            if (site != null)
            {
                site.Machine = machine;
            }

            Context.Set <Machine>().Add(machine);

            await Context.SaveChangesAsync(cancellationToken);

            return(Unit.Value);
        }