Пример #1
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);
        }
Пример #2
0
        private void HandleSyncException(IReportStatus status, Exception ex)
        {
            status.AddUntrappedException(ex);
            var message = GetCompleteExceptionMessage(ex);

            Logger.Error(message);
        }
Пример #3
0
        private void StartrxnProcessors(IReportStatus logger, IContainer container, Type[] events, IScheduler eventDelivery)
        {
            var startedProcessors = new List <dynamic>();

            foreach (var @event in events)
            {
                try
                {
                    //now we create an rxnProcessor of each IRxn discovered, then ask the container
                    //for any interfaces which implement them.
                    var processorForEvent         = typeof(IRxnProcessor <>).MakeGenericType(@event);
                    var allProcessorsForEventType = typeof(IEnumerable <>).MakeGenericType(processorForEvent);
                    var allProcessors             = ((IEnumerable <dynamic>)container.Resolve(allProcessorsForEventType)).ToArray();

                    Func <string, Rxns.Interfaces.IReactor <IRxn> > getReactorByName = reactorName => container.Resolve <IManageReactors>().StartReactor(reactorName).Reactor;

                    //now register any processors found with the subscription to the events they are interested in
                    var distinctProcessors = allProcessors.Distinct().ToArray();
                    foreach (var p in distinctProcessors.Except(startedProcessors))
                    {
                        var reactor = RxnCreator.GetReactorFor((object)p, getReactorByName);
                        //this method will hookup ALL process methods of a processor in one call
                        reactor.Connect((object)p, eventDelivery);
                    }

                    startedProcessors.AddRange(distinctProcessors); //so we need to keep a list processors we see so we dont attach them twice
                }
                catch (Exception e)
                {
                    logger.OnError(e);
                }
            }
        }
Пример #4
0
        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;
        }
        public override void BringOnline(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            if (server.LoadBalancerState.KeepOffline)
                return;

            BringOnline(server, status, settings, _loadBalancer, token);
        }
Пример #6
0
        public void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var assemblyLocalDir  = Path.GetDirectoryName(GetType().Assembly.Location);
            var assemblyRemoteDir = Path.Combine(server.GetServerInfo().TempFolderDos, "Assemblies");

            var publisher = new FilePublisher();

            publisher.PublishDirectory(assemblyLocalDir, assemblyRemoteDir, server, settings);

            var remoteAssemblyFileName = Path.Combine(Path.Combine(server.GetServerInfo().TempFolderPowerShell, "Assemblies"), Path.GetFileName(GetType().Assembly.Location));
            var remoteJsonAssembly     = Path.Combine(Path.Combine(server.GetServerInfo().TempFolderPowerShell, "Assemblies"), "Newtonsoft.Json.dll");
            var typeName       = GetType().FullName;
            var loggerTypeName = typeof(RemotePowerShellLogger).FullName;

            var parameters        = GetPowerShellParameters(ConstructorArguments, GetType()).ToList();
            var scriptParams      = string.Join(",", parameters.Select(x => "$" + x.Name));
            var argumentList      = string.Join(",", GetType().GetConstructor(ConstructorArguments.Select(x => x.GetType()).ToArray()).GetParameters().Select(x => "$" + x.Name));
            var deserializeScript = GetDeserializationScript(GetType().GetConstructor(ConstructorArguments.Select(x => x.GetType()).ToArray()));

            var psExecutor = new PowerShellExecutor(server);
            var script     = string.Format(@"
Param({3})
add-type -path {0}
add-type -path {5}
{4}
$operation = new-object -typename {1} -ArgumentList {6}
$logger = new-object -typename {2} -ArgumentList (Get-Host).UI
$operation.Execute($logger)
", remoteAssemblyFileName, typeName, loggerTypeName, scriptParams, deserializeScript, remoteJsonAssembly, argumentList);

            psExecutor.Execute(script, parameters);
        }
Пример #7
0
        private void HandleSyncException(IReportStatus status, Exception ex)
        {
            status.AddUntrappedException(ex);
            var message = GetCompleteExceptionMessage(ex);

            Logger.Error(message);
        }
Пример #8
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;
        }
Пример #9
0
        public IReportStatus Execute(IReportStatus status, ConDepOptions options)
        {
            foreach (var server in _servers)
            {
                try
                {
                    Logger.LogSectionStart(server.Name);

                    if (!options.WebDeployExist)
                    {
                        using (new WebDeployDeployer(server))
                        {
                            ExecuteOnServer(server, status, options);
                        }
                    }
                    else
                    {
                        ExecuteOnServer(server, status, options);
                    }
                }
                finally
                {
                    Logger.LogSectionEnd(server.Name);
                }
            }
            return status;
        }
Пример #10
0
        public void BringOffline(string serverName, string farm, LoadBalancerSuspendMethod suspendMethod, IReportStatus status)
        {
            SessionToken token = null;
            try
            {
                token = LogIn();
                var deviceId = GetDeviceId(token);
                var server = GetServer(serverName, farm, token, deviceId);

                var suspend = new suspendServerfarmRserver
                {
                    deviceID = deviceId,
                    reason = "ConDep deployment",
                    sessionToken = token,
                    suspendState = GetSuspendState(suspendMethod),
                    rserver = server
                };

                _proxy.suspendServerfarmRserver(new suspendServerfarmRserverRequest { suspendServerfarmRserver = suspend});
            }
            finally
            {
                if (_loggedIn)
                {
                    LogOut(token);
                }
            }
        }
Пример #11
0
        public void BringOnline(string serverName, string farm, IReportStatus status)
        {
            SessionToken token = null;
            try
            {
                token = LogIn();
                var deviceId = GetDeviceId(token);
                var server = GetServer(serverName, farm, token, deviceId);

                var activate = new activateServerfarmRserver
                                   {
                                       deviceID = deviceId,
                                       reason = "ConDep deployment",
                                       sessionToken = token,
                                       rserver = server
                                   };
                _proxy.activateServerfarmRserver(new activateServerfarmRserverRequest { activateServerfarmRserver = activate});
            }
            finally
            {
                if (_loggedIn)
                {
                    _proxy.logout(new logoutRequest { logout = new logout { sessionToken = token } });
                }
            }
        }
Пример #12
0
        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);
        }
Пример #13
0
        private void StartReactions(IReportStatus logger, IContainer container, Type[] events, IScheduler eventDelivery)
        {
            foreach (var @event in events)
            {
                try
                {
                    var processorForEvent         = typeof(IReactTo <>).MakeGenericType(@event);
                    var allProcessorsForEventType = typeof(IEnumerable <>).MakeGenericType(processorForEvent);
                    var allProcessors             = (IEnumerable <dynamic>)container.Resolve(allProcessorsForEventType);

                    Func <string, Rxns.Interfaces.IReactor <IRxn> > getReactorByName = reactorName => container.Resolve <IManageReactors>().StartReactor(reactorName).Reactor;

                    //now attach any processors found with the subscription to the events they are interested in
                    foreach (object reaction in allProcessors.Distinct())
                    {
                        var reactor = RxnCreator.GetReactorFor(reaction, getReactorByName);
                        reactor.Connect((IReactTo <IRxn>)reaction, eventDelivery);
                    }
                }
                catch (Exception e)
                {
                    logger.OnError(e);
                }
            }
        }
Пример #14
0
        public void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var assemblyLocalDir = Path.GetDirectoryName(GetType().Assembly.Location);
            var assemblyRemoteDir = Path.Combine(server.GetServerInfo().TempFolderDos, "Assemblies");

            _filePublisher.PublishDirectory(assemblyLocalDir, assemblyRemoteDir, server, settings);

            var remoteAssemblyFileName = Path.Combine(Path.Combine(server.GetServerInfo().TempFolderPowerShell, "Assemblies"), Path.GetFileName(GetType().Assembly.Location));
            var remoteJsonAssembly = Path.Combine(Path.Combine(server.GetServerInfo().TempFolderPowerShell, "Assemblies"), "Newtonsoft.Json.dll");
            var typeName = GetType().FullName;
            var loggerTypeName = typeof (RemotePowerShellLogger).FullName;

            var parameters = GetPowerShellParameters(ConstructorArguments, GetType()).ToList();
            var scriptParams = string.Join(",", parameters.Select(x => "$" + x.Name));
            var argumentList = string.Join(",", GetType().GetConstructor(ConstructorArguments.Select(x => x.GetType()).ToArray()).GetParameters().Select(x => "$" + x.Name));
            var deserializeScript = GetDeserializationScript(GetType().GetConstructor(ConstructorArguments.Select(x => x.GetType()).ToArray()));

            var script = string.Format(@"
            Param({3})
            add-type -path {0}
            add-type -path {5}
            {4}
            $operation = new-object -typename {1} -ArgumentList {6}
            $logger = new-object -typename {2} -ArgumentList (Get-Host).UI
            $operation.Execute($logger)
            ", remoteAssemblyFileName, typeName, loggerTypeName, scriptParams, deserializeScript, remoteJsonAssembly, argumentList);

            _psExecutor.Execute(server, script, mod => mod.LoadConDepModule = false, parameters);
        }
Пример #15
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);
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
        public void BringOnline(string serverName, string farm, IReportStatus status)
        {
            SessionToken token = null;

            try
            {
                token = LogIn();
                var      deviceIds = GetDeviceIds(token);
                DeviceID deviceId;
                var      server = GetServer(serverName, farm, token, deviceIds, out deviceId);

                var activate = new activateServerfarmRserver
                {
                    deviceID     = deviceId,
                    reason       = "ConDep deployment",
                    sessionToken = token,
                    rserver      = server
                };
                _proxy.activateServerfarmRserver(new activateServerfarmRserverRequest {
                    activateServerfarmRserver = activate
                });
            }
            finally
            {
                if (_loggedIn)
                {
                    _proxy.logout(new logoutRequest {
                        logout = new logout {
                            sessionToken = token
                        }
                    });
                }
            }
        }
Пример #18
0
        public void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            Logger.WithLogSection("Pre-Operations", () =>
            {
                server.GetServerInfo().TempFolderDos = string.Format(TMP_FOLDER, "%windir%");
                Logger.Info(string.Format("Dos temp folder is {0}", server.GetServerInfo().TempFolderDos));

                server.GetServerInfo().TempFolderPowerShell = string.Format(TMP_FOLDER, "$env:windir");
                Logger.Info(string.Format("PowerShell temp folder is {0}", server.GetServerInfo().TempFolderPowerShell));

                //var scriptPublisher = new PowerShellScriptPublisher(settings);
                //Logger.WithLogSection("Copying internal ConDep scripts", () => scriptPublisher.PublishDslScripts(server));

                PublishConDepNode(server, settings);

                var scriptPublisher = new PowerShellScriptPublisher(settings);
                Logger.WithLogSection("Copying external scripts", () => scriptPublisher.PublishScripts(server));
                Logger.WithLogSection("Copying remote helper assembly", () => scriptPublisher.PublishRemoteHelperAssembly(server));

                InstallChocolatey(server, settings);
                //Logger.WithLogSection("Copying external scripts", () => scriptPublisher.PublishExternalScripts(server));
            });
        }
Пример #19
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;
        }
Пример #20
0
        public override void Execute(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            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));
            }
        }
Пример #21
0
 public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
 {
     _executor.Execute(server, "Stop-ConDepNode", mod =>
     {
         mod.LoadConDepNodeModule = true;
         mod.LoadConDepModule     = false;
     }, logOutput: false);
 }
Пример #22
0
        public static IEnumerable <T> DisposedBy <T>(this IEnumerable <T> objs, IReportStatus reporter) where T : IDisposable
        {
            foreach (var o in objs)
            {
                reporter.OnDispose(o);
            }

            return(objs);
        }
Пример #23
0
        public static IDisposable ReportsOn(this ReportsStatus context, IReportStatus another)
        {
            var resources = new CompositeDisposable();

            another.Errors.Subscribe(context.ReportExceptions).DisposedBy(resources);
            another.Information.Subscribe(context.ReportInformation).DisposedBy(resources);

            return(resources);
        }
Пример #24
0
 public void Execute(IReportStatus status, ConDepSettings settings, CancellationToken token)
 {
     foreach (var element in _sequence)
     {
         token.ThrowIfCancellationRequested();
         IExecuteLocally internalElement = element;
         Logger.WithLogSection(internalElement.Name, () => element.Execute(status, settings, token));
     }
 }
Пример #25
0
        public static T[] DisposedBy <T>(this T[] objs, IReportStatus reporter) where T : IDisposable
        {
            foreach (var obj in objs)
            {
                reporter.OnDispose(obj);
            }

            return(objs);
        }
Пример #26
0
        public override void BringOnline(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            if (server.LoadBalancerState.KeepOffline)
            {
                return;
            }

            BringOnline(server, status, settings, _loadBalancer, token);
        }
Пример #27
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;
 }
        private void Execute(LoadBalanceState state, string serverName, IReportStatus status)
        {
            //var provider = new ApplicationRequestRoutingProvider(state, serverName);

            //var sequence = new ExecutionSequenceManager();
            //var webDeploy = new WebDeployOperator();
            //var server = new RemoteCompositeBuilder(new RemoteSequenceManager(new[] { _server }, null), new[] { _server }, webDeploy);
            //provider.Configure(server);
            //sequence.Execute(status);
        }
        private void Execute(LoadBalanceState state, string serverName, IReportStatus status)
        {
            //var provider = new ApplicationRequestRoutingProvider(state, serverName);

            //var sequence = new ExecutionSequenceManager();
            //var webDeploy = new WebDeployOperator();
            //var server = new RemoteCompositeBuilder(new RemoteSequenceManager(new[] { _server }, null), new[] { _server }, webDeploy);
            //provider.Configure(server);
            //sequence.Execute(status);
        }
Пример #30
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");
                }
            }
        }
        protected void BringOnline(ServerConfig server, IReportStatus status, ConDepSettings settings, ILoadBalance loadBalancer, CancellationToken token)
        {
            if (settings.Config.LoadBalancer == null) return;
            if (server.LoadBalancerState.CurrentState == LoadBalanceState.Online) return;

            Logger.WithLogSection(string.Format("Taking server [{0}] online in load balancer.", server.Name), () =>
            {
                loadBalancer.BringOnline(server.Name, server.LoadBalancerFarm, status);
                server.LoadBalancerState.CurrentState = LoadBalanceState.Online;
            });
        }
Пример #32
0
 /// <summary>
 /// Reports any exceptions that occour through your reporter
 /// </summary>
 /// <param name="reporter">The person who will catch the exception</param>
 /// <param name="work">The work todo</param>
 public static void TryCatch(this IReportStatus reporter, Action work)
 {
     try
     {
         work.Invoke();
     }
     catch (Exception e)
     {
         reporter.OnError(e);
     }
 }
Пример #33
0
        public void Run(IReportStatus logger, IContainer container)
        {
            //here we look for all the IRxns registered, along with the interfaces they implement that also
            //can be considered IRxns.
            var events = container.ComponentRegistry.Registrations.Where(r => typeof(IRxn).IsAssignableFrom(r.Activator.LimitType) && !r.Activator.LimitType.IsAbstract() && !r.Activator.LimitType.GetTypeInfo().IsGenericTypeDefinition).Select(r => r.Activator.LimitType).ToArray();

            events = events.Concat(events.SelectMany(e => e.GetInterfaces().Where(ee => TypeExtensions.IsAssignableTo <IRxn>(ee)))).Distinct().ToArray();

            StartEventPublishers(logger, container, events);
            StartrxnProcessors(logger, container, events, RxnSchedulers.TaskPool);
            StartReactions(logger, container, new[] { typeof(IRxn) }, RxnSchedulers.TaskPool); //only supports IRxn atm
        }
        public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var createFolderScript = string.Format(@"
            if(!(Test-Path ""{0}""))
            {{
            New-Item -ItemType directory -Path ""{0}""
            }}
            ", _path);

            var psExecutor = new PowerShellExecutor();
            psExecutor.Execute(server, createFolderScript);
        }
Пример #35
0
 /// <summary>
 /// Same are trycatch
 /// Reports any exceptions that occour through your reporter
 /// </summary>
 /// <param name="reporter">The person who will catch the exception</param>
 /// <param name="work">The work todo</param>
 public static T ReportExceptions <T>(this IReportStatus reporter, Func <T> work)
 {
     try
     {
         return(work.Invoke());
     }
     catch (Exception e)
     {
         reporter.OnError(e);
         return(default(T));
     }
 }
Пример #36
0
 /// <summary>
 /// Same are trycatch
 /// Reports any exceptions that occour through your reporter
 /// </summary>
 /// <param name="reporter">The person who will catch the exception</param>
 /// <param name="work">The work todo</param>
 public static dynamic ReportExceptions(this IReportStatus reporter, Func <dynamic> work)
 {
     try
     {
         return(work.Invoke());
     }
     catch (Exception e)
     {
         reporter.OnError(e);
         return(null);
     }
 }
Пример #37
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);
 }
Пример #38
0
        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);
        }
Пример #39
0
        private void ExecuteLocalOperations(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            Logger.WithLogSection("Local Operations", () =>
            {
                foreach (var localSequence in _localSequences)
                {
                    token.ThrowIfCancellationRequested();

                    LocalSequence sequence = localSequence;
                    Logger.WithLogSection(localSequence.Name, () => sequence.Execute(status, settings, token));
                }
            });
        }
Пример #40
0
        public virtual void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            foreach (var element in _sequence)
            {
                token.ThrowIfCancellationRequested();

                IExecuteRemotely elementToExecute = element;
                if (element is CompositeSequence)
                    elementToExecute.Execute(server, status, settings, token);
                else
                    Logger.WithLogSection(element.Name, () => elementToExecute.Execute(server, status, settings, token));
            }
        }
        public void BringOffline(string serverName, string farm, LoadBalancerSuspendMethod suspendMethod, IReportStatus status)
        {
            var result = ChangeServerState(serverName, farm, ServerState.Offline);

            if (!result.IsSuccessStatusCode)
                throw new ConDepLoadBalancerException(string.Format("Failed to take server {0} offline in loadbalancer. Returned status code was {1} with reason: {2}", serverName, result.StatusCode, result.ReasonPhrase));

            Logger.Verbose(string.Format("Waiting {0} seconds to give load balancer a chance to set server i maintenance mode.", _waitTimeInSecondsAfterSettingServerStateToOffline));
            Thread.Sleep(_waitTimeInSecondsAfterSettingServerStateToOffline * 1000);

            Logger.Verbose("Waiting for server connections to drain.");
            WaitForCurrentConnectionsToDrain(farm, serverName, _snmpEndpoint, _snmpPort, _snmpCommunity, DateTime.Now.AddSeconds(_config.TimeoutInSeconds));
        }
Пример #42
0
 private static void ExecutePostOps(ConDepSettings conDepSettings, IReportStatus status, CancellationToken token)
 {
     foreach (var server in conDepSettings.Config.Servers)
     {
         //Todo: This will not work with ConDep server. After first run, this key will always exist.
         if (ConDepGlobals.ServersWithPreOps.ContainsKey(server.Name))
         {
             var remotePostOps = new PostRemoteOps();
             remotePostOps.Execute(server, status, conDepSettings, token);
             ConDepGlobals.ServersWithPreOps.Remove(server.Name);
         }
     }
 }
        public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var createFolderScript = string.Format(@"
if(!(Test-Path ""{0}""))
{{
    New-Item -ItemType directory -Path ""{0}""
}}
", _path);

            var psExecutor = new PowerShellExecutor(server);

            psExecutor.Execute(createFolderScript);
        }
Пример #44
0
        public void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            Logger.WithLogSection(string.Format("Stopping ConDepNode on server {0}", server.Name), () =>
            {
                var executor = new PowerShellExecutor(server)
                {
                    LoadConDepModule = false, LoadConDepNodeModule = true
                };
                executor.Execute("Stop-ConDepNode", logOutput: false);
            });
        }
 public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
 {
     switch (_commandType)
     {
         case CommandType.CmdLine:
             ExecuteCommand(_cmd, server);
             break;
         case CommandType.ScriptFile:
             ExecuteScriptFile(_scriptFile, server);
             break;
         default:
             throw new ConDepInvalidEnumValueException(_commandType);
     }
 }
Пример #46
0
        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;
        }
Пример #47
0
 private void TempInstallWebDeploy(IReportStatus status)
 {
     if (!_options.WebDeployExist)
     {
         Logger.LogSectionStart("Deploying Web Deploy");
         try
         {
             WebDeployDeployer.DeployTo(_server);
         }
         finally
         {
             Logger.LogSectionEnd("Deploying Web Deploy");
         }
     }
 }
        public override void Execute(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            try
            {
                if(Directory.Exists(_preCompileOutputpath))
                    Directory.Delete(_preCompileOutputpath, true);

                _buildManager.PrecompileApplication(new PreCompileCallback());
            }
            catch (Exception ex)
            {
                Logger.Error(ex.Message);
                throw;
            }
        }
Пример #49
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;
        }
Пример #50
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");
                }
            }
        }
        public virtual IEnumerable<ServerConfig> GetServerExecutionOrder(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var servers = settings.Config.Servers;
            if (settings.Options.StopAfterMarkedServer)
            {
                return new[] { servers.SingleOrDefault(x => x.StopServer) ?? servers.First() };
            }

            if (settings.Options.ContinueAfterMarkedServer)
            {
                var markedServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                BringOnline(markedServer, status, settings, token);

                return servers.Count == 1 ? new List<ServerConfig>() : servers.Except(new[] { markedServer });
            }

            return servers;
        }
 public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
 {
     Logger.WithLogSection(Name, () =>
     {
         if (ConditionFulfilled(server))
         {
             foreach (var element in _sequence)
             {
                 IExecuteRemotely elementToExecute = element;
                 Logger.WithLogSection("Condition True, executing " + element.Name, () => elementToExecute.Execute(server, status, settings, token));
             }
         }
         else
         {
             Logger.Info("Condition evaluated to false. Will not execute.");
         }
     });
 }
        public override void Execute(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            _api = new Api(new ConDepNodeUrl(server, settings), server.DeploymentUser.UserName, server.DeploymentUser.Password, server.Node.TimeoutInSeconds.Value * 1000);
            var result = _api.SyncDir(_srcDir, _dstDir);

            if (result == null) return;

            if(result.Log.Count > 0)
            {
                foreach (var entry in result.Log)
                {
                    Logger.Info(entry);
                }
            }
            else
            {
                Logger.Info("Nothing to deploy. Everything is in sync.");
            }
        }
Пример #54
0
        public IReportStatus Execute(ServerConfig server, IReportStatus status, ConDepOptions options)
        {
            try
            {
                Logger.LogSectionStart("Infrastructure");
                foreach (var element in _sequence)
                {
                    element.Execute(server, status, options);
                    if (status.HasErrors)
                        return status;
                }
            }
            finally
            {
                Logger.LogSectionEnd("Infrastructure");
            }

            return status;
        }
        public override void Execute(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            Thread.Sleep(1000);
            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));
            }
        }
Пример #56
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;
        }
        public override IEnumerable<ServerConfig> GetServerExecutionOrder(IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var servers = settings.Config.Servers;
            if (settings.Options.StopAfterMarkedServer)
            {
                return new[] { servers.SingleOrDefault(x => x.StopServer) ?? servers.First() };
            }

            if (settings.Options.ContinueAfterMarkedServer)
            {
                var markedServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                if (servers.Count == 1)
                {
                    BringOnline(markedServer, status, settings, token);
                    return new List<ServerConfig>();
                }
                markedServer.LoadBalancerState.PreventDeployment = true;
            }

            return servers;
        }
Пример #58
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;
        }
Пример #59
0
        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 override void BringOffline(ServerConfig server, IReportStatus status, ConDepSettings settings, CancellationToken token)
        {
            var servers = _servers.ToList();
            var roundRobinMaxOfflineServers = (int)Math.Ceiling(((double)servers.Count) / 2);
            var activeServerIndex = _servers.ToList().IndexOf(server);

            if (settings.Options.StopAfterMarkedServer)
            {
                var manuelTestServer = servers.SingleOrDefault(x => x.StopServer) ?? servers.First();
                BringOffline(manuelTestServer, status, settings, _loadBalancer, token);
                return;
            }

            if (activeServerIndex == roundRobinMaxOfflineServers)
            {
                TurnRoundRobinServersAround(servers, settings, token, roundRobinMaxOfflineServers, status);
            }

            if (server.LoadBalancerState.PreventDeployment) return;

            if (server.LoadBalancerState.CurrentState == LoadBalanceState.Offline)
                return;

            if (settings.Options.ContinueAfterMarkedServer)
            {
                BringOffline(server, status, settings, _loadBalancer, token);
                server.LoadBalancerState.KeepOffline = true;
                return;
            }

            if (_servers.Count() == 1)
            {
                BringOffline(server, status, settings, _loadBalancer, token);
                return;
            }

            BringOffline(server, status, settings, _loadBalancer, token);
            server.LoadBalancerState.KeepOffline = true;
        }