public void TestConfigOnlyFabricUpgradeWithRunAs()
        {
            string currentExecutingDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string configurationCsvFilePath  = Path.Combine(currentExecutingDirectory, "Configurations.csv");

            string[]        manifests     = new string[] { "ClusterManifest-WithoutDiagnostics.xml", "ClusterManifest-WithRunAs.xml" };
            FabricVersion[] fabricVersion = new FabricVersion[2];
            for (int i = 0; i < 2; i++)
            {
                using (FabricLayoutInfo fabricLayoutInfo = new FabricLayoutInfo(this.imageStore, manifests[i]))
                {
                    fabricLayoutInfo.PatchVersion = null;

                    string codePath, configPath, infrastructureManifestFilePath;
                    fabricLayoutInfo.Create(out codePath, out configPath, out infrastructureManifestFilePath);
                    fabricVersion[i] = this.imageBuilder.GetFabricVersionInfo(codePath, configPath, TestUtility.ImageStoreDefaultTimeout);

                    this.imageBuilder.ProvisionFabric(
                        codePath,
                        configPath,
                        configurationCsvFilePath,
                        infrastructureManifestFilePath,
                        TimeSpan.MaxValue);

                    TestUtility.VerifyWinFabLayout(fabricLayoutInfo);
                }
            }

            this.imageBuilder.UpgradeFabric(
                fabricVersion[0].ToString(),
                fabricVersion[1].ToString(),
                configurationCsvFilePath,
                TimeSpan.MaxValue);
        }
        public void TestInvalidMSIFile()
        {
            string tempInvalidMsiFileName = Path.ChangeExtension(Path.GetRandomFileName(), "msi");
            string tempInvalidMsiFilePath = Path.Combine(TestUtility.TestDirectory, tempInvalidMsiFileName);

            try
            {
                using (var stream = File.CreateText(tempInvalidMsiFilePath))
                {
                    stream.WriteLine("Invalid test msi file");
                }

                this.imageStore.UploadContent(
                    tempInvalidMsiFileName,
                    tempInvalidMsiFilePath,
                    TimeSpan.MaxValue,
                    CopyFlag.AtomicCopy,
                    false);

                FabricVersion fabricVersion = this.imageBuilder.GetFabricVersionInfo(tempInvalidMsiFileName, null, TestUtility.ImageStoreDefaultTimeout);
            }
            catch (FabricImageBuilderValidationException exception)
            {
                Verify.IsTrue((int)exception.ErrorCode == unchecked ((int)NativeTypes.FABRIC_ERROR_CODE.FABRIC_E_IMAGEBUILDER_INVALID_MSI_FILE));
            }
            finally
            {
                if (File.Exists(tempInvalidMsiFilePath))
                {
                    File.Delete(tempInvalidMsiFilePath);
                }

                this.imageStore.DeleteContent(tempInvalidMsiFileName, TimeSpan.MaxValue);
            }
        }
        public void TestGetFabricVersionInfo()
        {
            using (FabricLayoutInfo fabricLayoutInfo = new FabricLayoutInfo(this.imageStore))
            {
                string codePath, configPath, infrastructureManifestFilePath;

                fabricLayoutInfo.Create(out codePath, out configPath, out infrastructureManifestFilePath);
                FabricVersion fabricVersion = this.imageBuilder.GetFabricVersionInfo(codePath, configPath, TestUtility.ImageStoreDefaultTimeout);

                Verify.AreEqual(fabricVersion.CodeVersion, fabricLayoutInfo.PatchVersion);
                Verify.AreEqual(fabricVersion.ConfigVersion, fabricLayoutInfo.ClusterManifest.Version);
            }
        }
        public void UpgradeFabric(
            string currentFabricVersion,
            string targetFabricVersion,
#if !DotNetCoreClrLinux && !DotNetCoreClrIOT
            string configurationCsvFilePath,
#endif
            TimeSpan timeout,
            out bool isConfigOnly)
        {
            isConfigOnly = false;

            TimeoutHelper timeoutHelper = new TimeoutHelper(timeout);

            ImageBuilder.TraceSource.WriteInfo(
                TraceType,
                "UpgradeFabric started: CurrentFabricVersion:{0}, TargetFabricVersion:{1}, Timeout:{2}",
                currentFabricVersion,
                targetFabricVersion,
                timeoutHelper.GetRemainingTime());

            // If the current version is invalid (ie. Cluster FabricVersion is not determined)
            // then do not validate
            if (ImageBuilderUtility.Equals(currentFabricVersion, FabricVersion.Invalid.ToString()))
            {
                return;
            }

            FabricVersion currentVersion, targetVersion;

            bool isValid = FabricVersion.TryParse(currentFabricVersion, out currentVersion);

            if (!isValid)
            {
                ImageBuilderUtility.TraceAndThrowValidationError(
                    TraceType,
                    StringResources.ImageBuilderError_InvalidValue,
                    "CurrentFabricVersion",
                    currentFabricVersion);
            }

            isValid = FabricVersion.TryParse(targetFabricVersion, out targetVersion);
            if (!isValid)
            {
                ImageBuilderUtility.TraceAndThrowValidationError(
                    TraceType,
                    StringResources.ImageBuilderError_InvalidValue,
                    "TargetFabricVersion",
                    targetFabricVersion);
            }

            WinFabStoreLayoutSpecification winFabLayout = WinFabStoreLayoutSpecification.Create();
            string currentClusterManifestPath           = winFabLayout.GetClusterManifestFile(currentVersion.ConfigVersion);
            string targetClusterManifestPath            = winFabLayout.GetClusterManifestFile(targetVersion.ConfigVersion);

            ClusterManifestType currentClusterManifest = this.imageStoreWrapper.GetFromStore <ClusterManifestType>(currentClusterManifestPath, timeoutHelper.GetRemainingTime());
            ClusterManifestType targetClusterManifest  = this.imageStoreWrapper.GetFromStore <ClusterManifestType>(targetClusterManifestPath, timeoutHelper.GetRemainingTime());

            timeoutHelper.ThrowIfExpired();

            try
            {
                // todo: Vaishnav to pass node list object loaded from the location
                FabricValidator fabricValidator = FabricValidator.Create(currentClusterManifest, null, new WindowsFabricSettings(currentClusterManifest), DeploymentOperations.Update);
                IEnumerable <KeyValuePair <string, string> > modifiedStaticSettings = fabricValidator.CompareAndAnalyze(targetClusterManifest, null /*Detect changes for any NodeType*/);
                isConfigOnly = !modifiedStaticSettings.Any();
            }
            catch (Exception e)
            {
                ImageBuilderUtility.TraceAndThrowValidationError(
                    TraceType,
                    StringResources.ImageBuilderError_InvalidConfigFabricUpgrade,
                    e.ToString(),
                    currentFabricVersion,
                    targetFabricVersion);
            }

            ImageBuilder.TraceSource.WriteInfo(
                TraceType,
                "UpgradeFabric completed: CurrentFabricVersion:{0}, TargetFabricVersion:{1}, ConfigOnly:{2}",
                currentFabricVersion,
                targetFabricVersion,
                isConfigOnly);
        }