/// <summary>
        /// Converts user supplied cluster create parameters to IaasCluster type as understood by the Resource Provider.
        /// </summary>
        /// <param name="clusterCreateParameters">User supplied cluster create parameters.</param>
        /// <param name="userSubscriptionId">User's subscription Id.</param>
        /// <returns>An Instance of IaasCluster</returns>
        public static IaasCluster ConvertToIaasCluster(ClusterCreateParametersV2 clusterCreateParameters, string userSubscriptionId)
        {
            if (clusterCreateParameters == null)
            {
                throw new ArgumentNullException("clusterCreateParameters");
            }

            if (String.IsNullOrEmpty(userSubscriptionId))
            {
                throw new ArgumentNullException("userSubscriptionId");
            }

            var correlationId = Guid.NewGuid().ToString();

            var iaasCluster = new IaasCluster()
            {
                Id                  = clusterCreateParameters.Name,
                Location            = clusterCreateParameters.Location,
                ApiVersion          = "1.0",
                UserSubscriptionId  = userSubscriptionId,
                UserTags            = new Dictionary <string, string>(),
                HdiVersion          = clusterCreateParameters.Version,
                DeploymentDocuments = new Dictionary <string, string>()
                {
                    { IaasClusterDocumentTypes.EmbeddedAmbariConfigurationDocument, GenerateAmbariConfigurationDocument(clusterCreateParameters) },
                    { IaasClusterDocumentTypes.EmbeddedAzureConfigurationDocument, GenerateAzureDocument(clusterCreateParameters) }
                }
            };

            iaasCluster.UserTags.Add("Client", string.Format("HDInsight .Net SDK {0}", Assembly.GetExecutingAssembly().GetName().Version.ToString()));

            return(iaasCluster);
        }
Beispiel #2
0
 internal GetIaasClusterResult(ClusterDetails clusterDetails, IaasCluster resultOfGetClusterCall)
 {
     if (clusterDetails == null)
     {
         throw new ArgumentNullException("clusterDetails");
     }
     this.clusterDetails         = clusterDetails;
     this.resultOfGetClusterCall = resultOfGetClusterCall;
 }
Beispiel #3
0
        private async Task <GetIaasClusterResult> GetIaasClusterFromCloudServiceResource(CloudService cloudService, Resource clusterResource)
        {
            var clusterDetails = PayloadConverterIaasClusters.CreateClusterDetailsFromRdfeResourceOutput(cloudService.GeoRegion, clusterResource);

            HDInsight.ClusterState clusterState = clusterDetails.State;

            IaasCluster clusterFromGetClusterCall = null;

            if (clusterState != HDInsight.ClusterState.Deleting &&
                clusterState != HDInsight.ClusterState.DeletePending)
            {
                //we want to poll if we are either in error or unknown state.
                //this is so that we can get the extended error information.
                try
                {
                    PassthroughResponse response = await
                                                   this.rdfeRestClient.GetCluster(
                        this.credentials.SubscriptionId.ToString(),
                        this.GetCloudServiceName(cloudService.GeoRegion),
                        this.credentials.DeploymentNamespace,
                        clusterResource.Name,
                        this.Context.CancellationToken);

                    clusterFromGetClusterCall = this.SafeGetDataFromPassthroughResponse <IaasCluster>(response);

                    clusterDetails = PayloadConverterIaasClusters.CreateClusterDetailsFromGetClustersResult(clusterFromGetClusterCall);
                }
                catch (Exception)
                {
                    // Ignore all exceptions. We don't want ListContainers to fail on customers for whatever reason.
                    // If there is an issue with obtaining details about the cluster, mark the cluster in Error state with a generic error message

                    clusterDetails.State = ClusterState.Error;
                    if (clusterDetails.Error != null && string.IsNullOrEmpty(clusterDetails.Error.Message))
                    {
                        clusterDetails.Error.Message = "Unexpected error occurred. Could not retrieve details about the cluster.";
                    }
                }
            }

            clusterDetails.SubscriptionId = this.credentials.SubscriptionId;

            return(new GetIaasClusterResult(clusterDetails, clusterFromGetClusterCall));
        }
        /// <summary>
        /// Creates the rdfe resource input from wire input.
        /// This method wraps what is needed by the RP within a RDFE resource input object.
        /// </summary>
        /// <param name="iaasCluster">The Iaas cluster as needed by the RP.</param>
        /// <param name="schemaVersion">The schema version for the RDFE resource.</param>
        /// <returns>An RDFE Resource input from wire create parameters.</returns>
        /// <exception cref="System.ArgumentNullException">Thrown if wireCreateParameters is null.</exception>
        public static RDFEResource CreateRdfeResource(IaasCluster iaasCluster, string schemaVersion)
        {
            if (iaasCluster == null)
            {
                throw new ArgumentNullException("createIaasClusterRequest");
            }

            if (schemaVersion == null)
            {
                throw new ArgumentNullException("schemaVersion");
            }

            var rdfeResource = new RDFEResource
            {
                SchemaVersion     = schemaVersion,
                IntrinsicSettings = new XmlNode[] { SerializeToXmlNode(iaasCluster) }
            };

            return(rdfeResource);
        }
        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);
        }