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); }
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); } }
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); }
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); }
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))); }
//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; //} }
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; }
public PreRemoteOps(ServerConfig server, PreOpsSequence sequence, ConDepOptions options, IHandleWebDeploy webDeploy) { _server = server; _sequence = sequence; _options = options; _webDeploy = webDeploy; }
public PreRemoteOps(ServerConfig server, PreOpsSequence sequence, ConDepOptions options, IHandleWebDeploy webDeploy) { _server = server; _sequence = sequence; _options = options; _webDeploy = webDeploy; }
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"); } } }
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); }
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); }
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); }
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); }
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; }
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; }
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); }
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); } } }
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); } }
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; }
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; }
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; }
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); }
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"); } }
public abstract IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options);
public abstract IReportStatus Execute(IReportStatus status, ConDepConfig config, ConDepOptions options);
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); }
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); }
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); }
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); } }
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); } }
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); }
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); } } }
public static void ExecuteFromAssembly(Assembly assembly, ConDepConfig envSettings, ConDepOptions options, IReportStatus status) { new ConDepConfigurationExecutor().Execute(assembly, envSettings, options, status); }
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); }
private ConDepRelayOptions GetRelayOptions(CmdBaseParser <ConDepRelayOptions> relayParser, CmdBaseValidator <ConDepRelayOptions> relayValidator, ConDepOptions deployOptions) { var relayOptions = relayParser.Parse(); relayValidator.Validate(relayOptions); return(relayOptions); }