Esempio n. 1
0
        public void Fail_ProcessRecord()
        {
            // Setup
            var workingFolder      = Fakes.RandomString();
            var deploymentFilePath = Fakes.RandomString();
            var serverInstance     = Fakes.RandomString();
            var catalog            = Fakes.RandomString();
            var folder             = Fakes.RandomString();
            var projectName        = Fakes.RandomString();
            var projectPassword    = Fakes.RandomString();
            var eraseSensitiveInfo = Fakes.RandomBool();

            IDeployArguments deployArguments = null;

            _deployerMock.Setup(d => d.Deploy(It.IsAny <IDeployArguments>())).Throws(new Exception("TEST"));

            // Execute
            var powershellCmd = new SsisDeployPowershell
            {
                DeploymentFilePath = deploymentFilePath,
                Folder             = folder,
                Catalog            = catalog,
                ServerInstance     = serverInstance,
                ProjectName        = projectName,
                EraseSensitiveInfo = eraseSensitiveInfo,
                ProjectPassword    = projectPassword
            };

            // Execute
            var exception = Record.Exception(() => powershellCmd.ProcessRecordInternal(_deployerMock.Object, workingFolder));

            Assert.NotNull(exception);
            Assert.IsType <Exception>(exception);
            Assert.Equal("TEST", exception.Message);
        }
Esempio n. 2
0
        public void Pass_MainInternal()
        {
            // Setup
            var args = new[]
            {
                Fakes.RandomString(),
                $"-{nameof(DeployArguments.ServerInstance)}", Fakes.RandomString(),
                $"-{nameof(DeployArguments.Catalog)}", Fakes.RandomString(),
                $"-{nameof(DeployArguments.ProjectName)}", Fakes.RandomString(),
                $"-{nameof(DeployArguments.Folder)}", Fakes.RandomString(),
                $"-{nameof(DeployArguments.ProjectPassword)}", Fakes.RandomString(),
                $"-{nameof(DeployArguments.EraseSensitiveInfo)}"
            };

            IDeployArguments deployArguments = null;

            _deployerMock.Setup(d => d.Deploy(It.IsAny <IDeployArguments>())).Callback((IDeployArguments da) => deployArguments = da);

            // Execute
            Program.MainInternal(_deployerMock.Object, args);

            // Assert
            Assert.NotNull(deployArguments);
            Assert.Equal(Environment.CurrentDirectory, deployArguments.WorkingFolder);
            Assert.Equal(args[0], deployArguments.DeploymentFilePath);
            Assert.Equal(args[2], deployArguments.ServerInstance);
            Assert.Equal(args[4], deployArguments.Catalog);
            Assert.Equal(args[6], deployArguments.ProjectName);
            Assert.Equal(args[8], deployArguments.Folder);
            Assert.Equal(args[10], deployArguments.ProjectPassword);
            Assert.True(deployArguments.EraseSensitiveInfo);
        }
Esempio n. 3
0
        public void Pass_ProcessRecord()
        {
            // Setup
            var workingFolder      = Fakes.RandomString();
            var deploymentFilePath = Fakes.RandomString();
            var serverInstance     = Fakes.RandomString();
            var catalog            = Fakes.RandomString();
            var folder             = Fakes.RandomString();
            var projectName        = Fakes.RandomString();
            var projectPassword    = Fakes.RandomString();
            var eraseSensitiveInfo = Fakes.RandomBool();

            IDeployArguments deployArguments = null;

            _deployerMock.Setup(d => d.Deploy(It.IsAny <IDeployArguments>())).Callback((IDeployArguments da) => { deployArguments = da; });

            // Execute
            var powershellCmd = new SsisDeployPowershell
            {
                DeploymentFilePath = deploymentFilePath,
                Folder             = folder,
                Catalog            = catalog,
                ServerInstance     = serverInstance,
                ProjectName        = projectName,
                EraseSensitiveInfo = eraseSensitiveInfo,
                ProjectPassword    = projectPassword
            };

            powershellCmd.ProcessRecordInternal(_deployerMock.Object, workingFolder);

            // Assert
            Assert.Equal(workingFolder, deployArguments.WorkingFolder);
            Assert.Equal(deploymentFilePath, deployArguments.DeploymentFilePath);
            Assert.Equal(serverInstance, deployArguments.ServerInstance);
            Assert.Equal(catalog, deployArguments.Catalog);
            Assert.Equal(folder, deployArguments.Folder);
            Assert.Equal(projectName, deployArguments.ProjectName);
            Assert.Equal(projectPassword, deployArguments.ProjectPassword);
            Assert.Equal(eraseSensitiveInfo, deployArguments.EraseSensitiveInfo);
        }
Esempio n. 4
0
        private void LogDeploymentInfo(IDeployArguments deployArguments, Dictionary <string, SensitiveParameter> parametersToDeploy, ProtectionLevel deploymentProtectionLevel)
        {
            _logger.LogMessage("SSIS Deploy Engine");
            _logger.LogMessage("Copyright (c) 2017 Roman Tumaykin");
            _logger.LogMessage("");
            _logger.LogMessage("-------------------------------------------------------------------------------");
            _logger.LogMessage("Starting SSIS Project deployment with the following parameters:");
            _logger.LogMessage("");
            _logger.LogMessage($"Project path:         {deployArguments.DeploymentFilePath}.");
            _logger.LogMessage($"Target SQL Server:    {deployArguments.ServerInstance}");
            _logger.LogMessage($"Target IS Catalog:    {deployArguments.Catalog}");
            _logger.LogMessage($"Target Project Name:  {deployArguments.ProjectName}");
            _logger.LogMessage($"Protection Level:     {deploymentProtectionLevel:G}");

            if (parametersToDeploy.Count > 0)
            {
                _logger.LogMessage("");
                _logger.LogMessage("The following parameters will be deployed together with the project:");
                foreach (var parameter in parametersToDeploy)
                {
                    _logger.LogMessage($"    - {parameter.Key};");
                }
            }
        }
Esempio n. 5
0
        public void Deploy(IDeployArguments deployArguments)
        {
            string deploymentFilePath;

            if (string.IsNullOrWhiteSpace(deployArguments.DeploymentFilePath))
            {
                deploymentFilePath = Directory.EnumerateFiles(deployArguments.WorkingFolder, "*.ispac").FirstOrDefault();
                if (string.IsNullOrWhiteSpace(deploymentFilePath))
                {
                    throw new DeploymentFileNotFoundException(deployArguments.WorkingFolder);
                }
            }
            else
            {
                deploymentFilePath = Path.GetFullPath(
                    Path.IsPathRooted(deployArguments.DeploymentFilePath)
                        ? deployArguments.DeploymentFilePath
                        : Path.Combine(deployArguments.WorkingFolder, deployArguments.DeploymentFilePath)
                    );
            }

            var catalog = deployArguments.Catalog ?? "SSISDB";

            var projectName = deployArguments.ProjectName ?? Path.GetFileNameWithoutExtension(deploymentFilePath);

            _project.LoadFromIspac(deploymentFilePath, deployArguments.ProjectPassword);

            var parametersToDeploy = _project.Parameters.Where(p => p.Value.Sensitive && p.Value.Value != null)
                                     .ToDictionary(p => string.Copy(p.Key), v => new SensitiveParameter(string.Copy(v.Key), string.Copy(v.Value.Value), v.Value.ParameterDataType));


            var deploymentProtectionLevel = deployArguments.EraseSensitiveInfo ? ProtectionLevel.DontSaveSensitive : ProtectionLevel.ServerStorage;

            LogDeploymentInfo(
                new DeployArguments(
                    deployArguments.WorkingFolder,
                    deploymentFilePath,
                    deployArguments.ServerInstance,
                    catalog, deployArguments.Folder,
                    projectName,
                    deployArguments.ProjectPassword,
                    deployArguments.EraseSensitiveInfo
                    ),
                parametersToDeploy,
                deploymentProtectionLevel);

            var connectionString = new SqlConnectionStringBuilder()
            {
                ApplicationName    = "SSIS Deploy",
                DataSource         = deployArguments.ServerInstance,
                InitialCatalog     = catalog,
                IntegratedSecurity = true
            }.ConnectionString;

            using (var zipStream = new MemoryStream())
            {
                _project.Save(zipStream, deploymentProtectionLevel, deployArguments.ProjectPassword);
                zipStream.Flush();

                _catalogTools.DeployProject(connectionString, deployArguments.Folder, projectName, deployArguments.EraseSensitiveInfo, parametersToDeploy, zipStream);
            }

            _logger.LogMessage("");
            _logger.LogMessage("Deployment completed successfully");
        }