/// <summary> /// Validates the options and also ensures that all <c>null</c> properties are /// initialized to their default values. /// </summary> /// <param name="clusterDefinition">The cluster definition.</param> /// <param name="nodeName">The associated node name.</param> /// <exception cref="ClusterDefinitionException">Thrown if the definition is not valid.</exception> public void Validate(ClusterDefinition clusterDefinition, string nodeName) { Covenant.Requires <ArgumentNullException>(clusterDefinition != null, nameof(clusterDefinition)); var azureNodeOptionsPrefix = $"{nameof(ClusterDefinition.Hosting)}.{nameof(ClusterDefinition.Hosting.Azure)}"; // Set the cluster default storage types if necessary. if (StorageType == AzureStorageType.Default) { StorageType = clusterDefinition.Hosting.Azure.DefaultStorageType; if (StorageType == AzureStorageType.Default) { StorageType = AzureHostingOptions.defaultStorageType; } } if (OpenEBSStorageType == AzureStorageType.Default) { OpenEBSStorageType = clusterDefinition.Hosting.Azure.DefaultOpenEBSStorageType; if (OpenEBSStorageType == AzureStorageType.Default) { OpenEBSStorageType = AzureHostingOptions.defaultOpenEBSStorageType; } } // Validate the VM size, setting the cluster default if necessary. var vmSize = this.VmSize; if (string.IsNullOrEmpty(vmSize)) { vmSize = clusterDefinition.Hosting.Azure.DefaultVmSize; } this.VmSize = vmSize; // Validate the drive size, setting the cluster default if necessary. if (string.IsNullOrEmpty(this.DiskSize)) { this.DiskSize = clusterDefinition.Hosting.Azure.DefaultDiskSize; } if (!ByteUnits.TryParse(this.DiskSize, out var driveSizeBytes) || driveSizeBytes <= 1) { throw new ClusterDefinitionException($"cluster node [{nodeName}] configures [{azureNodeOptionsPrefix}.{nameof(DiskSize)}={DiskSize}] which is not valid."); } var driveSizeGiB = AzureHelper.GetDiskSizeGiB(StorageType, driveSizeBytes); this.DiskSize = $"{driveSizeGiB} GiB"; // Validate the OpenEBS disk size too. if (string.IsNullOrEmpty(this.OpenEBSDiskSize)) { this.OpenEBSDiskSize = clusterDefinition.Hosting.Azure.DefaultOpenEBSDiskSize; } if (!ByteUnits.TryParse(this.OpenEBSDiskSize, out var openEbsDiskSizeBytes) || openEbsDiskSizeBytes <= 1) { throw new ClusterDefinitionException($"cluster node [{nodeName}] configures [{azureNodeOptionsPrefix}.{nameof(OpenEBSDiskSize)}={OpenEBSDiskSize}] which is not valid."); } var openEBSDiskSizeGiB = AzureHelper.GetDiskSizeGiB(OpenEBSStorageType, openEbsDiskSizeBytes); this.DiskSize = $"{openEBSDiskSizeGiB} GiB"; }