internal static unsafe ConfigurationUpgradeDescription CreateFromNative(IntPtr nativeRaw)
        {
            NativeTypes.FABRIC_START_UPGRADE_DESCRIPTION native = *(NativeTypes.FABRIC_START_UPGRADE_DESCRIPTION *)nativeRaw;

            string ClusterConfiguration         = NativeTypes.FromNativeString(native.ClusterConfig);
            var    healthCheckRetryTimeoutSec   = FromNativeTimeInSeconds(native.HealthCheckRetryTimeoutInSeconds);
            var    healthCheckWaitDurationSec   = FromNativeTimeInSeconds(native.HealthCheckWaitDurationInSeconds);
            var    healthCheckStableDurationSec = FromNativeTimeInSeconds(native.HealthCheckStableDurationInSeconds);
            var    upgradeDomainTimeoutSec      = FromNativeTimeInSeconds(native.UpgradeDomainTimeoutInSeconds);
            var    upgradeTimeoutSec            = FromNativeTimeInSeconds(native.UpgradeTimeoutInSeconds);

            byte maxPercentUnhealthyApplications            = native.MaxPercentUnhealthyApplications;
            byte maxPercentUnhealthyNodes                   = native.MaxPercentUnhealthyNodes;
            byte maxPercentDeltaUnhealthyNodes              = native.MaxPercentDeltaUnhealthyNodes;
            byte maxPercentUpgradeDomainDeltaUnhealthyNodes = native.MaxPercentUpgradeDomainDeltaUnhealthyNodes;

            var configurationUpgradeDescription = new ConfigurationUpgradeDescription
            {
                ClusterConfiguration                       = ClusterConfiguration,
                HealthCheckRetryTimeout                    = healthCheckRetryTimeoutSec,
                HealthCheckWaitDuration                    = healthCheckWaitDurationSec,
                HealthCheckStableDuration                  = healthCheckStableDurationSec,
                UpgradeDomainTimeout                       = upgradeDomainTimeoutSec,
                UpgradeTimeout                             = upgradeTimeoutSec,
                MaxPercentUnhealthyApplications            = maxPercentUnhealthyApplications,
                MaxPercentUnhealthyNodes                   = maxPercentUnhealthyNodes,
                MaxPercentDeltaUnhealthyNodes              = maxPercentDeltaUnhealthyNodes,
                MaxPercentUpgradeDomainDeltaUnhealthyNodes = maxPercentUpgradeDomainDeltaUnhealthyNodes
            };

            if (native.Reserved != IntPtr.Zero)
            {
                var ex1 = *((NativeTypes.FABRIC_START_UPGRADE_DESCRIPTION_EX1 *)native.Reserved);

                if (ex1.ApplicationHealthPolicyMap != IntPtr.Zero)
                {
                    configurationUpgradeDescription.ApplicationHealthPolicies.FromNative(ex1.ApplicationHealthPolicyMap);
                }
            }

            return(configurationUpgradeDescription);
        }
        internal IntPtr ToNative(PinCollection pinCollection)
        {
            var ex1 = new NativeTypes.FABRIC_START_UPGRADE_DESCRIPTION_EX1
            {
                ApplicationHealthPolicyMap = this.ApplicationHealthPolicies.ToNative(pinCollection),
            };

            var nativeStartUpgradeDescription = new NativeTypes.FABRIC_START_UPGRADE_DESCRIPTION();

            nativeStartUpgradeDescription.ClusterConfig = pinCollection.AddObject(this.ClusterConfiguration);
            nativeStartUpgradeDescription.HealthCheckWaitDurationInSeconds           = (uint)this.HealthCheckWaitDuration.TotalSeconds;
            nativeStartUpgradeDescription.HealthCheckRetryTimeoutInSeconds           = (uint)this.HealthCheckRetryTimeout.TotalSeconds;
            nativeStartUpgradeDescription.HealthCheckStableDurationInSeconds         = (uint)this.HealthCheckStableDuration.TotalSeconds;
            nativeStartUpgradeDescription.UpgradeTimeoutInSeconds                    = (uint)this.UpgradeTimeout.TotalSeconds;
            nativeStartUpgradeDescription.UpgradeDomainTimeoutInSeconds              = (uint)this.UpgradeDomainTimeout.TotalSeconds;
            nativeStartUpgradeDescription.MaxPercentUnhealthyApplications            = this.MaxPercentUnhealthyApplications;
            nativeStartUpgradeDescription.MaxPercentUnhealthyNodes                   = this.MaxPercentUnhealthyNodes;
            nativeStartUpgradeDescription.MaxPercentDeltaUnhealthyNodes              = this.MaxPercentDeltaUnhealthyNodes;
            nativeStartUpgradeDescription.MaxPercentUpgradeDomainDeltaUnhealthyNodes = this.MaxPercentUpgradeDomainDeltaUnhealthyNodes;
            nativeStartUpgradeDescription.Reserved = pinCollection.AddBlittable(ex1);

            return(pinCollection.AddBlittable(nativeStartUpgradeDescription));
        }