Пример #1
0
 public FabricSettingsGeneratorBase CreateLinuxSettingsGenerator(
     IUserConfig targetCsmConfig,
     IAdminConfig targetWrpConfig,
     FabricSettingsMetadata settingsMetadata,
     ClusterManifestType existingClusterManifest,
     ClusterManifestGeneratorSettings clusterManifestGeneratorSettings,
     ITraceLogger traceLogger)
 {
     throw new System.NotImplementedException();
 }
Пример #2
0
        public FabricSettingsMetadata GetFabricSettingsMetadata()
        {
            //// Extract Configuration
            if (this.fabricSettingsMetadata2 == null)
            {
                string fabricSettingFilePath = StandaloneUtility.FindFabricResourceFile(DMConstants.ConfigurationsFileName);
                this.fabricSettingsMetadata2 = FabricSettingsMetadata.Create(fabricSettingFilePath);
            }

            return(this.fabricSettingsMetadata2);
        }
Пример #3
0
 public StandaloneAdminConfig(
     FabricSettingsMetadata fabricSettingsMetadata,
     StandAloneClusterManifestSettings standAloneClusterManifestSettings,
     AdminConfigVersion version,
     bool isUserSet)
 {
     this.fabricSettingsMetadata = fabricSettingsMetadata;
     this.Version = version;
     this.standAloneClusterManifestSettings = standAloneClusterManifestSettings;
     this.IsUserSet = isUserSet;
 }
 public MockupFabricSettingsGenerator(
     string clusterIdOrName,
     IUserConfig targetCsmConfig,
     IAdminConfig targetWrpConfig,
     FabricSettingsMetadata settingsMetadata,
     ClusterManifestType existingClusterManifest,
     ClusterManifestGeneratorSettings clusterManifestGeneratorSettings,
     ITraceLogger traceLogger)
     : base(clusterIdOrName, targetCsmConfig, targetWrpConfig, settingsMetadata, existingClusterManifest, clusterManifestGeneratorSettings, traceLogger)
 {
 }
Пример #5
0
        internal static void UpdateStandAloneClusterWRPSettings(string clusterSettingsFilePath, string version, StandAloneCluster existingCluster)
        {
            string fabricSettingFilePath = StandaloneUtility.FindFabricResourceFile("Configurations.csv");
            FabricSettingsMetadata fabricSettingsMetadata = FabricSettingsMetadata.Create(fabricSettingFilePath);
            AdminConfigVersion     adminConfigVersion     = new AdminConfigVersion("Baseline", version);

            StandAloneClusterManifestSettings standAloneClusterManifestSettings = JsonConvert.DeserializeObject <StandAloneClusterManifestSettings>(
                File.ReadAllText(clusterSettingsFilePath));

            existingCluster.TargetWrpConfig = new StandaloneAdminConfig(fabricSettingsMetadata, standAloneClusterManifestSettings, adminConfigVersion, false);
        }
Пример #6
0
        public void RepairManagerDefinitionTest()
        {
            string configCsvPath            = Path.Combine(Utility.TestDirectory, "Configurations.csv");
            FabricSettingsMetadata metadata = FabricSettingsMetadata.Create(configCsvPath);
            ConfigDescription      desc     = null;

            metadata.TryGetConfigDescription(StringConstants.SectionName.RepairManager, StringConstants.ParameterName.TargetReplicaSetSize, out desc);
            Assert.AreEqual(desc.DefaultValue, "0");
            Assert.AreEqual(desc.UpgradePolicy, UpgradePolicy.SingleChange);
            metadata.TryGetConfigDescription(StringConstants.SectionName.RepairManager, StringConstants.ParameterName.MinReplicaSetSize, out desc);
            Assert.AreEqual(desc.DefaultValue, "0");
            Assert.AreEqual(desc.UpgradePolicy, UpgradePolicy.SingleChange);
        }
Пример #7
0
        public MockupAdminConfig(bool isUserSet = false)
        {
            string fabricSettingFilePath = Utility.FindFabricResourceFile(Constant.ConfigurationsFileName);

            this.fabricSettingsMetadata = FabricSettingsMetadata.Create(fabricSettingFilePath);
            string clusterSettingsFilePath = this.GetClusterSettingsFilePath();

            // Extract Cluster Settings
            // ReSharper disable once AssignNullToNotNullAttribute - fabric Code Path cannot be null here.
            this.Version = new AdminConfigVersion("Baseline", "Baseline");
            this.mockupClusterManifestSettings = JsonConvert.DeserializeObject <MockupClusterManifestSettings>(
                File.ReadAllText(clusterSettingsFilePath));
            this.IsUserSet = isUserSet;
        }
 public StandAloneFabricSettingsGenerator(
     string clusterIdOrName,
     IUserConfig targetCsmConfig,
     IAdminConfig targetWrpConfig,
     FabricSettingsMetadata settingsMetadata,
     ClusterManifestType existingClusterManifest,
     ClusterManifestGeneratorSettings clusterManifestGeneratorSettings,
     ITraceLogger traceLogger,
     string currentPrimaryAccountNtlmPassword,
     string currentSecondaryAccountNtlmPassword,
     string currentCommonNameNtlmPassword)
     : base(clusterIdOrName, targetCsmConfig, targetWrpConfig, settingsMetadata, existingClusterManifest, clusterManifestGeneratorSettings, traceLogger)
 {
     this.currentPrimaryAccountNtlmPassword   = currentPrimaryAccountNtlmPassword;
     this.currentSecondaryAccountNtlmPassword = currentSecondaryAccountNtlmPassword;
     this.currentCommonNameNtlmPassword       = currentCommonNameNtlmPassword;
 }
Пример #9
0
 public FabricSettingsGeneratorBase CreateWindowsSettingsGenerator(
     IUserConfig targetCsmConfig,
     IAdminConfig targetWrpConfig,
     FabricSettingsMetadata settingsMetadata,
     ClusterManifestType existingClusterManifest,
     ClusterManifestGeneratorSettings clusterManifestGeneratorSettings,
     ITraceLogger traceLogger)
 {
     return(new MockupFabricSettingsGenerator(
                "acf4dc93-9b64-4504-8b6f-0b7fd052e096",
                targetCsmConfig,
                targetWrpConfig,
                settingsMetadata,
                existingClusterManifest,
                clusterManifestGeneratorSettings,
                traceLogger));
 }
Пример #10
0
        public StandaloneAdminConfig(string configurationsFilePath = null, bool isUserSet = false)
        {
            //// Extract Configuration

            string fabricSettingFilePath = string.IsNullOrEmpty(configurationsFilePath)
                                                 ? StandaloneUtility.FindFabricResourceFile(DMConstants.ConfigurationsFileName)
                                                 : configurationsFilePath;

            this.fabricSettingsMetadata = FabricSettingsMetadata.Create(fabricSettingFilePath);
            string clusterSettingsFilePath = this.GetClusterSettingsFilePath();

            // Extract Cluster Settings
            // ReSharper disable once AssignNullToNotNullAttribute - fabric Code Path cannot be null here.
            this.Version = new AdminConfigVersion("Baseline", "Baseline");
            this.standAloneClusterManifestSettings = JsonConvert.DeserializeObject <StandAloneClusterManifestSettings>(
                File.ReadAllText(clusterSettingsFilePath));
            this.IsUserSet = isUserSet;
        }
Пример #11
0
 public FabricSettingsGeneratorBase CreateWindowsSettingsGenerator(
     IUserConfig targetCsmConfig,
     IAdminConfig targetWrpConfig,
     FabricSettingsMetadata settingsMetadata,
     ClusterManifestType existingClusterManifest,
     ClusterManifestGeneratorSettings clusterManifestGeneratorSettings,
     ITraceLogger traceLogger)
 {
     return(new StandAloneFabricSettingsGenerator(
                this.clusterId,
                targetCsmConfig,
                targetWrpConfig,
                settingsMetadata,
                existingClusterManifest,
                clusterManifestGeneratorSettings,
                traceLogger,
                this.currentPrimaryAccountNtlmPassword,
                this.currentSecondaryAccountNtlmPassword,
                this.currentCommonNameNtlmPassword));
 }
Пример #12
0
        public override ClusterManifestType[] UpdateSeedNodesInClusterManifest(
            ClusterManifestType existingClusterManifest,
            FabricSettingsMetadata currentFabricSettingsMetadata,
            List <string> disabledNodes,
            List <string> removedNodes)
        {
            var primaryNodeTypes  = this.TargetCsmConfig.NodeTypes.Where(nodeType => nodeType.IsPrimary);
            var existingSeedNodes = ((ClusterManifestTypeInfrastructureWindowsServer)existingClusterManifest.Infrastructure.Item).NodeList.Where(item => item.IsSeedNode == true).ToList();

            List <NodeDescription> seedNodesAdded;
            List <NodeDescription> seedNodesRemoved;

            if (!this.TryUpdateSeedNodes(
                    primaryNodeTypes,
                    existingSeedNodes,
                    disabledNodes,
                    removedNodes,
                    out seedNodesAdded,
                    out seedNodesRemoved))
            {
                // returns null if enough nodes are not available
                return(null);
            }

            var nodeTypes = this.GetNodeTypes(this.TargetCsmConfig.NodeTypes, this.TargetCsmConfig.Security);

            List <ClusterManifestType> clusterManifests = new List <ClusterManifestType>();

            if (seedNodesAdded.Count() > 0)
            {
                List <NodeDescription> nonSeedNodesAdded;

                // We allow the scenario to add seednode and non-seednode at the same time. If without reliability level change, it will go through SimpleClusterUpgrade
                // which will handle the addition of both. If there is reliability level change, we need to take the addition of non seed node here. To add them only in the
                // generated clusterManifest[0].
                // Find the added non seed node. If the node in topology is neither in existing infrastructure not in seedNodesAdded, it's a non seed node to add.
                nonSeedNodesAdded = this.Topology.Nodes.Where(node => !((ClusterManifestTypeInfrastructureWindowsServer)existingClusterManifest.Infrastructure.Item).NodeList.Select(n => n.NodeName).Contains(node.Key) &&
                                                              !seedNodesAdded.Select(s => s.NodeName).Contains(node.Key)).Select(kvp => kvp.Value).ToList();
                foreach (var seedNodeToAdd in seedNodesAdded)
                {
                    existingSeedNodes.Add(seedNodeToAdd.ToFabricNodeType());
                    var clusterManifest = this.UpdateClusterManifest(
                        this.TargetCsmConfig.Security,
                        clusterManifests.Count == 0 ? existingClusterManifest : clusterManifests[clusterManifests.Count - 1],
                        existingSeedNodes,
                        seedNodeToAdd,
                        nonSeedNodesAdded,
                        true,
                        nodeTypes,
                        currentFabricSettingsMetadata,
                        this.VersionGenerator.GetNextClusterManifestVersion());
                    nonSeedNodesAdded.Clear();
                    clusterManifests.Add(clusterManifest);
                }
            }

            if (seedNodesRemoved.Count() > 0)
            {
                List <NodeDescription> nonSeedNodesRemoved;

                // Find the removed non seed node. If the node in existing infrastructure is neither in topology nor in seedNodesRemoved, it's a non seed node to remove.
                var nonSeedNodesRemovedNodeType = ((ClusterManifestTypeInfrastructureWindowsServer)existingClusterManifest.Infrastructure.Item).NodeList.Where(node => !this.Topology.Nodes.Select(n => n.Key).Contains(node.NodeName) &&
                                                                                                                                                               !seedNodesRemoved.Select(s => s.NodeName).Contains(node.NodeName)).ToList();
                nonSeedNodesRemoved = new List <NodeDescription>();

                if (nonSeedNodesRemovedNodeType.Count() > 0)
                {
                    foreach (var n in nonSeedNodesRemovedNodeType)
                    {
                        var node = new NodeDescription()
                        {
                            FaultDomain   = n.FaultDomain,
                            IPAddress     = n.IPAddressOrFQDN,
                            NodeName      = n.NodeName,
                            NodeTypeRef   = n.NodeTypeRef,
                            UpgradeDomain = n.UpgradeDomain
                        };

                        nonSeedNodesRemoved.Add(node);
                    }
                }

                foreach (var seedNodeToRemove in seedNodesRemoved)
                {
                    // Remove the seedNode from existingSeedNodes
                    existingSeedNodes = new List <FabricNodeType>(
                        existingSeedNodes.Where(existingSeedNode => existingSeedNode.NodeName != seedNodeToRemove.NodeName));

                    var clusterManifest = this.UpdateClusterManifest(
                        this.TargetCsmConfig.Security,
                        clusterManifests.Count == 0 ? existingClusterManifest : clusterManifests[clusterManifests.Count - 1],
                        existingSeedNodes,
                        seedNodeToRemove,
                        nonSeedNodesRemoved,
                        false,
                        nodeTypes,
                        currentFabricSettingsMetadata,
                        this.VersionGenerator.GetNextClusterManifestVersion());

                    nonSeedNodesRemoved.Clear();
                    clusterManifests.Add(clusterManifest);
                }
            }

            // returns empty array if no upgrade is required
            return(clusterManifests.ToArray());
        }
Пример #13
0
        protected ClusterManifestType UpdateClusterManifest(
            Security security,
            ClusterManifestType existingClusterManifest,
            List <FabricNodeType> seedNodes,
            NodeDescription seedNodeChanged,
            List <NodeDescription> nonSeedNodeChanged,
            bool isSeedNodeToAdd,
            IEnumerable <ClusterManifestTypeNodeType> nodeTypes,
            FabricSettingsMetadata currentFabricSettingsMetadata,
            string clusterManifestVersion)
        {
            FabricSettingsGeneratorBase fabricSettingsGenerator = this.CreateFabricSettingsGenerator(
                this.TargetCsmConfig,
                this.TargetWrpConfig,
                this.ClusterManifestGeneratorSettings,
                currentFabricSettingsMetadata,
                existingClusterManifest);

            var originalNodeList           = ((ClusterManifestTypeInfrastructureWindowsServer)existingClusterManifest.Infrastructure.Item).NodeList;
            List <FabricNodeType> nodelist = new List <FabricNodeType>();

            foreach (var n in originalNodeList)
            {
                nodelist.Add(new FabricNodeType
                {
                    FaultDomain     = n.FaultDomain,
                    IPAddressOrFQDN = n.IPAddressOrFQDN,
                    IsSeedNode      = n.IsSeedNode,
                    NodeName        = n.NodeName,
                    NodeTypeRef     = n.NodeTypeRef,
                    UpgradeDomain   = n.UpgradeDomain
                });
            }

            var fabricSettings = fabricSettingsGenerator.GenerateFabricSettings(security, nodelist.Count());

            if (isSeedNodeToAdd)
            {
                var hasNodeListAlreadyContainedThisSeedNode = originalNodeList.Select(node => node.NodeName).Contains(seedNodeChanged.NodeName);
                if (!hasNodeListAlreadyContainedThisSeedNode)
                {
                    nodelist.Add(seedNodeChanged.ToFabricNodeType());
                }

                if (nonSeedNodeChanged.Count > 0)
                {
                    foreach (var nonSeedNodeAdded in nonSeedNodeChanged)
                    {
                        nodelist.Add(nonSeedNodeAdded.ToFabricNodeType());
                    }
                }
            }
            else
            {
                nodelist.Where(n => n.NodeName.Equals(seedNodeChanged.NodeName)).FirstOrDefault().IsSeedNode = false;
                if (nonSeedNodeChanged.Count > 0)
                {
                    foreach (var nonSeedNodeRemoved in nonSeedNodeChanged)
                    {
                        nodelist = nodelist.Where(n => !nonSeedNodeRemoved.NodeName.Equals(n.NodeName)).ToList();
                    }
                }
            }

            // Set ExpectedNodeDeactivationDuration section in FailoverManager to 2 days. Deactivating node in seed node removal
            // could take a lot of intermediate seed node changing upgrades. This is to prevent deactivate node timeout.
            // TODO Chrissie: When the seed node removal causing the intermediate seed node shift bug is fixed, remove this parameter from add node scenario.
            var      failoverManagerSettings         = fabricSettings.FirstOrDefault(setting => setting.Name.Equals(StringConstants.SectionName.FailoverManager, StringComparison.OrdinalIgnoreCase));
            TimeSpan totalSeconds                    = TimeSpan.FromSeconds(120 * 60 * 24);
            double   defaultNodeDeactivationDuration = totalSeconds.TotalSeconds;

            var expectedNodeDeactivationDurationParameter = failoverManagerSettings.Parameter.FirstOrDefault(
                param => param.Name.Equals(StringConstants.ParameterName.ExpectedNodeDeactivationDuration, StringComparison.OrdinalIgnoreCase));

            if (expectedNodeDeactivationDurationParameter != null)
            {
                expectedNodeDeactivationDurationParameter.Value = defaultNodeDeactivationDuration.ToString();
            }
            else
            {
                int originalParamCount = failoverManagerSettings.Parameter.Count();
                SettingsOverridesTypeSectionParameter[] newFailoverManagerSection = new SettingsOverridesTypeSectionParameter[originalParamCount + 1];
                Array.Copy(failoverManagerSettings.Parameter, newFailoverManagerSection, originalParamCount);
                newFailoverManagerSection[originalParamCount] = new SettingsOverridesTypeSectionParameter()
                {
                    Name  = StringConstants.ParameterName.ExpectedNodeDeactivationDuration,
                    Value = defaultNodeDeactivationDuration.ToString()
                };

                failoverManagerSettings.Parameter = newFailoverManagerSection;
            }

            var seedNodeNames = seedNodes.Select(item => item.NodeName);

            foreach (var node in nodelist)
            {
                node.IsSeedNode = seedNodeNames.Contains(node.NodeName);
            }

            var updatedCluterManifest = new ClusterManifestType
            {
                FabricSettings = fabricSettings,
                Infrastructure = new ClusterManifestTypeInfrastructure()
                {
                    Item = new ClusterManifestTypeInfrastructureWindowsServer()
                    {
                        NodeList = nodelist.ToArray()
                    }
                },
                NodeTypes   = nodeTypes.ToArray(),
                Name        = StringConstants.ClusterManifestName,
                Version     = clusterManifestVersion,
                Description = GeneratedCluterManifestDescription
            };

            this.SortClusterManifest(updatedCluterManifest);
            return(updatedCluterManifest);
        }
Пример #14
0
        public FabricSettingsMetadata GetFabricSettingsMetadata()
        {
            string fabricSettingFilePath = Utility.FindFabricResourceFile(Constant.ConfigurationsFileName);

            return(FabricSettingsMetadata.Create(fabricSettingFilePath));
        }