private void CreateConfiguration()
        {
            var publicSettings  = new DscPublicSettings();
            var privateSettings = new DscPrivateSettings();

            publicSettings.ProtocolVersion = CurrentProtocolVersion;

            if (!string.IsNullOrEmpty(this.ConfigurationArchive))
            {
                ConfigurationUris configurationUris = UploadConfigurationDataToBlob();

                publicSettings.SasToken              = configurationUris.SasToken;
                publicSettings.ModulesUrl            = configurationUris.ModulesUrl;
                publicSettings.ConfigurationFunction = string.Format(
                    CultureInfo.InvariantCulture,
                    "{0}\\{1}",
                    Path.GetFileNameWithoutExtension(this.ConfigurationArchive),
                    this.ConfigurationName);
                Tuple <DscPublicSettings.Property[], Hashtable> settings =
                    DscSettingsSerializer.SeparatePrivateItems(this.ConfigurationArgument);
                publicSettings.Properties = settings.Item1;
                privateSettings.Items     = settings.Item2;

                privateSettings.DataBlobUri = configurationUris.DataBlobUri;
            }

            //
            // Define the public and private property bags that will be passed to the extension.
            //
            this.PublicConfiguration = DscSettingsSerializer.SerializePublicSettings(publicSettings);
            //
            // PrivateConfuguration contains sensitive data in a plain text.
            //
            this.PrivateConfiguration = DscSettingsSerializer.SerializePrivateSettings(privateSettings);
        }
        internal void ExecuteCommand()
        {
            List <ResourceExtensionReference> extensionRefs = GetPredicateExtensionList();

            WriteObject(
                extensionRefs == null ? null : extensionRefs.Select(
                    r =>
            {
                GetExtensionValues(r);
                DscPublicSettings publicSettings = null;
                try
                {
                    publicSettings = DscSettingsSerializer.DeserializePublicSettings(PublicConfiguration);
                }
                catch (JsonException e)
                {
                    this.ThrowTerminatingError(
                        new ErrorRecord(
                            new JsonException(
                                String.Format(
                                    CultureInfo.CurrentUICulture,
                                    Properties.Resources.AzureVMDscWrongSettingsFormat,
                                    PublicConfiguration),
                                e),
                            string.Empty,
                            ErrorCategory.ParserError,
                            null));
                }
                var context = new VirtualMachineDscExtensionContext
                {
                    ExtensionName        = r.Name,
                    Publisher            = r.Publisher,
                    ReferenceName        = r.ReferenceName,
                    Version              = r.Version,
                    State                = r.State,
                    RoleName             = VM.GetInstance().RoleName,
                    PublicConfiguration  = PublicConfiguration,
                    PrivateConfiguration = SecureStringHelper.GetSecureString(PrivateConfiguration)
                };

                if (publicSettings == null)
                {
                    context.ModulesUrl            = string.Empty;
                    context.ConfigurationFunction = string.Empty;
                    context.Properties            = null;
                }
                else
                {
                    context.ModulesUrl            = publicSettings.ModulesUrl;
                    context.ConfigurationFunction = publicSettings.ConfigurationFunction;
                    context.Properties            = new Hashtable(publicSettings.Properties.ToDictionary(x => x.Name, x => x.Value));
                }

                return(context);
            }

                    ).FirstOrDefault());
        }
        private void CreateConfiguration()
        {
            var publicSettings = new DscPublicSettings();
            var privateSettings = new DscPrivateSettings();
            publicSettings.ProtocolVersion = CurrentProtocolVersion;

            if (!string.IsNullOrEmpty(this.ConfigurationArchive))
            {
                ConfigurationUris configurationUris = UploadConfigurationDataToBlob();

                publicSettings.SasToken = configurationUris.SasToken;
                publicSettings.ModulesUrl = configurationUris.ModulesUrl;
                publicSettings.ConfigurationFunction = string.Format(
                    CultureInfo.InvariantCulture,
                    "{0}\\{1}",
                    Path.GetFileNameWithoutExtension(this.ConfigurationArchive),
                    this.ConfigurationName);
                Tuple<DscPublicSettings.Property[], Hashtable> settings =
                    DscSettingsSerializer.SeparatePrivateItems(this.ConfigurationArgument);
                publicSettings.Properties = settings.Item1;
                privateSettings.Items = settings.Item2;

                privateSettings.DataBlobUri = configurationUris.DataBlobUri;
            }

            //
            // Define the public and private property bags that will be passed to the extension.
            //
            this.PublicConfiguration = DscSettingsSerializer.SerializePublicSettings(publicSettings);
            //
            // PrivateConfuguration contains sensitive data in a plain text.
            //
            this.PrivateConfiguration = DscSettingsSerializer.SerializePrivateSettings(privateSettings);
        }
        /// <summary>
        /// Helper function for tests.
        /// </summary>
        /// <param name="configurationArguments"></param>
        /// <param name="privateSettings"></param>
        /// <returns></returns>
        private static DscPublicSettings GetPublicPrivateAfterDeseriazlization(
            Hashtable configurationArguments,
            out DscPrivateSettings privateSettings)
        {
            Tuple<DscPublicSettings.Property[], Hashtable> separatedSettings =
                DscSettingsSerializer.SeparatePrivateItems(configurationArguments);
            DscPublicSettings publicSettings = new DscPublicSettings();
            privateSettings = new DscPrivateSettings();
            publicSettings.Properties = separatedSettings.Item1;
            privateSettings.Items = separatedSettings.Item2;

            string serializedPublic = DscSettingsSerializer.SerializePublicSettings(publicSettings);
            string serializedPrivate = DscSettingsSerializer.SerializePrivateSettings(privateSettings);

            publicSettings = DscSettingsSerializer.DeserializePublicSettings(serializedPublic);
            privateSettings = DeserializePrivateSettings(serializedPrivate);
            return publicSettings;
        }
Beispiel #5
0
        private void CreateConfiguration()
        {
            var publicSettings = new DscPublicSettings();

            var privateSettings = new DscPrivateSettings();

            if (!string.IsNullOrEmpty(this.ConfigurationArchive))
            {
                //
                // Get a reference to the container in blob storage
                //
                var storageAccount = string.IsNullOrEmpty(this.StorageEndpointSuffix)
                                   ? new CloudStorageAccount(this._storageCredentials, true)
                                   : new CloudStorageAccount(this._storageCredentials, this.StorageEndpointSuffix, true);

                var blobClient = storageAccount.CreateCloudBlobClient();

                var containerReference = blobClient.GetContainerReference(this.ContainerName);

                //
                // Get a reference to the configuration blob and create a SAS token to access it
                //
                var blobAccessPolicy = new SharedAccessBlobPolicy()
                {
                    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                    Permissions            = SharedAccessBlobPermissions.Read
                };

                var configurationBlobName = this.ConfigurationArchive;

                var configurationBlobReference = containerReference.GetBlockBlobReference(configurationBlobName);

                var configurationBlobSasToken = configurationBlobReference.GetSharedAccessSignature(blobAccessPolicy);

                //
                // Upload the configuration data to blob storage and get a SAS token
                //
                string configurationDataBlobUri = null;

                if (this.ConfigurationDataPath != null)
                {
                    this.ConfirmAction(true, string.Empty, string.Format(CultureInfo.CurrentUICulture, Resources.AzureVMDscUploadToBlobStorageAction, this.ConfigurationDataPath), configurationBlobReference.Uri.AbsoluteUri, () =>
                    {
                        var guid = Guid.NewGuid(); // there may be multiple VMs using the same configuration

                        var configurationDataBlobName = string.Format(CultureInfo.InvariantCulture, "{0}-{1}.psd1", this.ConfigurationName, guid);

                        var configurationDataBlobReference = containerReference.GetBlockBlobReference(configurationDataBlobName);

                        if (!this.Force && configurationDataBlobReference.Exists())
                        {
                            this.ThrowTerminatingError(
                                new ErrorRecord(
                                    new UnauthorizedAccessException(string.Format(CultureInfo.CurrentUICulture, Resources.AzureVMDscStorageBlobAlreadyExists, configurationDataBlobName)),
                                    string.Empty,
                                    ErrorCategory.PermissionDenied,
                                    null));
                        }

                        configurationDataBlobReference.UploadFromFile(this.ConfigurationDataPath, FileMode.Open);

                        var configurationDataBlobSasToken = configurationDataBlobReference.GetSharedAccessSignature(blobAccessPolicy);

                        configurationDataBlobUri = configurationDataBlobReference.StorageUri.PrimaryUri.AbsoluteUri + configurationDataBlobSasToken;
                    });
                }

                publicSettings.SasToken              = configurationBlobSasToken;
                publicSettings.ModulesUrl            = configurationBlobReference.StorageUri.PrimaryUri.AbsoluteUri;
                publicSettings.ConfigurationFunction = string.Format(CultureInfo.InvariantCulture, "{0}\\{1}", Path.GetFileNameWithoutExtension(this.ConfigurationArchive), this.ConfigurationName);
                publicSettings.Properties            = this.ConfigurationArgument;

                privateSettings.DataBlobUri = configurationDataBlobUri;
            }

            //
            // Define the public and private property bags that will be passed to the extension.
            //
            this.PublicConfiguration  = JsonUtilities.TryFormatJson(JsonConvert.SerializeObject(publicSettings));
            this.PrivateConfiguration = JsonUtilities.TryFormatJson(JsonConvert.SerializeObject(privateSettings));
        }
        private void CreateConfiguration()
        {
            var publicSettings = new DscPublicSettings();
            
            var privateSettings = new DscPrivateSettings();

            if (!string.IsNullOrEmpty(this.ConfigurationArchive))
            {
                //
                // Get a reference to the container in blob storage
                //
                var storageAccount = string.IsNullOrEmpty(this.StorageEndpointSuffix)
                                   ? new CloudStorageAccount(this._storageCredentials, true)
                                   : new CloudStorageAccount(this._storageCredentials, this.StorageEndpointSuffix, true);

                var blobClient = storageAccount.CreateCloudBlobClient();

                var containerReference = blobClient.GetContainerReference(this.ContainerName);
            
                //
                // Get a reference to the configuration blob and create a SAS token to access it
                //
                var blobAccessPolicy = new SharedAccessBlobPolicy()
                {
                    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
                    Permissions = SharedAccessBlobPermissions.Read
                };

                var configurationBlobName = this.ConfigurationArchive;

                var configurationBlobReference = containerReference.GetBlockBlobReference(configurationBlobName);

                var configurationBlobSasToken = configurationBlobReference.GetSharedAccessSignature(blobAccessPolicy);

                //
                // Upload the configuration data to blob storage and get a SAS token
                //
                string configurationDataBlobUri = null;

                if (this.ConfigurationDataPath != null)
                {
                    this.ConfirmAction(true, string.Empty, string.Format(CultureInfo.CurrentUICulture, Resources.AzureVMDscUploadToBlobStorageAction, this.ConfigurationDataPath), configurationBlobReference.Uri.AbsoluteUri, ()=>
                    {
                        var guid = Guid.NewGuid(); // there may be multiple VMs using the same configuration

                        var configurationDataBlobName = string.Format(CultureInfo.InvariantCulture, "{0}-{1}.psd1", this.ConfigurationName, guid);

                        var configurationDataBlobReference = containerReference.GetBlockBlobReference(configurationDataBlobName);

                        if (!this.Force && configurationDataBlobReference.Exists())
                        {
                            this.ThrowTerminatingError(
                                new ErrorRecord(
                                    new UnauthorizedAccessException(string.Format(CultureInfo.CurrentUICulture, Resources.AzureVMDscStorageBlobAlreadyExists, configurationDataBlobName)),
                                    string.Empty,
                                    ErrorCategory.PermissionDenied,
                                    null));
                        }

                        configurationDataBlobReference.UploadFromFile(this.ConfigurationDataPath, FileMode.Open);

                        var configurationDataBlobSasToken = configurationDataBlobReference.GetSharedAccessSignature(blobAccessPolicy);

                        configurationDataBlobUri = configurationDataBlobReference.StorageUri.PrimaryUri.AbsoluteUri + configurationDataBlobSasToken;
                    });
                }

                publicSettings.SasToken              = configurationBlobSasToken;
                publicSettings.ModulesUrl            = configurationBlobReference.StorageUri.PrimaryUri.AbsoluteUri;
                publicSettings.ConfigurationFunction = string.Format(CultureInfo.InvariantCulture, "{0}\\{1}", Path.GetFileNameWithoutExtension(this.ConfigurationArchive), this.ConfigurationName);
                publicSettings.Properties            = this.ConfigurationArgument;

                privateSettings.DataBlobUri = configurationDataBlobUri;
            }

            //
            // Define the public and private property bags that will be passed to the extension.
            //
            this.PublicConfiguration = JsonUtilities.TryFormatJson(JsonConvert.SerializeObject(publicSettings));
            this.PrivateConfiguration = JsonUtilities.TryFormatJson(JsonConvert.SerializeObject(privateSettings));
        }