コード例 #1
0
ファイル: RemoteSequence.cs プロジェクト: brigs/ConDep
        private IReportStatus ExecuteWithSticky(ConDepOptions options, IReportStatus status)
        {
            var          servers = _servers.ToList();
            ServerConfig manuelTestServer;

            if (options.StopAfterMarkedServer)
            {
                manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                return(ExecuteOnServer(manuelTestServer, status, options, _loadBalancer, true, false));
            }

            if (options.ContinueAfterMarkedServer)
            {
                manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                _loadBalancer.BringOnline(manuelTestServer.Name, manuelTestServer.LoadBalancerFarm, status);
                servers.Remove(manuelTestServer);
            }

            foreach (var server in servers)
            {
                ExecuteOnServer(server, status, options, _loadBalancer, true, true);

                if (status.HasErrors)
                {
                    return(status);
                }
            }
            return(status);
        }
コード例 #2
0
        public IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart(_name);
                foreach (var element in _sequence)
                {
                    if (element is LocalOperation)
                    {
                        Logger.LogSectionStart(element.GetType().Name);
                        ((LocalOperation)element).Execute(status, config, options);
                        Logger.LogSectionEnd(element.GetType().Name);
                    }
                    else if (element is RemoteSequence)
                    {
                        ((RemoteSequence)element).Execute(status, options);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }

                    if (status.HasErrors)
                    {
                        return(status);
                    }
                }
                return(status);
            }
            finally
            {
                Logger.LogSectionEnd(_name);
            }
        }
コード例 #3
0
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions conDepOptions)
        {
            WebDeployOptions options = null;

            try
            {
                Logger.LogSectionStart(_provider.GetType().Name);
                _webDeploy.Sync(_provider, server, _provider.ContinueOnError, status, OnWebDeployTraceMessage);
            }
            catch (Exception ex)
            {
                HandleSyncException(status, ex);
            }
            finally
            {
                Logger.LogSectionEnd(_provider.GetType().Name);
                if (options != null && options.DestBaseOptions != null)
                {
                    options.DestBaseOptions.Trace -= OnWebDeployTraceMessage;
                }
                if (options != null && options.SourceBaseOptions != null)
                {
                    options.SourceBaseOptions.Trace -= OnWebDeployTraceMessage;
                }
            }

            return(status);
        }
コード例 #4
0
ファイル: CompositeSequence.cs プロジェクト: brigs/ConDep
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart(_compositeName);
                foreach (var element in _sequence)
                {
                    if (element is CompositeSequence)
                    {
                        ((CompositeSequence)element).Execute(server, status, options);
                    }
                    else if (element is IOperateRemote)
                    {
                        ((IOperateRemote)element).Execute(server, status, options);
                    }

                    if (status.HasErrors)
                    {
                        return(status);
                    }
                }
            }
            finally
            {
                Logger.LogSectionEnd(_compositeName);
            }
            return(status);
        }
コード例 #5
0
        private RelayConfig GetRelayConfig(ConDepRelayOptions relayOptions, ConDepOptions deployOptions)
        {
            if (relayOptions.HasAllOptionsSet())
            {
                return new RelayConfig
                       {
                           AccessKey    = relayOptions.AccessKey,
                           AccessSecret = relayOptions.AccessSecret,
                           Origin       = relayOptions.Origin,
                           RelayId      = relayOptions.RelayId
                       }
            }
            ;

            var path = !string.IsNullOrWhiteSpace(relayOptions.RelayConfigPath)
        ? relayOptions.RelayConfigPath
        : Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "relay.json");

            if (!File.Exists(path))
            {
                throw new FileNotFoundException("");
            }

            var serializer = new JsonSerializer <RelayConfig>(new JsonConfigCrypto(deployOptions.CryptoKey));

            return(serializer.DeSerialize(File.OpenRead(path)));
        }
コード例 #6
0
        //private static Assembly ResolveConDepAssemblies(object sender, ResolveEventArgs args)
        //{
        //    var assemblyName = args.Name.Split(',')[0];
        //    var assemblyLocation = Path.Combine(typeof(ConDepConfigurationExecutor).Assembly.CodeBase, assemblyName);

        //    if (File.Exists(assemblyLocation + ".dll"))
        //    {
        //        return Assembly.LoadFrom(assemblyLocation + ".dll");
        //    }
        //    return null;
        //}

        //private static Assembly ResolveAssemblyLocation(object sender, ResolveEventArgs args)
        //{
        //    var assemblyName = args.Name.Split(',')[0];
        //    var assemblyLocation = Path.Combine(_assemblySearchPath, assemblyName);

        //    if (File.Exists(assemblyLocation + ".dll"))
        //    {
        //        return Assembly.LoadFrom(assemblyLocation + ".dll");
        //    }
        //    return null;
        //}

        public ConDepExecutionResult Execute(Guid executionId, string assemblyPath, ConDepOptions options, ITokenSource token)
        {
            throw new NotImplementedException();
            //try
            //{
            //    // 1. Initialize Logger
            //    // 2. Load ConDep Assembly and assign to Options
            //    // 3. Load Env Config and add to Settings
            //    // 4.
            //    Directory.SetCurrentDirectory(Path.GetDirectoryName(assemblyPath));
            //    Logger.Initialize(new RelayApiLogger(executionId));
            //    Logger.TraceLevel = options.TraceLevel > 0 ? options.TraceLevel : TraceLevel.Info;

            //    Logger.Info("Trace level set to " + Logger.TraceLevel);

            //    var configAssemblyLoader = new ConDepAssemblyHandler(assemblyPath);
            //    options.Assembly = configAssemblyLoader.GetAssembly();

            //    var conDepSettings = new ConDepSettings
            //    {
            //        Options = options
            //    };
            //    conDepSettings.Config = ConfigHandler.GetEnvConfig(conDepSettings);

            //    if (conDepSettings.Options.Assembly == null) throw new ArgumentException("assembly");

            //    var lbLookup = new LoadBalancerLookup(conDepSettings.Config.LoadBalancer);
            //    var runbookConfigHandler = new RunbookConfigurationHandler(new RunbookHandler(), new RunbookDependencyHandler(), lbLookup.GetLoadBalancer());
            //    var sequenceManager = runbookConfigHandler.CreateExecutionSequence(conDepSettings);

            //    var clientValidator = new ClientValidator();

            //    var serverInfoHarvester = HarvesterFactory.GetHarvester(conDepSettings);
            //    var serverValidator = new RemoteServerValidator(conDepSettings.Config.Servers,
            //                                                    serverInfoHarvester, new PowerShellExecutor());


            //    if (conDepSettings.Options.DryRun)
            //    {
            //        Logger.Warn("Showing execution sequence from dry run:");
            //        sequenceManager.DryRun(conDepSettings);
            //        return new ConDepExecutionResult(true);
            //    }

            //    return Execute(conDepSettings, clientValidator, serverValidator, sequenceManager, token.Token);
            //}
            //catch (Exception ex)
            //{
            //    try
            //    {
            //        Logger.Error("An error sneaked by.", ex);
            //    }
            //    catch { }

            //    var result = new ConDepExecutionResult(false);
            //    result.AddException(ex);
            //    return result;
            //    //throw;
            //}
        }
コード例 #7
0
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            var configFilePath = Path.Combine(_configDirPath, _configName);
            var transformFilePath = Path.Combine(_configDirPath, _transformName);
            var backupPath = "";

            if(ConDepConfigBackupExist(_configDirPath, _configName))
            {
                Logger.Info("Using [{0}] as configuration file to transform", _configDirPath + CONDEP_CONFIG_EXTENSION);
                backupPath = Path.Combine(_configDirPath, _configName + CONDEP_CONFIG_EXTENSION);
            }
            else
            {
                BackupConfigFile(_configDirPath, _configName);
            }

            Logger.Info("Transforming [{0}] using [{1}]", configFilePath, transformFilePath);
            var trans = new SlowCheetah.Tasks.TransformXml
            {
                BuildEngine = new TransformConfigBuildEngine(),
                Source = string.IsNullOrWhiteSpace(backupPath) ? configFilePath : backupPath,
                Transform = transformFilePath,
                Destination = configFilePath
            };

            var success = trans.Execute();
            if(!success)
                throw new CondepWebConfigTransformException(string.Format("Failed to transform [{0}] file.", _configName));

            return status;
        }
コード例 #8
0
ファイル: PreRemoteOps.cs プロジェクト: brigs/ConDep
 public PreRemoteOps(ServerConfig server, PreOpsSequence sequence, ConDepOptions options, IHandleWebDeploy webDeploy)
 {
     _server = server;
     _sequence = sequence;
     _options = options;
     _webDeploy = webDeploy;
 }
コード例 #9
0
ファイル: PreRemoteOps.cs プロジェクト: brigs/ConDep
 public PreRemoteOps(ServerConfig server, PreOpsSequence sequence, ConDepOptions options, IHandleWebDeploy webDeploy)
 {
     _server    = server;
     _sequence  = sequence;
     _options   = options;
     _webDeploy = webDeploy;
 }
コード例 #10
0
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions options)
        {
            bool sectionAdded = false;

            try
            {
                if (ConDepGlobals.ServersWithPreOps.ContainsKey(server.Name))
                {
                    return(status);
                }

                ConDepGlobals.ServersWithPreOps.Add(server.Name, server);
                Logger.LogSectionStart("Pre-Operations");
                sectionAdded = true;

                var remotePreOps = new PreRemoteOps(server, this, options, _webDeploy);
                remotePreOps.Configure();
                remotePreOps.Execute(status);

                foreach (var element in _sequence)
                {
                    if (element is IOperateRemote)
                    {
                        ((IOperateRemote)element).Execute(server, status, options);
                        if (status.HasErrors)
                        {
                            return(status);
                        }
                    }
                    else if (element is CompositeSequence)
                    {
                        ((CompositeSequence)element).Execute(server, status, options);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }

                    if (status.HasErrors)
                    {
                        return(status);
                    }
                }

                return(status);
            }
            finally
            {
                if (sectionAdded)
                {
                    Logger.LogSectionEnd("Pre-Operations");
                }
            }
        }
コード例 #11
0
 public IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
 {
     foreach (var localSequence in _sequence)
     {
         localSequence.Execute(status, config, options);
         if (status.HasErrors)
         {
             return(status);
         }
     }
     return(status);
 }
コード例 #12
0
ファイル: PostOpsSequence.cs プロジェクト: brigs/ConDep
        public IReportStatus Execute(IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart("Post-Operations");

                var postRemoteOp = new PostRemoteOps();
                postRemoteOp.Configure(this);

                foreach (var server in ConDepGlobals.ServersWithPreOps.Values)
                {
                    foreach (var element in _sequence)
                    {
                        if (element is IOperateRemote)
                        {
                            ((IOperateRemote)element).Execute(server, status, options);
                            if (status.HasErrors)
                            {
                                return(status);
                            }
                        }
                        else if (element is CompositeSequence)
                        {
                            ((CompositeSequence)element).Execute(server, status, options);
                        }
                        else
                        {
                            throw new NotSupportedException();
                        }

                        if (status.HasErrors)
                        {
                            return(status);
                        }
                    }
                }
            }
            finally
            {
                try
                {
                    WebDeployDeployer.DisposeAll();
                }
                catch (Exception ex)
                {
                    Logger.Warn("Unable to remove Web Deploy from server(s).", ex);
                }
                Logger.LogSectionEnd("Post-Operations");
            }

            return(status);
        }
コード例 #13
0
        private ArtifactManifest GetArtifactManifest(ConDepRelayOptions options, ConDepOptions deployOptions)
        {
            var path = !string.IsNullOrWhiteSpace(options.ArtifactManifestPath)
        ? options.ArtifactManifestPath
        : Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), "artifacts.json");

            var parser =
                new ArtifactManifestConfigParser(
                    new JsonSerializer <ArtifactManifest>(new JsonConfigCrypto(deployOptions.CryptoKey)));
            var manifest = parser.GetTypedConfig(path);

            return(manifest);
        }
コード例 #14
0
ファイル: CmdRelayParser.cs プロジェクト: Siliconrob/ConDep
 public override ConDepRelayOptions Parse()
 {
     try
     {
         var deployParser = new CmdDeployParser(_args);
         _options = deployParser.Parse();
         OptionSet.Parse(_args);
     }
     catch (OptionException oe)
     {
         throw new ConDepCmdParseException("Unable to successfully parse arguments.", oe);
     }
     return(_relayOptions);
 }
コード例 #15
0
ファイル: PostOpsSequence.cs プロジェクト: brigs/ConDep
        public IReportStatus Execute(IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart("Post-Operations");

                var postRemoteOp = new PostRemoteOps();
                postRemoteOp.Configure(this);

                foreach (var server in ConDepGlobals.ServersWithPreOps.Values)
                {
                    foreach (var element in _sequence)
                    {
                        if (element is IOperateRemote)
                        {
                            ((IOperateRemote) element).Execute(server, status, options);
                            if (status.HasErrors)
                                return status;
                        }
                        else if (element is CompositeSequence)
                        {
                            ((CompositeSequence) element).Execute(server, status, options);
                        }
                        else
                        {
                            throw new NotSupportedException();
                        }

                        if (status.HasErrors)
                            return status;
                    }
                }
            }
            finally
            {
                try
                {
                    WebDeployDeployer.DisposeAll();
                }
                catch(Exception ex)
                {
                    Logger.Warn("Unable to remove Web Deploy from server(s).", ex);

                }
                Logger.LogSectionEnd("Post-Operations");
            }

            return status;
        }
コード例 #16
0
ファイル: PreCompileOperation.cs プロジェクト: brigs/ConDep
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            try
            {
                if(Directory.Exists(_preCompileOutputpath))
                    Directory.Delete(_preCompileOutputpath, true);

                _buildManager.PrecompileApplication(new PreCompileCallback());
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                throw;
            }
            return status;
        }
コード例 #17
0
ファイル: RemoteSequence.cs プロジェクト: brigs/ConDep
        private IReportStatus ExecuteWithRoundRobin(ConDepOptions options, IReportStatus status)
        {
            var          servers = _servers.ToList();
            var          roundRobinMaxOfflineServers = (int)Math.Ceiling(((double)servers.Count) / 2);
            ServerConfig manuelTestServer            = null;

            if (options.StopAfterMarkedServer)
            {
                manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                return(ExecuteOnServer(manuelTestServer, status, options, _loadBalancer, true, false));
            }

            if (options.ContinueAfterMarkedServer)
            {
                manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                servers.Remove(manuelTestServer);

                if (roundRobinMaxOfflineServers == 1)
                {
                    _loadBalancer.BringOnline(manuelTestServer.Name, manuelTestServer.LoadBalancerFarm, status);
                }
            }

            if (servers.Count == 1)
            {
                return(ExecuteOnServer(servers.First(), status, options, _loadBalancer, true, true));
            }

            for (int execCount = 0; execCount < servers.Count; execCount++)
            {
                if (execCount == roundRobinMaxOfflineServers - (manuelTestServer == null ? 0 : 1))
                {
                    TurnRoundRobinServersAround(_loadBalancer, servers, roundRobinMaxOfflineServers, manuelTestServer, status);
                }

                bool bringOnline = !(roundRobinMaxOfflineServers - (manuelTestServer == null ? 0 : 1) > execCount);
                ExecuteOnServer(servers[execCount], status, options, _loadBalancer, !bringOnline, bringOnline);

                if (status.HasErrors)
                {
                    return(status);
                }
            }

            return(status);
        }
コード例 #18
0
 private IEnumerable<ApplicationArtifact> CreateApplicationArtifacts(ConDepOptions options, Assembly assembly)
 {
     if (options.HasApplicationDefined())
     {
         var type = assembly.GetTypes().SingleOrDefault(t => typeof (ApplicationArtifact).IsAssignableFrom(t) && t.Name == options.Application);
         if (type == null)
         {
             throw new ConDepConfigurationTypeNotFoundException(string.Format("A class inheriting from [{0}] must be present in assembly [{1}] for ConDep to work. No calss with name [{2}] found in assembly. ",typeof (ApplicationArtifact).FullName, assembly.FullName, options.Application));
         }
         yield return CreateApplicationArtifact(assembly, type);
     }
     else
     {
         var types = assembly.GetTypes().Where(t => typeof(ApplicationArtifact).IsAssignableFrom(t));
         foreach (var type in types)
         {
             yield return CreateApplicationArtifact(assembly, type);
         }
     }
 }
コード例 #19
0
ファイル: Program.cs プロジェクト: thedersen/ConDep
        static void Main(string[] args)
        {
            var exitCode = 0;
            try
            {
                new LogConfigLoader().Load();
                Logger.LogSectionStart("ConDep");

                var optionHandler = new CommandLineOptionHandler(args);
                var configAssemblyLoader = new ConDepAssemblyHandler(optionHandler.Params.AssemblyName);
                var assembly = configAssemblyLoader.GetConfigAssembly();

                var conDepOptions = new ConDepOptions(optionHandler.Params.Context, optionHandler.Params.DeployOnly, optionHandler.Params.InfraOnly, optionHandler.Params.WebDeployExist);
                var envSettings = GetEnvConfig(optionHandler.Params, assembly);

                var status = new WebDeploymentStatus();
                ConDepConfigurationExecutor.ExecuteFromAssembly(assembly, envSettings, conDepOptions, status);

                if(status.HasErrors)
                {
                    exitCode = 1;
                }
                else
                {
                    status.EndTime = DateTime.Now;
                    status.PrintSummery();
                }
            }
            catch (Exception ex)
            {
                exitCode = 1;
                Logger.Error("ConDep reported a fatal error:");
                Logger.Error("Message: " + ex.Message);
                Logger.Error("Stack trace:\n" + ex.StackTrace);
            }
            finally
            {
                Logger.LogSectionEnd("ConDep");
                Environment.Exit(exitCode);
            }
        }
コード例 #20
0
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions conDepOptions)
        {
            WebDeployOptions options = null;
            try
            {
                Logger.LogSectionStart(_provider.GetType().Name);
                _webDeploy.Sync(_provider, server, _provider.ContinueOnError, status, OnWebDeployTraceMessage);
            }
            catch (Exception ex)
            {
                HandleSyncException(status, ex);
            }
            finally
            {
                Logger.LogSectionEnd(_provider.GetType().Name);
                if (options != null && options.DestBaseOptions != null) options.DestBaseOptions.Trace -= OnWebDeployTraceMessage;
                if (options != null && options.SourceBaseOptions != null) options.SourceBaseOptions.Trace -= OnWebDeployTraceMessage;
            }

            return status;
        }
コード例 #21
0
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            var webRequest = System.Net.WebRequest.Create(_url);
            webRequest.Method = _method;
            webRequest.ContentLength = 0;
            webRequest.ContentType = "application/x-www-form-urlencoded";

            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

            HttpStatusCode statusCode = ((HttpWebResponse)webRequest.GetResponse()).StatusCode;

            if (statusCode == HttpStatusCode.OK)
            {
                Logger.Info("HTTP {0} Succeeded: {1}", _method.ToUpper(), _url);
            }
            else
            {
                Logger.Error("HTTP {0} Failed with Status {1}: {2}", _method.ToUpper(), statusCode, _url);
            }

            return status;
        }
コード例 #22
0
ファイル: HttpGetOperation.cs プロジェクト: brigs/ConDep
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            var webRequest = System.Net.WebRequest.Create(_url);
            webRequest.Method = "GET";
            webRequest.ContentLength = 0;
            webRequest.ContentType = "application/x-www-form-urlencoded";

            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

            HttpStatusCode statusCode = ((HttpWebResponse)webRequest.GetResponse()).StatusCode;

            if (statusCode == HttpStatusCode.OK)
            {
                Logger.Info("HTTP {0} Succeeded: {1}", "GET", _url);
            }
            else
            {
                throw new WebException(string.Format("GET request did not return with 200 (OK), but {0} ({1})", (int)statusCode, statusCode));
            }

            return status;
        }
コード例 #23
0
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart("Infrastructure");
                foreach (var element in _sequence)
                {
                    if (element is IOperateRemote)
                    {
                        ((IOperateRemote)element).Execute(server, status, options);
                        if (status.HasErrors)
                        {
                            return(status);
                        }
                    }
                    else if (element is CompositeSequence)
                    {
                        ((CompositeSequence)element).Execute(server, status, options);
                    }
                    else
                    {
                        throw new NotSupportedException();
                    }

                    if (status.HasErrors)
                    {
                        return(status);
                    }
                }
            }
            finally
            {
                Logger.LogSectionEnd("Infrastructure");
            }

            return(status);
        }
コード例 #24
0
ファイル: RemoteSequence.cs プロジェクト: brigs/ConDep
        public IReportStatus Execute(IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart("Remote Operations");

                switch (_loadBalancer.Mode)
                {
                case LbMode.Sticky:
                    return(ExecuteWithSticky(options, status));

                case LbMode.RoundRobin:
                    return(ExecuteWithRoundRobin(options, status));

                default:
                    throw new ConDepLoadBalancerException(string.Format("Load Balancer mode [{0}] not supported.",
                                                                        _loadBalancer.Mode));
                }
            }
            finally
            {
                Logger.LogSectionEnd("Remote Operations");
            }
        }
コード例 #25
0
ファイル: LocalOperation.cs プロジェクト: brigs/ConDep
 public abstract IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options);
コード例 #26
0
 public abstract IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options);
コード例 #27
0
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            var configFilePath    = Path.Combine(_configDirPath, _configName);
            var transformFilePath = Path.Combine(_configDirPath, _transformName);
            var backupPath        = "";

            if (ConDepConfigBackupExist(_configDirPath, _configName))
            {
                Logger.Info("Using [{0}] as configuration file to transform", _configDirPath + CONDEP_CONFIG_EXTENSION);
                backupPath = Path.Combine(_configDirPath, _configName + CONDEP_CONFIG_EXTENSION);
            }
            else
            {
                BackupConfigFile(_configDirPath, _configName);
            }

            Logger.Info("Transforming [{0}] using [{1}]", configFilePath, transformFilePath);
            var trans = new SlowCheetah.Tasks.TransformXml
            {
                BuildEngine = new TransformConfigBuildEngine(),
                Source      = string.IsNullOrWhiteSpace(backupPath) ? configFilePath : backupPath,
                Transform   = transformFilePath,
                Destination = configFilePath
            };

            var success = trans.Execute();

            if (!success)
            {
                throw new CondepWebConfigTransformException(string.Format("Failed to transform [{0}] file.", _configName));
            }

            return(status);
        }
コード例 #28
0
ファイル: HttpGetOperation.cs プロジェクト: brigs/ConDep
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            var webRequest = System.Net.WebRequest.Create(_url);

            webRequest.Method        = "GET";
            webRequest.ContentLength = 0;
            webRequest.ContentType   = "application/x-www-form-urlencoded";

            ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

            HttpStatusCode statusCode = ((HttpWebResponse)webRequest.GetResponse()).StatusCode;

            if (statusCode == HttpStatusCode.OK)
            {
                Logger.Info("HTTP {0} Succeeded: {1}", "GET", _url);
            }
            else
            {
                throw new WebException(string.Format("GET request did not return with 200 (OK), but {0} ({1})", (int)statusCode, statusCode));
            }

            return(status);
        }
コード例 #29
0
        public override IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options)
        {
            try
            {
                if (Directory.Exists(_preCompileOutputpath))
                {
                    Directory.Delete(_preCompileOutputpath, true);
                }

                _buildManager.PrecompileApplication(new PreCompileCallback());
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                throw;
            }
            return(status);
        }
コード例 #30
0
ファイル: Program.cs プロジェクト: brigs/ConDep
        static void Main(string[] args)
        {
            var      exitCode = 0;
            WebQueue webQ     = null;

            try
            {
                new LogConfigLoader().Load();
                Logger.TraceLevel = TraceLevel.Info;

                var optionHandler = new CommandLineOptionHandler(args);
                if (optionHandler.Params.InstallWebQ)
                {
                    throw new NotImplementedException();
                }
                else
                {
                    PrintCopyrightMessage();
                    Logger.LogSectionStart("ConDep");
                    if (!string.IsNullOrWhiteSpace(optionHandler.Params.WebQAddress))
                    {
                        webQ = new WebQueue(optionHandler.Params.WebQAddress, optionHandler.Params.Environment);
                        webQ.WebQueuePositionUpdate += (sender, eventArgs) => Logger.Info(eventArgs.Message);
                        webQ.WebQueueTimeoutUpdate  += (sender, eventArgs) => Logger.Info(eventArgs.Message);
                        Logger.LogSectionStart("Waiting in Deployment Queue");
                        try
                        {
                            webQ.WaitInQueue(TimeSpan.FromMinutes(30));
                        }
                        finally
                        {
                            Logger.LogSectionEnd("Waiting in Deployment Queue");
                        }
                    }

                    var configAssemblyLoader = new ConDepAssemblyHandler(optionHandler.Params.AssemblyName);
                    var assembly             = configAssemblyLoader.GetAssembly();

                    var conDepOptions = new ConDepOptions(optionHandler.Params.DeployAllApps,
                                                          optionHandler.Params.Application,
                                                          optionHandler.Params.DeployOnly,
                                                          optionHandler.Params.WebDeployExist,
                                                          optionHandler.Params.StopAfterMarkedServer,
                                                          optionHandler.Params.ContinueAfterMarkedServer,
                                                          assembly);
                    var envSettings = ConfigHandler.GetEnvConfig(optionHandler.Params.Environment, optionHandler.Params.BypassLB, assembly);

                    var status = new WebDeploymentStatus();
                    ConDepConfigurationExecutor.ExecuteFromAssembly(assembly, envSettings, conDepOptions, status);

                    if (status.HasErrors)
                    {
                        exitCode = 1;
                    }
                    else
                    {
                        status.EndTime = DateTime.Now;
                        status.PrintSummary();
                    }
                }
            }
            catch (Exception ex)
            {
                exitCode = 1;
                Logger.Error("ConDep reported a fatal error:");
                Logger.Error("Message: " + ex.Message);
                Logger.Verbose("Stack trace:\n" + ex.StackTrace);
            }
            finally
            {
                if (webQ != null)
                {
                    webQ.LeaveQueue();
                }

                Logger.LogSectionEnd("ConDep");
                Environment.Exit(exitCode);
            }
        }
コード例 #31
0
ファイル: Program.cs プロジェクト: brigs/ConDep
        static void Main(string[] args)
        {
            var exitCode = 0;
            WebQueue webQ = null;
            try
            {
                new LogConfigLoader().Load();
                Logger.TraceLevel = TraceLevel.Info;

                var optionHandler = new CommandLineOptionHandler(args);
                if (optionHandler.Params.InstallWebQ)
                {
                    throw new NotImplementedException();
                }
                else
                {
                    PrintCopyrightMessage();
                    Logger.LogSectionStart("ConDep");
                    if (!string.IsNullOrWhiteSpace(optionHandler.Params.WebQAddress))
                    {
                        webQ = new WebQueue(optionHandler.Params.WebQAddress, optionHandler.Params.Environment);
                        webQ.WebQueuePositionUpdate += (sender, eventArgs) => Logger.Info(eventArgs.Message);
                        webQ.WebQueueTimeoutUpdate += (sender, eventArgs) => Logger.Info(eventArgs.Message);
                        Logger.LogSectionStart("Waiting in Deployment Queue");
                        try
                        {
                            webQ.WaitInQueue(TimeSpan.FromMinutes(30));
                        }
                        finally
                        {
                            Logger.LogSectionEnd("Waiting in Deployment Queue");
                        }
                    }

                    var configAssemblyLoader = new ConDepAssemblyHandler(optionHandler.Params.AssemblyName);
                    var assembly = configAssemblyLoader.GetAssembly();

                    var conDepOptions = new ConDepOptions(optionHandler.Params.DeployAllApps,
                                                          optionHandler.Params.Application,
                                                          optionHandler.Params.DeployOnly,
                                                          optionHandler.Params.WebDeployExist,
                                                          optionHandler.Params.StopAfterMarkedServer,
                                                          optionHandler.Params.ContinueAfterMarkedServer,
                                                          assembly);
                    var envSettings = ConfigHandler.GetEnvConfig(optionHandler.Params.Environment, optionHandler.Params.BypassLB, assembly);

                    var status = new WebDeploymentStatus();
                    ConDepConfigurationExecutor.ExecuteFromAssembly(assembly, envSettings, conDepOptions, status);

                    if (status.HasErrors)
                    {
                        exitCode = 1;
                    }
                    else
                    {
                        status.EndTime = DateTime.Now;
                        status.PrintSummary();
                    }
                }
            }
            catch (Exception ex)
            {
                exitCode = 1;
                Logger.Error("ConDep reported a fatal error:");
                Logger.Error("Message: " + ex.Message);
                Logger.Verbose("Stack trace:\n" + ex.StackTrace);
            }
            finally
            {
                if(webQ != null)
                {
                    webQ.LeaveQueue();
                }

                Logger.LogSectionEnd("ConDep");
                Environment.Exit(exitCode);
            }
        }
コード例 #32
0
        private void Execute(Assembly assembly, ConDepConfig envConfig, ConDepOptions options, IReportStatus status)
        {
            if (assembly == null) { throw new ArgumentException("assembly"); }
            if (envConfig == null) { throw new ArgumentException("envSettings"); }
            if (options == null) { throw new ArgumentException("options"); }
            if (status == null) { throw new ArgumentException("status"); }

            var applications = CreateApplicationArtifacts(options, assembly);

            if(!options.WebDeployExist)
            {
                var serverValidator = new RemoteServerValidator(envConfig.Servers);
                if (!serverValidator.IsValid())
                {
                    Logger.Error("Not all servers fulfill ConDep's requirements. Aborting execution.");
                    return;
                }
            }

            var webDeploy = new WebDeployHandler();
            var lbLookup = new LoadBalancerLookup(envConfig.LoadBalancer);

            var sequenceManager = new ExecutionSequenceManager(lbLookup.GetLoadBalancer());

            var notification = new Notification();
            var postOpSeq = new PostOpsSequence();

            foreach (var application in applications)
            {
                var infrastructureSequence = new InfrastructureSequence();
                var preOpsSequence = new PreOpsSequence(webDeploy);
                if (!options.DeployOnly)
                {
                    var infrastructureBuilder = new InfrastructureBuilder(infrastructureSequence, webDeploy);
                    Configure.InfrastructureOperations = infrastructureBuilder;

                    if (HasInfrastructureDefined(application))
                    {
                        var infrastructureInstance = GetInfrastructureArtifactForApplication(assembly, application);
                        if (!infrastructureSequence.IsValid(notification))
                        {
                            notification.Throw();
                        }
                        infrastructureInstance.Configure(infrastructureBuilder, envConfig);
                    }
                }

                var local = new LocalOperationsBuilder(sequenceManager.NewLocalSequence(application.GetType().Name), infrastructureSequence, preOpsSequence, envConfig.Servers, webDeploy);
                Configure.LocalOperations = local;

                application.Configure(local, envConfig);
            }

            if (!sequenceManager.IsValid(notification))
            {
                notification.Throw();
            }

            sequenceManager.Execute(status, envConfig, options);
            postOpSeq.Execute(status, options);
        }
コード例 #33
0
ファイル: RemoteSequence.cs プロジェクト: brigs/ConDep
        private IReportStatus ExecuteOnServer(ServerConfig server, IReportStatus status, ConDepOptions options, ILoadBalance loadBalancer, bool bringServerOfflineBeforeExecution, bool bringServerOnlineAfterExecution)
        {
            var errorDuringLoadBalancing = false;

            try
            {
                Logger.LogSectionStart(server.Name);

                if (bringServerOfflineBeforeExecution)
                {
                    Logger.Info(string.Format("Taking server [{0}] offline in load balancer.", server.Name));
                    loadBalancer.BringOffline(server.Name, server.LoadBalancerFarm,
                                              LoadBalancerSuspendMethod.Suspend, status);
                }

                ExecuteOnServer(server, status, options);
                return(status);
            }
            catch
            {
                errorDuringLoadBalancing = true;
                throw;
            }
            finally
            {
                try
                {
                    if (bringServerOnlineAfterExecution && !status.HasErrors && !errorDuringLoadBalancing)
                    {
                        Logger.Info(string.Format("Taking server [{0}] online in load balancer.", server.Name));
                        loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status);
                    }
                }
                finally
                {
                    Logger.LogSectionEnd(server.Name);
                }
            }
        }
コード例 #34
0
 public static void ExecuteFromAssembly(Assembly assembly, ConDepConfig envSettings, ConDepOptions options, IReportStatus status)
 {
     new ConDepConfigurationExecutor().Execute(assembly, envSettings, options, status);
 }
コード例 #35
0
        private void Execute(Assembly assembly, ConDepConfig envConfig, ConDepOptions options, IReportStatus status)
        {
            if (assembly == null) { throw new ArgumentException("assembly"); }
            if (envConfig == null) { throw new ArgumentException("envSettings"); }
            if (options == null) { throw new ArgumentException("options"); }
            if (status == null) { throw new ArgumentException("status"); }

            var applications = new List<ApplicationArtifact>();
            if(options.HasContext())
            {
                var type = assembly.GetTypes().Where(t => typeof(ApplicationArtifact).IsAssignableFrom(t) && t.Name == options.Context).Single();
                if (type == null)
                {
                    throw new ConDepConfigurationTypeNotFoundException(string.Format("A class inheriting from [{0}] must be present in assembly [{1}] for ConDep to work.", typeof(ApplicationArtifact).FullName, assembly.FullName));
                }

                var application = assembly.CreateInstance(type.FullName) as ApplicationArtifact;
                if (application == null) throw new NullReferenceException(string.Format("Instance of application class [{0}] in assembly [{1}] is not found.", type.FullName, assembly.FullName));
                applications.Add(application);
            }
            else
            {
                var types = assembly.GetTypes().Where(t => typeof(ApplicationArtifact).IsAssignableFrom(t));
                foreach(var type in types)
                {
                    var application = assembly.CreateInstance(type.FullName) as ApplicationArtifact;
                    if (application == null) throw new NullReferenceException(string.Format("Instance of application class [{0}] in assembly [{1}] is not found.", type.FullName, assembly.FullName));
                    applications.Add(application);
                }
            }

            IoCBootstrapper.Bootstrap(envConfig);

            var webDeploy = new WebDeployHandler();
            var sequenceManager = new ExecutionSequenceManager();

            var notification = new Notification();
            foreach (var application in applications)
            {
                var infrastructureSequence = new InfrastructureSequence();
                if (!options.DeployOnly)
                {
                    var infrastructureBuilder = new InfrastructureBuilder(infrastructureSequence, webDeploy);

                    if (HasInfrastructureDefined(application))
                    {
                        var infrastructureInstance = GetInfrastructureArtifactForApplication(assembly, application);
                        if (!infrastructureSequence.IsvValid(notification))
                        {
                            notification.Throw();
                        }
                        infrastructureInstance.Configure(infrastructureBuilder, envConfig);
                    }
                }

                var local = new LocalOperationsBuilder(sequenceManager.NewLocalSequence(application.GetType().Name), infrastructureSequence, envConfig.Servers, webDeploy);

                if(!options.InfraOnly)
                {
                    application.Configure(local, envConfig);
                }
            }

            if (!sequenceManager.IsValid(notification))
            {
                notification.Throw();
            }

            sequenceManager.Execute(status, envConfig, options);
        }
コード例 #36
0
        private ConDepRelayOptions GetRelayOptions(CmdBaseParser <ConDepRelayOptions> relayParser,
                                                   CmdBaseValidator <ConDepRelayOptions> relayValidator, ConDepOptions deployOptions)
        {
            var relayOptions = relayParser.Parse();

            relayValidator.Validate(relayOptions);
            return(relayOptions);
        }