private async Task Specialize(HostAssignmentContext assignmentContext) { try { var zip = assignmentContext.ZipUrl; if (!string.IsNullOrEmpty(zip)) { // download zip and extract var filePath = Path.GetTempFileName(); await DownloadAsync(new Uri(zip), filePath); assignmentContext.ApplyAppSettings(); ZipFile.ExtractToDirectory(filePath, _webHostSettings.ScriptPath, overwriteFiles: true); } else { assignmentContext.ApplyAppSettings(); } // set flags which will trigger specialization _settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsitePlaceholderMode, "0"); _settingsManager.SetSetting(EnvironmentSettingNames.AzureWebsiteContainerReady, "1"); } catch (Exception ex) { _logger.LogError(ex, $"Error calling {nameof(Specialize)}"); } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment); // We need to get the non-PlaceholderMode script path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); var zipPath = assignmentContext.ZipUrl; if (!string.IsNullOrEmpty(zipPath)) { // download zip and extract var zipUri = new Uri(zipPath); var filePath = await DownloadAsync(zipUri); UnpackPackage(filePath, options.ScriptPath); string bundlePath = Path.Combine(options.ScriptPath, "worker-bundle"); if (Directory.Exists(bundlePath)) { _logger.LogInformation($"Python worker bundle detected"); } } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment); // We need to get the non-PlaceholderMode script Path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); RunFromPackageContext pkgContext = assignmentContext.GetRunFromPkgContext(); if ((pkgContext.IsScmRunFromPackage() && await pkgContext.BlobExistsAsync(_logger)) || (!pkgContext.IsScmRunFromPackage() && !string.IsNullOrEmpty(pkgContext.Url) && pkgContext.Url != "1")) { await ApplyBlobPackageContext(pkgContext, options.ScriptPath); } else if (!string.IsNullOrEmpty(assignmentContext.AzureFilesConnectionString)) { await _meshInitServiceClient.MountCifs(assignmentContext.AzureFilesConnectionString, assignmentContext.AzureFilesContentShare, "/home"); } // BYOS var storageVolumes = assignmentContext.GetBYOSEnvironmentVariables() .Select(AzureStorageInfoValue.FromEnvironmentVariable).ToList(); var mountedVolumes = (await Task.WhenAll(storageVolumes.Where(v => v != null).Select(MountStorageAccount))).Where( result => result).ToList(); if (mountedVolumes.Count != storageVolumes.Count) { _logger.LogWarning( $"Successfully mounted {mountedVolumes.Count} / {storageVolumes.Count} BYOS storage accounts"); } }
private async Task Assign(HostAssignmentContext assignmentContext) { try { // first make all environment and file system changes required for // the host to be specialized assignmentContext.ApplyAppSettings(); KuduEventGenerator.Log(null).LogMessage(EventLevel.Informational, assignmentContext.SiteName, $"Mounting file share at {DateTime.UtcNow}", string.Empty); // Limit the amount of time time we allow for mounting to complete var mounted = await MountFileShareWithin(TimeSpan.FromSeconds(30)); KuduEventGenerator.Log(null).LogMessage(EventLevel.Informational, assignmentContext.SiteName, $"Mount file share result: {mounted} at {DateTime.UtcNow}", string.Empty); } catch (Exception) { throw; } finally { // all assignment settings/files have been applied so we can flip // the switch now on specialization // even if there are failures applying context above, we want to // leave placeholder mode _linuxConsumptionEnv.FlagAsSpecializedAndReady(); _linuxConsumptionEnv.ResumeRequests(); } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment); // We need to get the non-PlaceholderMode script path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); var zipPath = assignmentContext.ZipUrl; if (!string.IsNullOrEmpty(zipPath)) { // download zip and extract var zipUri = new Uri(zipPath); var filePath = Path.GetTempFileName(); await DownloadAsync(zipUri, filePath); using (_metricsLogger.LatencyEvent(MetricEventNames.LinuxContainerSpecializationZipExtract)) { _logger.LogInformation($"Extracting files to '{options.ScriptPath}'"); ZipFile.ExtractToDirectory(filePath, options.ScriptPath, overwriteFiles: true); _logger.LogInformation($"Zip extraction complete"); } string bundlePath = Path.Combine(options.ScriptPath, "worker-bundle"); if (Directory.Exists(bundlePath)) { _logger.LogInformation($"Python worker bundle detected"); } } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment); // We need to get the non-PlaceholderMode script Path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); RunFromPackageContext pkgContext = assignmentContext.GetRunFromPkgContext(); if ((pkgContext.IsScmRunFromPackage() && await pkgContext.BlobExistsAsync(_logger)) || (!pkgContext.IsScmRunFromPackage() && !string.IsNullOrEmpty(pkgContext.Url) && pkgContext.Url != "1")) { await ApplyBlobPackageContext(pkgContext, options.ScriptPath); } else if (!string.IsNullOrEmpty(assignmentContext.AzureFilesConnectionString)) { await MountCifs(assignmentContext.AzureFilesConnectionString, assignmentContext.AzureFilesContentShare, "/home"); } // Irrespective of deployment mechanism mount the share for user data files. if (assignmentContext.IsUserDataMountEnabled()) { if (!string.IsNullOrEmpty(assignmentContext.AzureFilesConnectionString) && !string.IsNullOrEmpty(assignmentContext.AzureFilesContentShare)) { await MountUserData(assignmentContext); } else { _logger.LogWarning( $"{EnvironmentSettingNames.AzureFilesConnectionString} or {EnvironmentSettingNames.AzureFilesContentShare} is empty. User data share will not be mounted"); } } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(); if (!string.IsNullOrEmpty(assignmentContext.ZipUrl)) { // download zip and extract var zipUri = new Uri(assignmentContext.ZipUrl); var filePath = Path.GetTempFileName(); await DownloadAsync(zipUri, filePath); _logger.LogInformation($"Extracting files to '{_webHostSettings.ScriptPath}'"); ZipFile.ExtractToDirectory(filePath, _webHostSettings.ScriptPath, overwriteFiles: true); _logger.LogInformation($"Zip extraction complete"); } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment); // We need to get the non-PlaceholderMode script Path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); RunFromPackageContext pkgContext = assignmentContext.GetRunFromPkgContext(); if ((pkgContext.IsScmRunFromPackage() && await pkgContext.BlobExistsAsync(_logger)) || (!pkgContext.IsScmRunFromPackage() && !string.IsNullOrEmpty(pkgContext.Url) && pkgContext.Url != "1")) { await ApplyBlobPackageContext(pkgContext, options.ScriptPath); } else if (!string.IsNullOrEmpty(assignmentContext.AzureFilesConnectionString)) { ApplyAzureFilesContext(assignmentContext.AzureFilesConnectionString, assignmentContext.AzureFilesContentShare, "/home"); } }
private async Task Assign(HostAssignmentContext assignmentContext) { try { // first make all environment and file system changes required for // the host to be specialized assignmentContext.ApplyAppSettings(); } catch (Exception) { throw; } finally { // all assignment settings/files have been applied so we can flip // the switch now on specialization // even if there are failures applying context above, we want to // leave placeholder mode _linuxConsumptionEnv.FlagAsSpecializedAndReady(); _linuxConsumptionEnv.ResumeRequests(); } }
private async Task ApplyContext(HostAssignmentContext assignmentContext) { _logger.LogInformation($"Applying {assignmentContext.Environment.Count} app setting(s)"); assignmentContext.ApplyAppSettings(_environment, _logger); // We need to get the non-PlaceholderMode script Path so we can unzip to the correct location. // This asks the factory to skip the PlaceholderMode check when configuring options. var options = _optionsFactory.Create(ScriptApplicationHostOptionsSetup.SkipPlaceholder); RunFromPackageContext pkgContext = assignmentContext.GetRunFromPkgContext(); if (_environment.SupportsAzureFileShareMount()) { var azureFilesMounted = false; if (assignmentContext.IsAzureFilesContentShareConfigured(_logger)) { azureFilesMounted = await _runFromPackageHandler.MountAzureFileShare(assignmentContext); } else { _logger.LogError( $"No {nameof(EnvironmentSettingNames.AzureFilesConnectionString)} or {nameof(EnvironmentSettingNames.AzureFilesContentShare)} configured. Azure FileShare will not be mounted. For PowerShell Functions, Managed Dependencies will not persisted across functions host instances."); } if (pkgContext.IsRunFromPackage(options, _logger)) { if (azureFilesMounted) { _logger.LogWarning("App is configured to use both Run-From-Package and AzureFiles. Run-From-Package will take precedence"); } var blobContextApplied = await _runFromPackageHandler.ApplyBlobPackageContext(pkgContext, options.ScriptPath, azureFilesMounted, false); if (!blobContextApplied && azureFilesMounted) { _logger.LogWarning($"Failed to {nameof(_runFromPackageHandler.ApplyBlobPackageContext)}. Attempting to use local disk instead"); await _runFromPackageHandler.ApplyBlobPackageContext(pkgContext, options.ScriptPath, false); } } else { _logger.LogInformation($"No {nameof(EnvironmentSettingNames.AzureWebsiteRunFromPackage)} configured"); } } else { if (pkgContext.IsRunFromPackage(options, _logger)) { await _runFromPackageHandler.ApplyBlobPackageContext(pkgContext, options.ScriptPath, false); } else if (assignmentContext.IsAzureFilesContentShareConfigured(_logger)) { await _runFromPackageHandler.MountAzureFileShare(assignmentContext); } } // BYOS var storageVolumes = assignmentContext.GetBYOSEnvironmentVariables() .Select(AzureStorageInfoValue.FromEnvironmentVariable).ToList(); var mountedVolumes = (await Task.WhenAll(storageVolumes.Where(v => v != null).Select(MountStorageAccount))).Where( result => result).ToList(); if (storageVolumes.Any()) { if (mountedVolumes.Count != storageVolumes.Count) { _logger.LogWarning( $"Successfully mounted {mountedVolumes.Count} / {storageVolumes.Count} BYOS storage accounts"); } else { _logger.LogInformation( $"Successfully mounted {storageVolumes.Count} BYOS storage accounts"); } } }