コード例 #1
0
        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");
        }
コード例 #2
0
 static UIElement CreateMethodCallerControl(IOperationDescription m, object obj)
 {
     return(new MethodCallerButton()
     {
         OperationDescription = m, Target = obj
     });
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        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 })
            });
        }
コード例 #6
0
        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");
        }
コード例 #7
0
        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);
            }
        }
コード例 #8
0
        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");
        }
コード例 #9
0
        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);
        }
コード例 #10
0
        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);
        }
コード例 #11
0
        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;
        }
コード例 #12
0
        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;
            }
        }
コード例 #13
0
        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");
        }
コード例 #14
0
 public abstract Task DeleteAsync(IOperationDescription description, IOperationContext context);
コード例 #15
0
 public virtual Task UpdateAsync(IOperationDescription description, IFabricOperationResult result, IOperationContext context)
 {
     return(Task.FromResult(0));
 }
コード例 #16
0
 public abstract Task <IFabricOperationResult> GetAsync(IOperationDescription description, IOperationContext context);
コード例 #17
0
 public bool OperationExists(IOperationDescription description)
 {
     return(this.Operations.ContainsKey(description.ResourceId) &&
            this.Operations[description.ResourceId] == description.OperationSequenceNumber);
 }
コード例 #18
0
 public bool TryAdd(IOperationDescription description)
 {
     return(this.Operations.TryAdd(
                description.ResourceId,
                description.OperationSequenceNumber));
 }
コード例 #19
0
 public static void Add(string serviceId, IOperationDescription operationDescription)
 {
     serviceContractCache.Add(serviceId, new List<IOperationDescription>() { operationDescription });
 }
コード例 #20
0
 public static void Append(string serviceId, IOperationDescription operationDescription)
 {
     serviceContractCache[serviceId].Add(operationDescription);
 }
コード例 #21
0
        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);
        }
コード例 #22
0
 public abstract Task <IOperationStatus> CreateOperationStatusAsync(
     IOperationDescription operation,
     IOperationContext context);