Ejemplo n.º 1
0
        public async Task UpdateServiceDescriptionAsync(Uri serviceName, ServiceRuntimeDescription description, TimeSpan timeout, CancellationToken cancellationToken)
        {
            if (serviceName == null ||
                description == null)
            {
                return;
            }

            var updateDesc = new StatefulServiceUpdateDescription()
            {
                MinReplicaSetSize    = description.MinReplicaSetSize,
                TargetReplicaSetSize = description.TargetReplicaSetSize,
                PlacementConstraints = description.PlacementConstraints
            };

            Trace.WriteInfo(
                TraceType,
                "Calling UpdateServiceDescription for {0}. TargetReplicaSetSize={1}, MinReplicaSetSize={2}. PlacementConstraints={3}",
                serviceName,
                updateDesc.TargetReplicaSetSize,
                updateDesc.MinReplicaSetSize,
                updateDesc.PlacementConstraints ?? "null");

            var timeoutHelper = new TimeoutHelper(timeout, Constants.MaxOperationTimeout);

            await FabricClientRetryHelper.ExecuteFabricActionWithRetryAsync(
                () => this.FabricClient.ServiceManager.UpdateServiceAsync(serviceName, updateDesc, timeoutHelper.GetOperationTimeout(), cancellationToken),
                timeoutHelper.GetOperationTimeout(),
                cancellationToken);
        }
Ejemplo n.º 2
0
        /// <inheritdoc/>
        protected override void ProcessRecordInternal()
        {
            ServiceUpdateDescription serviceUpdateDescription = null;

            if (this.Stateful.IsPresent)
            {
                serviceUpdateDescription = new StatefulServiceUpdateDescription(
                    flags: this.Flags,
                    placementConstraints: this.PlacementConstraints,
                    correlationScheme: this.CorrelationScheme,
                    loadMetrics: this.LoadMetrics,
                    servicePlacementPolicies: this.ServicePlacementPolicies,
                    defaultMoveCost: this.DefaultMoveCost,
                    scalingPolicies: this.ScalingPolicies,
                    serviceDnsName: this.ServiceDnsName,
                    tagsForPlacement: this.TagsForPlacement,
                    tagsForRunning: this.TagsForRunning,
                    targetReplicaSetSize: this.TargetReplicaSetSize,
                    minReplicaSetSize: this.MinReplicaSetSize,
                    replicaRestartWaitDurationSeconds: this.ReplicaRestartWaitDurationSeconds,
                    quorumLossWaitDurationSeconds: this.QuorumLossWaitDurationSeconds,
                    standByReplicaKeepDurationSeconds: this.StandByReplicaKeepDurationSeconds,
                    servicePlacementTimeLimitSeconds: this.ServicePlacementTimeLimitSeconds,
                    dropSourceReplicaOnMove: this.DropSourceReplicaOnMove,
                    replicaLifecycleDescription: this.ReplicaLifecycleDescription,
                    auxiliaryReplicaCount: this.AuxiliaryReplicaCount);
            }
            else if (this.Stateless.IsPresent)
            {
                serviceUpdateDescription = new StatelessServiceUpdateDescription(
                    flags: this.Flags,
                    placementConstraints: this.PlacementConstraints,
                    correlationScheme: this.CorrelationScheme,
                    loadMetrics: this.LoadMetrics,
                    servicePlacementPolicies: this.ServicePlacementPolicies,
                    defaultMoveCost: this.DefaultMoveCost,
                    scalingPolicies: this.ScalingPolicies,
                    serviceDnsName: this.ServiceDnsName,
                    tagsForPlacement: this.TagsForPlacement,
                    tagsForRunning: this.TagsForRunning,
                    instanceCount: this.InstanceCount,
                    minInstanceCount: this.MinInstanceCount,
                    minInstancePercentage: this.MinInstancePercentage,
                    instanceCloseDelayDurationSeconds: this.InstanceCloseDelayDurationSeconds,
                    instanceLifecycleDescription: this.InstanceLifecycleDescription,
                    instanceRestartWaitDurationSeconds: this.InstanceRestartWaitDurationSeconds);
            }

            this.ServiceFabricClient.Services.UpdateServiceAsync(
                serviceId: this.ServiceId,
                serviceUpdateDescription: serviceUpdateDescription,
                serverTimeout: this.ServerTimeout,
                cancellationToken: this.CancellationToken).GetAwaiter().GetResult();

            Console.WriteLine("Success!");
        }
Ejemplo n.º 3
0
        protected override void ProcessRecord()
        {
            ServiceGroupUpdateDescription serviceGroupUpdateDescription = new ServiceGroupUpdateDescription();

            if (this.Stateful)
            {
                var statefulServiceUpdateDescription = new StatefulServiceUpdateDescription();
                if (this.TargetReplicaSetSize.HasValue)
                {
                    statefulServiceUpdateDescription.TargetReplicaSetSize = this.TargetReplicaSetSize.Value;
                }

                if (this.MinReplicaSetSize.HasValue)
                {
                    statefulServiceUpdateDescription.MinReplicaSetSize = this.MinReplicaSetSize.Value;
                }

                if (this.ReplicaRestartWaitDuration.HasValue)
                {
                    statefulServiceUpdateDescription.ReplicaRestartWaitDuration = this.ReplicaRestartWaitDuration.Value;
                }

                if (this.QuorumLossWaitDuration.HasValue)
                {
                    statefulServiceUpdateDescription.QuorumLossWaitDuration = this.QuorumLossWaitDuration.Value;
                }

                serviceGroupUpdateDescription.ServiceUpdateDescription = statefulServiceUpdateDescription;
            }
            else
            {
                var statelessServiceUpdateDescription = new StatelessServiceUpdateDescription();
                if (this.InstanceCount.HasValue)
                {
                    statelessServiceUpdateDescription.InstanceCount = this.InstanceCount.Value;
                }

                serviceGroupUpdateDescription.ServiceUpdateDescription = statelessServiceUpdateDescription;
            }

            if (this.ShouldProcess(this.ServiceName.OriginalString))
            {
                if (this.Force || this.ShouldContinue(string.Empty, string.Empty))
                {
                    this.UpdateServiceGroup(this.ServiceName, serviceGroupUpdateDescription);
                }
            }
        }
Ejemplo n.º 4
0
        public async Task UpdateServiceDescriptionAsync(Uri serviceName, ReplicaSetSize replicaSetSize, TimeSpan timeout, CancellationToken cancellationToken)
        {
            var updateDesc = new StatefulServiceUpdateDescription()
            {
                MinReplicaSetSize    = replicaSetSize.MinReplicaSetSize,
                TargetReplicaSetSize = replicaSetSize.TargetReplicaSetSize
            };

            Trace.WriteInfo(
                TraceType,
                "Calling UpdateServiceDescription for {0}. Target={1}, Min={2}.",
                serviceName,
                updateDesc.TargetReplicaSetSize,
                updateDesc.MinReplicaSetSize);

            var timeoutHelper = new TimeoutHelper(timeout, Constants.MaxOperationTimeout);

            await FabricClientRetryHelper.ExecuteFabricActionWithRetryAsync(
                () => this.FabricClient.ServiceManager.UpdateServiceAsync(serviceName, updateDesc, timeoutHelper.GetOperationTimeout(), cancellationToken),
                timeoutHelper.GetOperationTimeout(),
                cancellationToken);
        }
        /// <summary>
        /// Serializes the object to JSON.
        /// </summary>
        /// <param name="writer">The <see cref="T: Newtonsoft.Json.JsonWriter" /> to write to.</param>
        /// <param name="obj">The object to serialize to JSON.</param>
        internal static void Serialize(JsonWriter writer, StatefulServiceUpdateDescription obj)
        {
            // Required properties are always serialized, optional properties are serialized when not null.
            writer.WriteStartObject();
            writer.WriteProperty(obj.ServiceKind.ToString(), "ServiceKind", JsonWriterExtensions.WriteStringValue);
            writer.WriteProperty(obj.DefaultMoveCost, "DefaultMoveCost", MoveCostConverter.Serialize);
            if (obj.Flags != null)
            {
                writer.WriteProperty(obj.Flags, "Flags", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.PlacementConstraints != null)
            {
                writer.WriteProperty(obj.PlacementConstraints, "PlacementConstraints", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.CorrelationScheme != null)
            {
                writer.WriteEnumerableProperty(obj.CorrelationScheme, "CorrelationScheme", ServiceCorrelationDescriptionConverter.Serialize);
            }

            if (obj.LoadMetrics != null)
            {
                writer.WriteEnumerableProperty(obj.LoadMetrics, "LoadMetrics", ServiceLoadMetricDescriptionConverter.Serialize);
            }

            if (obj.ServicePlacementPolicies != null)
            {
                writer.WriteEnumerableProperty(obj.ServicePlacementPolicies, "ServicePlacementPolicies", ServicePlacementPolicyDescriptionConverter.Serialize);
            }

            if (obj.ScalingPolicies != null)
            {
                writer.WriteEnumerableProperty(obj.ScalingPolicies, "ScalingPolicies", ScalingPolicyDescriptionConverter.Serialize);
            }

            if (obj.TargetReplicaSetSize != null)
            {
                writer.WriteProperty(obj.TargetReplicaSetSize, "TargetReplicaSetSize", JsonWriterExtensions.WriteIntValue);
            }

            if (obj.MinReplicaSetSize != null)
            {
                writer.WriteProperty(obj.MinReplicaSetSize, "MinReplicaSetSize", JsonWriterExtensions.WriteIntValue);
            }

            if (obj.ReplicaRestartWaitDurationSeconds != null)
            {
                writer.WriteProperty(obj.ReplicaRestartWaitDurationSeconds, "ReplicaRestartWaitDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.QuorumLossWaitDurationSeconds != null)
            {
                writer.WriteProperty(obj.QuorumLossWaitDurationSeconds, "QuorumLossWaitDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.StandByReplicaKeepDurationSeconds != null)
            {
                writer.WriteProperty(obj.StandByReplicaKeepDurationSeconds, "StandByReplicaKeepDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            writer.WriteEndObject();
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Serializes the object to JSON.
        /// </summary>
        /// <param name="writer">The <see cref="T: Newtonsoft.Json.JsonWriter" /> to write to.</param>
        /// <param name="obj">The object to serialize to JSON.</param>
        internal static void Serialize(JsonWriter writer, StatefulServiceUpdateDescription obj)
        {
            // Required properties are always serialized, optional properties are serialized when not null.
            writer.WriteStartObject();
            writer.WriteProperty(obj.ServiceKind, "ServiceKind", ServiceKindConverter.Serialize);
            writer.WriteProperty(obj.DefaultMoveCost, "DefaultMoveCost", MoveCostConverter.Serialize);
            if (obj.Flags != null)
            {
                writer.WriteProperty(obj.Flags, "Flags", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.PlacementConstraints != null)
            {
                writer.WriteProperty(obj.PlacementConstraints, "PlacementConstraints", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.CorrelationScheme != null)
            {
                writer.WriteEnumerableProperty(obj.CorrelationScheme, "CorrelationScheme", ServiceCorrelationDescriptionConverter.Serialize);
            }

            if (obj.LoadMetrics != null)
            {
                writer.WriteEnumerableProperty(obj.LoadMetrics, "LoadMetrics", ServiceLoadMetricDescriptionConverter.Serialize);
            }

            if (obj.ServicePlacementPolicies != null)
            {
                writer.WriteEnumerableProperty(obj.ServicePlacementPolicies, "ServicePlacementPolicies", ServicePlacementPolicyDescriptionConverter.Serialize);
            }

            if (obj.ScalingPolicies != null)
            {
                writer.WriteEnumerableProperty(obj.ScalingPolicies, "ScalingPolicies", ScalingPolicyDescriptionConverter.Serialize);
            }

            if (obj.ServiceDnsName != null)
            {
                writer.WriteProperty(obj.ServiceDnsName, "ServiceDnsName", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.TagsForPlacement != null)
            {
                writer.WriteProperty(obj.TagsForPlacement, "TagsForPlacement", NodeTagsDescriptionConverter.Serialize);
            }

            if (obj.TagsForRunning != null)
            {
                writer.WriteProperty(obj.TagsForRunning, "TagsForRunning", NodeTagsDescriptionConverter.Serialize);
            }

            if (obj.TargetReplicaSetSize != null)
            {
                writer.WriteProperty(obj.TargetReplicaSetSize, "TargetReplicaSetSize", JsonWriterExtensions.WriteIntValue);
            }

            if (obj.MinReplicaSetSize != null)
            {
                writer.WriteProperty(obj.MinReplicaSetSize, "MinReplicaSetSize", JsonWriterExtensions.WriteIntValue);
            }

            if (obj.ReplicaRestartWaitDurationSeconds != null)
            {
                writer.WriteProperty(obj.ReplicaRestartWaitDurationSeconds, "ReplicaRestartWaitDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.QuorumLossWaitDurationSeconds != null)
            {
                writer.WriteProperty(obj.QuorumLossWaitDurationSeconds, "QuorumLossWaitDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.StandByReplicaKeepDurationSeconds != null)
            {
                writer.WriteProperty(obj.StandByReplicaKeepDurationSeconds, "StandByReplicaKeepDurationSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.ServicePlacementTimeLimitSeconds != null)
            {
                writer.WriteProperty(obj.ServicePlacementTimeLimitSeconds, "ServicePlacementTimeLimitSeconds", JsonWriterExtensions.WriteStringValue);
            }

            if (obj.DropSourceReplicaOnMove != null)
            {
                writer.WriteProperty(obj.DropSourceReplicaOnMove, "DropSourceReplicaOnMove", JsonWriterExtensions.WriteBoolValue);
            }

            if (obj.ReplicaLifecycleDescription != null)
            {
                writer.WriteProperty(obj.ReplicaLifecycleDescription, "ReplicaLifecycleDescription", ReplicaLifecycleDescriptionConverter.Serialize);
            }

            if (obj.AuxiliaryReplicaCount != null)
            {
                writer.WriteProperty(obj.AuxiliaryReplicaCount, "AuxiliaryReplicaCount", JsonWriterExtensions.WriteIntValue);
            }

            writer.WriteEndObject();
        }
Ejemplo n.º 7
0
        protected StatefulServiceUpdateDescription GetStatefulServiceUpdateDescription(
            int?targetReplicaSetSize,
            int?minReplicaSetSize,
            TimeSpan?replicaRestartWaitDuration,
            TimeSpan?quorumLossWaitDuration,
            TimeSpan?standByReplicaKeepDuration,
            string[] metrics,
            string[] correlations,
            string[] placementPolicies,
            string placementConstraints,
            string defaultMoveCost,
            string[] partitionNamesToAdd,
            string[] partitionNamesToRemove,
            List <ScalingPolicyDescription> scalingPolicies)
        {
            var statefulServiceUpdateDescription = new StatefulServiceUpdateDescription();

            if (targetReplicaSetSize.HasValue)
            {
                statefulServiceUpdateDescription.TargetReplicaSetSize = targetReplicaSetSize.Value;
            }

            if (minReplicaSetSize.HasValue)
            {
                statefulServiceUpdateDescription.MinReplicaSetSize = minReplicaSetSize.Value;
            }

            if (replicaRestartWaitDuration.HasValue)
            {
                statefulServiceUpdateDescription.ReplicaRestartWaitDuration = replicaRestartWaitDuration.Value;
            }

            if (quorumLossWaitDuration.HasValue)
            {
                statefulServiceUpdateDescription.QuorumLossWaitDuration = quorumLossWaitDuration.Value;
            }

            if (standByReplicaKeepDuration.HasValue)
            {
                statefulServiceUpdateDescription.StandByReplicaKeepDuration = standByReplicaKeepDuration.Value;
            }

            if (placementConstraints != null)
            {
                statefulServiceUpdateDescription.PlacementConstraints = placementConstraints;
            }

            if (metrics != null)
            {
                statefulServiceUpdateDescription.Metrics = new KeyedItemCollection <string, ServiceLoadMetricDescription>(d => d.Name);

                foreach (var str in metrics)
                {
                    statefulServiceUpdateDescription.Metrics.Add(ServiceCmdletBase.ParseStatefulMetric(str));
                }
            }

            if (defaultMoveCost != null)
            {
                statefulServiceUpdateDescription.DefaultMoveCost = ServiceCmdletBase.ParseMoveCost(defaultMoveCost);
            }

            if (correlations != null)
            {
                statefulServiceUpdateDescription.Correlations = new List <ServiceCorrelationDescription>();

                foreach (var str in correlations)
                {
                    statefulServiceUpdateDescription.Correlations.Add(ServiceCmdletBase.ParseCorrelation(str));
                }
            }

            if (placementPolicies != null)
            {
                statefulServiceUpdateDescription.PlacementPolicies = new List <ServicePlacementPolicyDescription>();

                foreach (var str in placementPolicies)
                {
                    statefulServiceUpdateDescription.PlacementPolicies.Add(ServiceCmdletBase.ParsePlacementPolicy(str));
                }
            }

            if ((partitionNamesToAdd != null && partitionNamesToAdd.Length > 0) || (partitionNamesToRemove != null && partitionNamesToRemove.Length > 0))
            {
                statefulServiceUpdateDescription.RepartitionDescription = new NamedRepartitionDescription(
                    partitionNamesToAdd,
                    partitionNamesToRemove);
            }

            if (scalingPolicies != null)
            {
                statefulServiceUpdateDescription.ScalingPolicies = new List <ScalingPolicyDescription>();
                foreach (var scale in scalingPolicies)
                {
                    statefulServiceUpdateDescription.ScalingPolicies.Add(scale);
                }
            }

            return(statefulServiceUpdateDescription);
        }
Ejemplo n.º 8
0
        private ServiceUpdateDescription CreateServiceUpdateDescription(ServiceOperationDescription serviceOperationDescription)
        {
            string errorMessage;
            ServiceUpdateDescription serviceUpdateDescription;

            switch (serviceOperationDescription.ServiceKind)
            {
            case ArmServiceKind.Stateful:
                if (!this.ValidObjectType <StatefulServiceOperationDescription>(serviceOperationDescription, out errorMessage))
                {
                    throw new InvalidCastException(errorMessage);
                }

                var statefulOperation = (StatefulServiceOperationDescription)serviceOperationDescription;
                serviceUpdateDescription = new StatefulServiceUpdateDescription()
                {
                    MinReplicaSetSize          = statefulOperation.MinReplicaSetSize,
                    QuorumLossWaitDuration     = statefulOperation.QuorumLossWaitDuration,
                    ReplicaRestartWaitDuration = statefulOperation.ReplicaRestartWaitDuration,
                    StandByReplicaKeepDuration = statefulOperation.StandByReplicaKeepDuration,
                    TargetReplicaSetSize       = statefulOperation.TargetReplicaSetSize
                };

                break;

            case ArmServiceKind.Stateless:
                if (!this.ValidObjectType <StatelessServiceOperationDescription>(serviceOperationDescription, out errorMessage))
                {
                    throw new InvalidCastException(errorMessage);
                }

                var statelessOperation = (StatelessServiceOperationDescription)serviceOperationDescription;
                serviceUpdateDescription = new StatelessServiceUpdateDescription()
                {
                    InstanceCount = statelessOperation.InstanceCount
                };

                break;

            default:
                throw new ArgumentOutOfRangeException(
                          nameof(serviceOperationDescription.ServiceKind),
                          serviceOperationDescription.ServiceKind,
                          $"{this.TraceType}: Unexpected ArmServiceKind");
            }

            if (serviceOperationDescription.DefaultMoveCost.HasValue)
            {
                serviceUpdateDescription.DefaultMoveCost =
                    (MoveCost)Enum.Parse(
                        typeof(MoveCost),
                        serviceOperationDescription.DefaultMoveCost.Value.ToString());
            }

            serviceUpdateDescription.PlacementConstraints = serviceOperationDescription.PlacementConstraints;

            if (serviceOperationDescription.CorrelationScheme != null)
            {
                serviceUpdateDescription.Correlations = new List <ServiceCorrelationDescription>();
                foreach (var scheme in serviceOperationDescription.CorrelationScheme)
                {
                    serviceUpdateDescription.Correlations.Add(this.GetServiceCorrelationDescription(scheme));
                }
            }

            if (serviceOperationDescription.ServiceLoadMetrics != null)
            {
                serviceUpdateDescription.Metrics = new KeyedItemCollection <string, ServiceLoadMetricDescription>(n => n.Name);
                foreach (var metric in serviceOperationDescription.ServiceLoadMetrics)
                {
                    serviceUpdateDescription.Metrics.Add(this.GetServiceLoadMetricDescription(metric));
                }
            }

            if (serviceOperationDescription.ServicePlacementPolicies != null)
            {
                serviceUpdateDescription.PlacementPolicies = new List <ServicePlacementPolicyDescription>();
                foreach (var policy in serviceOperationDescription.ServicePlacementPolicies)
                {
                    serviceUpdateDescription.PlacementPolicies.Add(this.GetServicePlacementPolicyDescription(policy));
                }
            }

            return(serviceUpdateDescription);
        }