internal bool IsForceRestartRequired() { var currentSectionNames = ClusterUpgradeStateBase.GetFabricSectionNames(this.ExternalState); var previousSectionNames = ClusterUpgradeStateBase.GetFabricSectionNames(this.PreviousExternalState); IEnumerable <string> changedAddOnServices = ClusterUpgradeStateBase.GetChangedAddOnServices(currentSectionNames, previousSectionNames); if (changedAddOnServices.Any()) { this.TraceLogger.WriteInfo( TraceType, "Upgrade requires fabric restart. Changed add-on services: {0}", string.Join(",", changedAddOnServices)); return(true); } return(false); }
public bool TryCreateUpgradeState( IUserConfig csmConfig, IAdminConfig wrpConfig, ClusterNodeConfig nodeConfig, out ClusterUpgradeStateBase clusterUpgradeState) { csmConfig.MustNotBeNull("csmConfig"); wrpConfig.MustNotBeNull("wrpConfig"); nodeConfig.MustNotBeNull("nodeConfig"); bool hasReliabilityScaledUp = false; clusterUpgradeState = null; if (this.clusterResource.Current == null) { clusterUpgradeState = this.upgradeStateActivator.CreateBaselineUpgradeState( csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger); } else { HashSet <string> certsAdded, certsRemoved; bool hasCertChanged = HasCertficateChanged( csmConfig, this.clusterResource.Current.CSMConfig, out certsAdded, out certsRemoved); hasReliabilityScaledUp = csmConfig.ReliabilityLevel > this.clusterResource.Current.CSMConfig.ReliabilityLevel; var hasReliabilityScaledDown = csmConfig.ReliabilityLevel < this.clusterResource.Current.CSMConfig.ReliabilityLevel; bool hasNodeStatusChanged = nodeConfig.Version != this.clusterResource.Current.NodeConfig.Version; if (hasCertChanged && (hasReliabilityScaledUp || hasReliabilityScaledDown)) { throw new ClusterManagementException(ClusterManagementErrorCode.CertificateAndScaleUpgradeTogetherNotAllowed); } if (hasCertChanged && hasNodeStatusChanged) { throw new ClusterManagementException(ClusterManagementErrorCode.CertificateAndScaleUpgradeTogetherNotAllowed); } if (hasNodeStatusChanged && this.clusterResource.NodeTypeNodeStatusList == null) { throw new ClusterManagementException(ClusterManagementErrorCode.ScaleUpAndScaleDownUpgradeNotAllowedForOlderClusters); } if (hasCertChanged) { clusterUpgradeState = this.upgradeStateActivator.CreateCertificateClusterUpgradeState( csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger, certsAdded, certsRemoved); } else if (hasReliabilityScaledDown || hasReliabilityScaledUp) { clusterUpgradeState = this.upgradeStateActivator.CreateAutoScaleClusterUpgradeStateBase( true /*initiatedByCsmRequest*/, csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger); } else if (hasNodeStatusChanged) { clusterUpgradeState = this.upgradeStateActivator.CreateAutoScaleClusterUpgradeStateBase( false /*initiatedByCsmRequest*/, csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger); } else { clusterUpgradeState = this.upgradeStateActivator.CreateSimpleUpgradeState( csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger); } } clusterUpgradeState.ValidateSettingChanges(); bool processingSuccess = clusterUpgradeState.StartProcessing(); if (!processingSuccess && hasReliabilityScaledUp) { //// If scaleup auto upgrade did not go through (only case now is enough nodes being available), //// then accept the request and complete the upgrade to ARM with success this.traceLogger.WriteInfo(TraceType, "TryCreateUpgradeState: StartProcessing returns false, so create SimpleUpgrade"); clusterUpgradeState = this.upgradeStateActivator.CreateSimpleUpgradeState( csmConfig, wrpConfig, nodeConfig, this.clusterResource, this.traceLogger); clusterUpgradeState.ValidateSettingChanges(); return(clusterUpgradeState.StartProcessing()); } this.traceLogger.WriteInfo(TraceType, "TryCreateUpgradeState: {0} is created.", clusterUpgradeState.GetType().Name); return(processingSuccess); }