private static string GenerateAmbariConfigurationDocument(ClusterCreateParametersV2 clusterCreateParameters)
        {
            if (clusterCreateParameters == null)
            {
                throw new ArgumentNullException("clusterCreateParameters");
            }

            string document = VersionToDocumentMapper.GetAmbariConfigurationDocument(clusterCreateParameters.Version);
            AmbariConfigurationDocumentManager ambariConfigurationManager = new AmbariConfigurationDocumentManager(document);

            // Set password
            ambariConfigurationManager.SetPassword(clusterCreateParameters.Password);

            // Set default storage account information
            ambariConfigurationManager.RemoveStorageAccountEntries();
            ambariConfigurationManager.SetDefaultStorageAccount(clusterCreateParameters.DefaultStorageContainer, clusterCreateParameters.DefaultStorageAccountName, clusterCreateParameters.DefaultStorageAccountKey);

            // Set additional storage accounts
            foreach (var storageAccount in clusterCreateParameters.AdditionalStorageAccounts)
            {
                ambariConfigurationManager.SetAdditionalStorageAccount(storageAccount.Name, storageAccount.Key);
            }

            // Set custom metastores
            if (clusterCreateParameters.HiveMetastore != null)
            {
                ambariConfigurationManager.SetCustomHiveMetastore(clusterCreateParameters.HiveMetastore);
            }

            if (clusterCreateParameters.OozieMetastore != null)
            {
                ambariConfigurationManager.SetCustomOozieMetastore(clusterCreateParameters.OozieMetastore);
            }

            // Set user specified Hadoop configurations
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.CoreConfigurationKeyName, clusterCreateParameters.CoreConfiguration);
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.HdfsConfigurationKeyName, clusterCreateParameters.HdfsConfiguration);
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.YarnConfigurationKeyName, clusterCreateParameters.YarnConfiguration);
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.HiveConfigurationKeyName, clusterCreateParameters.HiveConfiguration.ConfigurationCollection);
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.OozieConfigurationKeyName, clusterCreateParameters.OozieConfiguration.ConfigurationCollection);
            ambariConfigurationManager.SetCustomConfigurations(AmbariConfigurationDocumentManager.MapredConfigurationKeyName, clusterCreateParameters.MapReduceConfiguration.ConfigurationCollection);

            return(ambariConfigurationManager.Document);
        }
        public static ClusterDetails CreateClusterDetailsFromGetClustersResult(IaasCluster clusterDetailsFromServer)
        {
            if (clusterDetailsFromServer == null)
            {
                throw new ArgumentNullException("clusterDetailsFromServer");
            }

            ClusterDetails clusterDetails = new ClusterDetails();

            clusterDetails.CreatedDate  = clusterDetailsFromServer.CreatedDate;
            clusterDetails.Location     = clusterDetailsFromServer.Location;
            clusterDetails.Name         = clusterDetailsFromServer.Id;
            clusterDetails.Version      = clusterDetailsFromServer.HdiVersion;
            clusterDetails.StateString  = clusterDetailsFromServer.State.ToString();
            clusterDetails.DeploymentId = clusterDetailsFromServer.TenantId.ToString() ?? string.Empty;

            if (!string.IsNullOrEmpty(clusterDetails.Version))
            {
                clusterDetails.VersionNumber = new PayloadConverter().ConvertStringToVersion(clusterDetails.Version);
                clusterDetails.VersionStatus = VersionFinderClient.GetVersionStatus(clusterDetails.Version);
            }
            else
            {
                clusterDetails.VersionNumber = new Version(0, 0);
            }

            clusterDetails.Version = clusterDetails.VersionNumber.ToString();

            // TODO: Determine this from the documents?
            clusterDetails.ClusterType = ClusterType.Hadoop;

            // This code will only run for IaasCluster which only supports Linux today
            // We would need to put this information in one of the documents at some point
            clusterDetails.OSType = OSType.Linux;

            if (clusterDetailsFromServer.Errors != null && clusterDetailsFromServer.Errors.Any())
            {
                // Populate error details with the most recent one. These occur if the deployment workflow errors out
                string errorDescription = string.Join(", ", clusterDetailsFromServer.Errors.Select(x => string.Format("{0} : {1}", x.ErrorCode, x.ErrorDescription)));
                clusterDetails.Error = new ClusterErrorStatus(0, errorDescription, string.Empty);
            }

            AzureCsmDocumentManager            azureCsmDocumentManager            = new AzureCsmDocumentManager(clusterDetailsFromServer.DeploymentDocuments[IaasClusterDocumentTypes.EmbeddedAzureConfigurationDocument]);
            AmbariConfigurationDocumentManager ambariConfigurationDocumentManager = new AmbariConfigurationDocumentManager(clusterDetailsFromServer.DeploymentDocuments[IaasClusterDocumentTypes.EmbeddedAmbariConfigurationDocument]);

            // Populate user name, passowrd, and server address information
            clusterDetails.HttpUserName = "******";
            clusterDetails.HttpPassword = ambariConfigurationDocumentManager.GetPassword();
            if (clusterDetailsFromServer.ConnectivityEndpoints != null)
            {
                foreach (var endpoint in clusterDetailsFromServer.ConnectivityEndpoints)
                {
                    var webEndPoint = endpoint as WebConnectivityEndpoint;
                    if (webEndPoint != null)
                    {
                        clusterDetails.ConnectionUrl = String.Format("https://{0}{1}", webEndPoint.Location, webEndPoint.Port > 0 ? String.Format(":{0}", webEndPoint.Port) : "");
                        break;
                    }
                }
            }

            clusterDetails.DefaultStorageAccount = ambariConfigurationDocumentManager.GetDefaultStorageAccount();

            // Populate additional Storage Accounts
            clusterDetails.AdditionalStorageAccounts = ambariConfigurationDocumentManager.GetAdditionalStorageAccounts();

            // Populate Data Node Count
            clusterDetails.ClusterSizeInNodes = azureCsmDocumentManager.GetWorkerNodeCount();

            return(clusterDetails);
        }