public override async Task CreateAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "CreateAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ServiceOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var serviceOperationDescription = (ServiceOperationDescription)description; serviceOperationDescription.ApplicationName.ThrowIfNull(nameof(serviceOperationDescription.ApplicationName)); serviceOperationDescription.ServiceName.ThrowIfNull(nameof(serviceOperationDescription.ServiceName)); serviceOperationDescription.ServiceTypeName.ThrowIfNullOrWhiteSpace(nameof(serviceOperationDescription.ServiceTypeName)); serviceOperationDescription.PartitionDescription.ThrowIfNull(nameof(serviceOperationDescription.PartitionDescription)); Trace.WriteInfo( TraceType, "CreateAsync: Creating service. Name: {0}. Kind: {1}. Timeout: {2}", serviceOperationDescription.ServiceName, serviceOperationDescription.ServiceKind, context.OperationTimeout); await this.fabricClient.ServiceManager.CreateServiceAsync( this.CreateServiceDescription(serviceOperationDescription), context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "CreateAsync: Create service call accepted"); }
static UIElement CreateMethodCallerControl(IOperationDescription m, object obj) { return(new MethodCallerButton() { OperationDescription = m, Target = obj }); }
public override async Task <IOperationStatus> CreateOperationStatusAsync(IOperationDescription operationDescription, IOperationContext context) { context.ThrowIfNull(nameof(context)); ClusterOperationDescription description = operationDescription == null ? null : operationDescription as ClusterOperationDescription; Trace.WriteInfo(TraceType, "CreateOperationStatusAsync: begin"); IOperationStatus status = null; try { Trace.WriteInfo(TraceType, "CreateOperationStatusAsync: performing operation"); var errorDetails = await DoOperation(description, context); Trace.WriteInfo(TraceType, "CreateOperationStatusAsync: building status"); status = await BuildStatusAsync(description, context, errorDetails); } catch (Exception ex) { Trace.WriteError(this.TraceType, $"CreateOperationStatusAsync: Exception encountered: {ex}"); } Trace.WriteInfo(TraceType, "CreateOperationStatusAsync: end"); return(status); }
public override async Task DeleteAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "DeleteAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ApplicationTypeVersionOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appTypeDescription = (ApplicationTypeVersionOperationDescription)description; try { Trace.WriteInfo( TraceType, "DeleteAsync: Unprovisioning application type. Name: {0}. Version: {1}. Timeout: {2}", appTypeDescription.TypeName, appTypeDescription.TypeVersion, context.OperationTimeout); await this.fabricClient.ApplicationManager.UnprovisionApplicationAsync( appTypeDescription.TypeName, appTypeDescription.TypeVersion, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "DeleteAsync: Unprovisioning call accepted"); } catch (FabricElementNotFoundException nfe) { if (nfe.ErrorCode == FabricErrorCode.ApplicationTypeNotFound) { Trace.WriteInfo( TraceType, "DeleteAsync: Application type not found. Name: {0}. Version: {1}", appTypeDescription.TypeName, appTypeDescription.TypeVersion); return; } throw; } }
private IOperationStatus HandleOperationFailedStatus( IOperationDescription description, string operationName, Exception e) { if (IsTransientException(e)) { Trace.WriteError(this.TraceType, "{0}: transient exception encountered: {1}{2}", operationName, Environment.NewLine, e); return(null); } Trace.WriteError(this.TraceType, "{0}: Operation failed{1}{2}", operationName, Environment.NewLine, e); return(new ApplicationTypeVersionOperationStatus((ApplicationTypeVersionOperationDescription)description) { Status = ResultStatus.Failed, ErrorDetails = JObject.FromObject(new { Details = e }) }); }
public override async Task CreateAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "CreateAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ApplicationTypeVersionOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appTypeDescription = (ApplicationTypeVersionOperationDescription)description; appTypeDescription.TypeName.ThrowIfNullOrWhiteSpace(nameof(appTypeDescription.TypeName)); appTypeDescription.TypeVersion.ThrowIfNullOrWhiteSpace(nameof(appTypeDescription.TypeVersion)); appTypeDescription.AppPackageUrl.ThrowIfNullOrWhiteSpace(nameof(appTypeDescription.AppPackageUrl)); Uri appPackageUri; if (!Uri.TryCreate(appTypeDescription.AppPackageUrl, UriKind.Absolute, out appPackageUri)) { throw new InvalidOperationException($"{nameof(appTypeDescription.AppPackageUrl)} must have an absolute Uri value."); } Trace.WriteInfo( TraceType, "CreateAsync: Provisioning application package. Uri: {0}. Timeout: {1}", appPackageUri, context.OperationTimeout); await this.fabricClient.ApplicationManager.ProvisionApplicationAsync( new ExternalStoreProvisionApplicationTypeDescription( appPackageUri, appTypeDescription.TypeName, appTypeDescription.TypeVersion) { Async = true }, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "CreateAsync: Provisioning call accepted"); }
public override async Task DeleteAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "DeleteAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ServiceOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var serviceOperationDescription = (ServiceOperationDescription)description; try { Trace.WriteInfo( TraceType, "DeleteAsync: Deleting service. Name: {0}. Timeout: {1}", serviceOperationDescription.ServiceName, context.OperationTimeout); await this.fabricClient.ServiceManager.DeleteServiceAsync( new DeleteServiceDescription(serviceOperationDescription.ServiceName), context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "DeleteAsync: Delete service call accepted"); } catch (FabricServiceNotFoundException) { Trace.WriteInfo( TraceType, "DeleteAsync: Service not found. Name: {0}", serviceOperationDescription.ServiceName); } }
public override async Task UpdateAsync(IOperationDescription description, IFabricOperationResult result, IOperationContext context) { Trace.WriteInfo(TraceType, "UpdateAsync called"); description.ThrowIfNull(nameof(description)); result.ThrowIfNull(nameof(result)); result.OperationStatus.ThrowIfNull(nameof(result.OperationStatus)); result.QueryResult.ThrowIfNull(nameof(result.QueryResult)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ServiceOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } if (!this.ValidObjectType <ServiceClientFabricQueryResult>(result.QueryResult, out errorMessage)) { throw new InvalidCastException(errorMessage); } var serviceOperationDescription = (ServiceOperationDescription)description; serviceOperationDescription.ServiceName.ThrowIfNull(nameof(serviceOperationDescription.ServiceName)); Trace.WriteInfo( TraceType, "UpdateAsync: Updating service. Name: {0}. Timeout: {1}", serviceOperationDescription.ServiceName, context.OperationTimeout); await this.fabricClient.ServiceManager.UpdateServiceAsync( serviceOperationDescription.ServiceName, this.CreateServiceUpdateDescription(serviceOperationDescription), context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "UpdateAsync: Service update call accepted"); }
public override async Task <IFabricOperationResult> GetAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "GetAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ServiceOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var serviceOperationDescription = (ServiceOperationDescription)description; Service clusterService = (await this.fabricClient.QueryManager.GetServiceListAsync( serviceOperationDescription.ApplicationName, serviceOperationDescription.ServiceName, context.ContinuationToken, context.GetRemainingTimeOrThrow(), context.CancellationToken)).FirstOrDefault(); var result = new FabricOperationResult() { OperationStatus = null, QueryResult = new ServiceClientFabricQueryResult(clusterService) }; Trace.WriteInfo( TraceType, null == clusterService ? "GetAsync: Service not found. Name: {0}." : "GetAsync: Service exists. Name: {0}.", serviceOperationDescription.ServiceName); if (null == clusterService) { if (description.OperationType == OperationType.Delete) { result.OperationStatus = new ServiceOperationStatus(serviceOperationDescription) { Status = ResultStatus.Succeeded, Progress = new JObject(), ErrorDetails = new JObject() }; return(result); } return(null); } var status = GetResultStatus(clusterService.ServiceStatus); var progress = new JObject(); var errorDetails = new JObject(); //TODO: How to get the error details? result.OperationStatus = new ServiceOperationStatus(serviceOperationDescription) { Status = status, Progress = progress, ErrorDetails = errorDetails }; return(result); }
public override async Task <IFabricOperationResult> GetAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "GetAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType <ApplicationTypeVersionOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appTypeDescription = (ApplicationTypeVersionOperationDescription)description; var clusterAppTypes = await this.fabricClient.QueryManager.GetApplicationTypeListAsync( appTypeDescription.TypeName, context.GetRemainingTimeOrThrow(), context.CancellationToken); var clusterAppType = clusterAppTypes .FirstOrDefault(a => a.ApplicationTypeVersion == appTypeDescription.TypeVersion); var result = new FabricOperationResult() { OperationStatus = null, QueryResult = new ApplicationTypeFabricQueryResult(clusterAppType) }; Trace.WriteInfo( TraceType, null == clusterAppType ? "GetAsync: Application type not found. Name: {0}. Version: {1}" : "GetAsync: Application type exists. Name: {0}. Version: {1}", appTypeDescription.TypeName, appTypeDescription.TypeVersion); if (null == clusterAppType) { if (description.OperationType == OperationType.Delete) { result.OperationStatus = new ApplicationTypeVersionOperationStatus(appTypeDescription) { Status = ResultStatus.Succeeded, Progress = new JObject(), ErrorDetails = new JObject() }; return(result); } return(null); } var status = GetResultStatus(clusterAppType.Status); var progress = JObject.FromObject(new { Details = clusterAppType.StatusDetails }); var errorDetails = new JObject(); if (status == ResultStatus.Failed) { errorDetails = JObject.FromObject(new { Details = clusterAppType.StatusDetails }); } var applicationTypeOperationStatus = new ApplicationTypeVersionOperationStatus(appTypeDescription) { Status = status, Progress = progress, ErrorDetails = errorDetails }; if (status == ResultStatus.Succeeded) { applicationTypeOperationStatus.DefaultParameterList = new Dictionary <string, string>(clusterAppType.DefaultParameters.AsDictionary()); } result.OperationStatus = applicationTypeOperationStatus; return(result); }
public override async Task<IFabricOperationResult> GetAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "GetAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType<ApplicationOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appDescription = (ApplicationOperationDescription)description; Application clusterApp = (await this.fabricClient.QueryManager.GetApplicationListAsync( appDescription.ApplicationUri, context.ContinuationToken, context.GetRemainingTimeOrThrow(), context.CancellationToken)).FirstOrDefault(); var result = new FabricOperationResult() { OperationStatus = null, QueryResult = new ApplicationFabricQueryResult(clusterApp) }; Trace.WriteInfo( TraceType, null == clusterApp ? "GetAsync: Application not found. Name: {0}." : "GetAsync: Application exists. Name: {0}.", appDescription.ApplicationUri); if (null == clusterApp) { if (description.OperationType == OperationType.Delete) { result.OperationStatus = new ApplicationOperationStatus(appDescription) { Status = ResultStatus.Succeeded, Progress = new JObject(), ErrorDetails = new JObject() }; return result; } return null; } var status = GetResultStatus(clusterApp.ApplicationStatus); var progress = new JObject(); var errorDetails = new JObject(); if ((clusterApp.ApplicationStatus == ApplicationStatus.Ready && !appDescription.TypeVersion.Equals(clusterApp.ApplicationTypeVersion)) || clusterApp.ApplicationStatus == ApplicationStatus.Upgrading || clusterApp.ApplicationStatus == ApplicationStatus.Failed) { // TODO: Can deletions end up in a failed state? ApplicationUpgradeProgress upgradingApp = await this.fabricClient.ApplicationManager.GetApplicationUpgradeProgressAsync( appDescription.ApplicationUri, context.OperationTimeout, context.CancellationToken); if (upgradingApp.UpgradeState == ApplicationUpgradeState.RollingBackCompleted) { // clusterApp.ApplicationStatus == ApplicationStatus.Ready status = ResultStatus.Failed; errorDetails = JObject.FromObject( new { FailureReason = upgradingApp.FailureReason.HasValue ? upgradingApp.FailureReason.ToString() : string.Empty, Details = upgradingApp.UpgradeStatusDetails }); } else if (upgradingApp.UpgradeState == ApplicationUpgradeState.RollingForwardCompleted) { // clusterApp.ApplicationStatus == ApplicationStatus.Ready status = ResultStatus.Failed; errorDetails = JObject.FromObject(new { Details = $"Deployment completed with {clusterApp.ApplicationTypeVersion} version. Deployment goal was overriden through SF native APIs." }); } else if (upgradingApp.UpgradeState == ApplicationUpgradeState.RollingBackInProgress || upgradingApp.UpgradeState == ApplicationUpgradeState.RollingForwardInProgress || upgradingApp.UpgradeState == ApplicationUpgradeState.RollingForwardPending) { // clusterApp.ApplicationStatus == ApplicationStatus.Upgrading status = ResultStatus.InProgress; progress = JObject.FromObject(upgradingApp.CurrentUpgradeDomainProgress); } else if (upgradingApp.UpgradeState == ApplicationUpgradeState.Failed) { // clusterApp.ApplicationStatus == ApplicationStatus.Failed status = ResultStatus.Failed; errorDetails = JObject.FromObject( new { FailureReason = upgradingApp.FailureReason.HasValue ? upgradingApp.FailureReason.ToString() : string.Empty, Details = upgradingApp.UpgradeStatusDetails }); } } result.OperationStatus = new ApplicationOperationStatus(appDescription) { Status = status, Progress = progress, ErrorDetails = errorDetails }; return result; }
public override async Task UpdateAsync(IOperationDescription description, IFabricOperationResult result, IOperationContext context) { Trace.WriteInfo(TraceType, "UpdateAsync called"); description.ThrowIfNull(nameof(description)); result.ThrowIfNull(nameof(result)); result.OperationStatus.ThrowIfNull(nameof(result.OperationStatus)); result.QueryResult.ThrowIfNull(nameof(result.QueryResult)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType<ApplicationOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } if (!this.ValidObjectType<ApplicationFabricQueryResult>(result.QueryResult, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appDescription = (ApplicationOperationDescription)description; appDescription.TypeVersion.ThrowIfNullOrWhiteSpace(nameof(appDescription.TypeVersion)); appDescription.ApplicationUri.ThrowIfNull(nameof(appDescription.ApplicationUri)); var appResult = (ApplicationFabricQueryResult)result.QueryResult; var healthPolicy = new ApplicationHealthPolicy(); var defaultServiceTypeHealthPolicy = new ServiceTypeHealthPolicy(); if (appDescription.UpgradePolicy?.ApplicationHealthPolicy != null) { healthPolicy.ConsiderWarningAsError = appDescription.UpgradePolicy.ApplicationHealthPolicy.ConsiderWarningAsError; healthPolicy.MaxPercentUnhealthyDeployedApplications = appDescription.UpgradePolicy.ApplicationHealthPolicy.MaxPercentUnhealthyDeployedApplications; if (appDescription.UpgradePolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy != null) { defaultServiceTypeHealthPolicy.MaxPercentUnhealthyPartitionsPerService = appDescription.UpgradePolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy .MaxPercentUnhealthyPartitionsPerService; defaultServiceTypeHealthPolicy.MaxPercentUnhealthyReplicasPerPartition = appDescription.UpgradePolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy .MaxPercentUnhealthyReplicasPerPartition; defaultServiceTypeHealthPolicy.MaxPercentUnhealthyServices = appDescription.UpgradePolicy.ApplicationHealthPolicy.DefaultServiceTypeHealthPolicy .MaxPercentUnhealthyServices; healthPolicy.DefaultServiceTypeHealthPolicy = defaultServiceTypeHealthPolicy; } } var monitoringPolicy = new RollingUpgradeMonitoringPolicy(); if (appDescription.UpgradePolicy?.RollingUpgradeMonitoringPolicy != null) { monitoringPolicy.FailureAction = (UpgradeFailureAction) Enum.Parse( typeof (UpgradeFailureAction), appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.FailureAction.ToString(), true); monitoringPolicy.HealthCheckRetryTimeout = appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.HealthCheckRetryTimeout; monitoringPolicy.HealthCheckStableDuration = appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.HealthCheckStableDuration; monitoringPolicy.HealthCheckWaitDuration = appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.HealthCheckWaitDuration; monitoringPolicy.UpgradeDomainTimeout = appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.UpgradeDomainTimeout; monitoringPolicy.UpgradeTimeout = appDescription.UpgradePolicy.RollingUpgradeMonitoringPolicy.UpgradeTimeout; } var policyDescription = new MonitoredRollingApplicationUpgradePolicyDescription() { UpgradeMode = RollingUpgradeMode.Monitored, HealthPolicy = healthPolicy, MonitoringPolicy = monitoringPolicy }; if (appDescription.UpgradePolicy != null) { if (appDescription.UpgradePolicy.ForceRestart.HasValue) { policyDescription.ForceRestart = appDescription.UpgradePolicy.ForceRestart.Value; } if (appDescription.UpgradePolicy.UpgradeReplicaSetCheckTimeout.HasValue) { policyDescription.UpgradeReplicaSetCheckTimeout = appDescription.UpgradePolicy.UpgradeReplicaSetCheckTimeout.Value; } } // Update var updateDescription = new ApplicationUpdateDescription(appDescription.ApplicationUri) { RemoveApplicationCapacity = appDescription.RemoveApplicationCapacity }; if (appDescription.MinimumNodes.HasValue) { updateDescription.MinimumNodes = appDescription.MinimumNodes.Value; } if (appDescription.MaximumNodes.HasValue) { updateDescription.MaximumNodes = appDescription.MaximumNodes.Value; } if (appDescription.Metrics != null && appDescription.Metrics.Any()) { updateDescription.Metrics = new List<ApplicationMetricDescription>(); foreach (var metric in appDescription.Metrics) { updateDescription.Metrics.Add( new ApplicationMetricDescription() { Name = metric.Name, MaximumNodeCapacity = metric.MaximumCapacity, NodeReservationCapacity = metric.ReservationCapacity, TotalApplicationCapacity = metric.TotalApplicationCapacity }); } } Trace.WriteInfo( TraceType, "UpdateAsync: Updating application. Name: {0}. Timeout: {1}", updateDescription.ApplicationName, context.OperationTimeout); await this.fabricClient.ApplicationManager.UpdateApplicationAsync( updateDescription, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "UpdateAsync: Application update call accepted"); // Upgrade var upgradeDescription = new ApplicationUpgradeDescription() { ApplicationName = appDescription.ApplicationUri, TargetApplicationTypeVersion = appDescription.TypeVersion, UpgradePolicyDescription = policyDescription }; if (appDescription.Parameters != null) { upgradeDescription.ApplicationParameters.Add(appDescription.Parameters.ToNameValueCollection()); } try { Trace.WriteInfo( TraceType, "UpdateAsync: Upgrading application. Name: {0}. Version: {1}. TargetVersion: {2}. Timeout: {3}", upgradeDescription.ApplicationName, appResult.Application.ApplicationTypeVersion, upgradeDescription.TargetApplicationTypeVersion, context.OperationTimeout); await this.fabricClient.ApplicationManager.UpgradeApplicationAsync( upgradeDescription, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "UpdateAsync: Application upgrade call accepted"); } catch (FabricException fe) { if (fe.ErrorCode == FabricErrorCode.ApplicationAlreadyInTargetVersion) { Trace.WriteInfo(TraceType, "UpdateAsync: Application already in target version: {0}.", upgradeDescription.TargetApplicationTypeVersion); return; } if (fe.ErrorCode == FabricErrorCode.ApplicationUpgradeInProgress) { Trace.WriteInfo(TraceType, "UpdateAsync: Application upgrade in progress with same version: {0}", upgradeDescription.TargetApplicationTypeVersion); } else { Trace.WriteError(TraceType, "UpdateAsync: Application upgrade encountered an exception: {0}", fe); throw; } } catch (Exception e) { Trace.WriteInfo(TraceType, "UpdateAsync: Application upgrade encountered an exception: {0}", e); throw; } // UpgradeUpdate ApplicationUpgradeProgress upgradeProgress = null; try { upgradeProgress = await this.fabricClient.ApplicationManager.GetApplicationUpgradeProgressAsync( appDescription.ApplicationUri, context.OperationTimeout, context.CancellationToken); } catch (Exception) { Trace.WriteWarning( TraceType, "UpdateAsync: Failed to get the application upgrade progress to determine the parameters for upgrade update. Need to retry the operation. Application Name: {0}", appDescription.ApplicationUri); throw new FabricTransientException(); } ApplicationUpgradeUpdateDescription upgradeUpdateDescription; if (upgradeProgress.UpgradeState == ApplicationUpgradeState.RollingBackInProgress) { // During rollback we can only change below properties upgradeUpdateDescription = new ApplicationUpgradeUpdateDescription() { ApplicationName = appDescription.ApplicationUri, UpgradeReplicaSetCheckTimeout = appDescription.UpgradePolicy.UpgradeReplicaSetCheckTimeout, ForceRestart = appDescription.UpgradePolicy.ForceRestart }; } else { upgradeUpdateDescription = new ApplicationUpgradeUpdateDescription() { ApplicationName = appDescription.ApplicationUri, UpgradeDomainTimeout = monitoringPolicy.UpgradeDomainTimeout, UpgradeTimeout = monitoringPolicy.UpgradeTimeout, HealthCheckRetryTimeout = monitoringPolicy.HealthCheckRetryTimeout, HealthCheckWaitDuration = monitoringPolicy.HealthCheckWaitDuration, HealthCheckStableDuration = monitoringPolicy.HealthCheckStableDuration, UpgradeReplicaSetCheckTimeout = policyDescription.UpgradeReplicaSetCheckTimeout, ForceRestart = policyDescription.ForceRestart, FailureAction = monitoringPolicy.FailureAction, HealthPolicy = healthPolicy }; } try { Trace.WriteInfo( TraceType, "UpdateAsync: Updating application upgrade in progress. Name: {0}. Timeout: {1}", upgradeUpdateDescription.ApplicationName, context.OperationTimeout); await this.fabricClient.ApplicationManager.UpdateApplicationUpgradeAsync( upgradeUpdateDescription, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "UpdateAsync: Update application upgrade call accepted"); } catch (FabricException fe) { if (fe.ErrorCode == FabricErrorCode.ApplicationNotUpgrading) { Trace.WriteInfo(TraceType, "UpdateAsync: No application upgrade in progress"); return; } } catch (Exception e) { Trace.WriteInfo(TraceType, "UpdateAsync: Update application upgrade encountered an exception: {0}", e); throw; } }
public override async Task CreateAsync(IOperationDescription description, IOperationContext context) { Trace.WriteInfo(TraceType, "CreateAsync called"); description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); string errorMessage; if (!this.ValidObjectType<ApplicationOperationDescription>(description, out errorMessage)) { throw new InvalidCastException(errorMessage); } var appDescription = (ApplicationOperationDescription)description; appDescription.ApplicationUri.ThrowIfNull(nameof(appDescription.ApplicationUri)); appDescription.TypeName.ThrowIfNullOrWhiteSpace(nameof(appDescription.TypeName)); appDescription.TypeVersion.ThrowIfNullOrWhiteSpace(nameof(appDescription.TypeVersion)); var createDescription = new ApplicationDescription( appDescription.ApplicationUri, appDescription.TypeName, appDescription.TypeVersion, appDescription.Parameters?.ToNameValueCollection()); if (appDescription.MinimumNodes.HasValue) { createDescription.MinimumNodes = appDescription.MinimumNodes.Value; } if (appDescription.MaximumNodes.HasValue) { createDescription.MaximumNodes = appDescription.MaximumNodes.Value; } if (appDescription.Metrics != null && appDescription.Metrics.Any()) { createDescription.Metrics = new List<ApplicationMetricDescription>(); foreach (var metric in appDescription.Metrics) { createDescription.Metrics.Add( new ApplicationMetricDescription() { Name = metric.Name, MaximumNodeCapacity = metric.MaximumCapacity, NodeReservationCapacity = metric.ReservationCapacity, TotalApplicationCapacity = metric.TotalApplicationCapacity }); } } Trace.WriteInfo( TraceType, "CreateAsync: Creating application. Name: {0}. TypeName: {1}. TypeVersion: {2}. Timeout: {3}", appDescription.ApplicationUri, appDescription.TypeName, appDescription.TypeVersion, context.OperationTimeout); await this.fabricClient.ApplicationManager.CreateApplicationAsync( createDescription, context.OperationTimeout, context.CancellationToken); Trace.WriteInfo(TraceType, "CreateAsync: Create application call accepted"); }
public abstract Task DeleteAsync(IOperationDescription description, IOperationContext context);
public virtual Task UpdateAsync(IOperationDescription description, IFabricOperationResult result, IOperationContext context) { return(Task.FromResult(0)); }
public abstract Task <IFabricOperationResult> GetAsync(IOperationDescription description, IOperationContext context);
public bool OperationExists(IOperationDescription description) { return(this.Operations.ContainsKey(description.ResourceId) && this.Operations[description.ResourceId] == description.OperationSequenceNumber); }
public bool TryAdd(IOperationDescription description) { return(this.Operations.TryAdd( description.ResourceId, description.OperationSequenceNumber)); }
public static void Add(string serviceId, IOperationDescription operationDescription) { serviceContractCache.Add(serviceId, new List<IOperationDescription>() { operationDescription }); }
public static void Append(string serviceId, IOperationDescription operationDescription) { serviceContractCache[serviceId].Add(operationDescription); }
public override async Task <IOperationStatus> CreateOperationStatusAsync( IOperationDescription description, IOperationContext context) { description.ThrowIfNull(nameof(description)); context.ThrowIfNull(nameof(context)); Trace.WriteInfo(TraceType, "CreateOperationStatusAsync called"); IOperationStatus status = null; try { IFabricOperationResult result = null; if (!this.Operations.OperationExists(description)) { result = await this.fabricClient.GetAsync(description, context); status = result?.OperationStatus; var operationContext = new OperationContext( context.CancellationToken, Constants.MaxOperationTimeout, context.ContinuationToken); switch (description.OperationType) { case OperationType.CreateOrUpdate: if (null == status) { try { await this.fabricClient.CreateAsync( description, operationContext); } catch (Exception e) { return(this.HandleOperationFailedStatus( description, nameof(this.fabricClient.CreateAsync), e)); } } break; case OperationType.Delete: try { await this.fabricClient.DeleteAsync( description, operationContext); } catch (Exception e) { return(this.HandleOperationFailedStatus( description, nameof(this.fabricClient.DeleteAsync), e)); } break; default: Trace.WriteError(this.TraceType, "Unhandled operation type: {0}", description.OperationType); break; } Trace.WriteInfo( this.TraceType, this.Operations.TryAdd(description) ? "CreateOperationStatusAsync: Operation started for resource. OperationId: {0}. ResourceId: {1}." : "CreateOperationStatusAsync: Failed to track operation for resource. OperationId: {0}. ResourceId: {1}.", description.OperationSequenceNumber, description.ResourceId); } result = await this.fabricClient.GetAsync(description, context); status = result?.OperationStatus; } catch (Exception e) { ResourceCommandProcessor.HandleException("CreateOperationStatusAsync", e, this.TraceType); } Trace.WriteInfo( TraceType, "CreateOperationStatusAsync: completed {0}", status.ToFormattedString()); return(status); }
public abstract Task <IOperationStatus> CreateOperationStatusAsync( IOperationDescription operation, IOperationContext context);