private async Task RunBuildCacheAsync( Context context, BuildCacheServiceConfiguration config, Func <ICache, Task> funcAsync) { VssCredentialsFactory credentialsFactory = new VssCredentialsFactory(new VsoCredentialHelper()); ICache cache = BuildCacheCacheFactory.Create(_fileSystem, _logger, credentialsFactory, config, null); using (cache) { BoolResult r = await cache.StartupAsync(context); if (!r.Succeeded) { _tracer.Error(context, $"Failed to start up BuildCache client. Result=[{r}]"); return; } try { await funcAsync(cache); } finally { r = await cache.ShutdownAsync(context); if (!r.Succeeded) { _tracer.Error(context, $"Failed to shut down BuildCache client. Result=[{r}]"); } } } }
internal static BuildXL.Cache.MemoizationStore.Interfaces.Caches.ICache CreateBuildCacheCache <T>(T cacheConfig, ILogger logger, string pat = null) where T : BuildCacheCacheConfig { // TODO: Remove check when all clients are updated with unified Dedup flag if ((ContentHashingUtilities.HashInfo.HashType.IsValidDedup()) ^ cacheConfig.UseDedupStore) { var store = cacheConfig.UseDedupStore ? "DedupStore" : "BlobStore"; throw new ArgumentException($"HashType {ContentHashingUtilities.HashInfo.HashType} cannot be used with {store}"); } var credentialProviderHelper = new CredentialProviderHelper(m => logger.Debug(m)); if (credentialProviderHelper.IsCredentialProviderSpecified()) { logger.Debug($"Credential providers path specified: '{credentialProviderHelper.CredentialHelperPath}'"); } else { logger.Debug("Using current user's credentials for obtaining AAD token"); } var credentialsFactory = new VssCredentialsFactory(pat, credentialProviderHelper, m => logger.Debug(m)); logger.Diagnostic("Creating BuildCacheCache factory"); var fileSystem = new PassThroughFileSystem(logger); // TODO: Once write-behind is implemented send a contentstorefunc down to the create. Func <IContentStore> writeThroughStore = null; if (!string.IsNullOrWhiteSpace(cacheConfig.CacheName)) { ServiceClientRpcConfiguration rpcConfiguration; if (cacheConfig.GrpcPort != 0) { rpcConfiguration = new ServiceClientRpcConfiguration((int)cacheConfig.GrpcPort); } else { var factory = new MemoryMappedFileGrpcPortSharingFactory(logger, cacheConfig.GrpcPortFileName); var portReader = factory.GetPortReader(); var port = portReader.ReadPort(); rpcConfiguration = new ServiceClientRpcConfiguration(port); } writeThroughStore = () => new ServiceClientContentStore( logger, fileSystem, cacheConfig.CacheName, rpcConfiguration, cacheConfig.ConnectionRetryIntervalSeconds, cacheConfig.ConnectionRetryCount, scenario: cacheConfig.ScenarioName); } BuildCacheServiceConfiguration buildCacheServiceConfiguration = cacheConfig.AsBuildCacheServiceConfigurationFile(); return(BuildCacheCacheFactory.Create(fileSystem, logger, credentialsFactory, buildCacheServiceConfiguration, writeThroughStore)); }
internal static BuildXL.Cache.MemoizationStore.Interfaces.Caches.ICache CreateBuildCacheCache <T>(T cacheConfig, ILogger logger, string pat = null) where T : BuildCacheCacheConfig { // TODO: Remove check when all clients are updated with unified Dedup flag if (ContentHashingUtilities.HashInfo.HashType == HashType.DedupNodeOrChunk ^ cacheConfig.UseDedupStore) { var store = cacheConfig.UseDedupStore ? "DedupStore" : "BlobStore"; throw new ArgumentException($"HashType {ContentHashingUtilities.HashInfo.HashType} cannot be used with {store}"); } string credentialProviderPath = Environment.GetEnvironmentVariable(CredentialProvidersPathEnvVariable); if (!string.IsNullOrWhiteSpace(credentialProviderPath)) { logger.Debug($"Credential providers path specified: {credentialProviderPath}"); } else { logger.Debug("Using current user's credentials for obtaining AAD token"); } VssCredentialsFactory credentialsFactory; #if !PLATFORM_OSX string userName = null; // when running on .NET Framework, user name doesn't have to be explicitly provided #if FEATURE_CORECLR userName = GetAadUserNameUpn(); #endif credentialsFactory = new VssCredentialsFactory(new VsoCredentialHelper(s => logger.Debug(s)), userName); #else var secPat = new SecureString(); if (!string.IsNullOrWhiteSpace(pat)) { foreach (char c in pat) { secPat.AppendChar(c); } } else { throw new ArgumentException("PAT must be supplied when running with CoreCLR"); } credentialsFactory = new VssCredentialsFactory(new VssBasicCredential(new NetworkCredential(string.Empty, secPat))); #endif logger.Diagnostic("Creating BuildCacheCache factory"); var fileSystem = new PassThroughFileSystem(logger); // TODO: Once write-behind is implemented send a contentstorefunc down to the create. Func <IContentStore> writeThroughStore = null; if (!string.IsNullOrWhiteSpace(cacheConfig.CacheName)) { ServiceClientRpcConfiguration rpcConfiguration; if (cacheConfig.GrpcPort != 0) { rpcConfiguration = new ServiceClientRpcConfiguration((int)cacheConfig.GrpcPort); } else { var factory = new MemoryMappedFileGrpcPortSharingFactory(logger, cacheConfig.GrpcPortFileName); var portReader = factory.GetPortReader(); var port = portReader.ReadPort(); rpcConfiguration = new ServiceClientRpcConfiguration(port); } writeThroughStore = () => new ServiceClientContentStore( logger, fileSystem, cacheConfig.CacheName, rpcConfiguration, cacheConfig.ConnectionRetryIntervalSeconds, cacheConfig.ConnectionRetryCount, scenario: cacheConfig.ScenarioName); } BuildCacheServiceConfiguration buildCacheServiceConfiguration = cacheConfig.AsBuildCacheServiceConfigurationFile(); return(BuildCacheCacheFactory.Create(fileSystem, logger, credentialsFactory, buildCacheServiceConfiguration, writeThroughStore)); }
internal static BuildXL.Cache.MemoizationStore.Interfaces.Caches.ICache CreateBuildCacheCache <T>(T cacheConfig, ILogger logger, string pat = null) where T : BuildCacheCacheConfig { // TODO: Remove check when all clients are updated with unified Dedup flag if ((ContentHashingUtilities.HashInfo.HashType.IsValidDedup()) ^ cacheConfig.UseDedupStore) { var store = cacheConfig.UseDedupStore ? "DedupStore" : "BlobStore"; throw new ArgumentException($"HashType {ContentHashingUtilities.HashInfo.HashType} cannot be used with {store}"); } string credentialProviderPath = Environment.GetEnvironmentVariable(CredentialProvidersPathEnvVariable); bool isCredentialProviderSpecified = !string.IsNullOrWhiteSpace(credentialProviderPath); if (isCredentialProviderSpecified) { logger.Debug($"Credential providers path specified: {credentialProviderPath}"); } else { logger.Debug("Using current user's credentials for obtaining AAD token"); } VssCredentialsFactory credentialsFactory; #if PLATFORM_WIN // Obtain and explicitly specify AAD user name ONLY when // (1) no credential provider is specified, and // (2) running on .NET Core. // When a credential provider is specified, specifying AAD user name will override it and we don't want to do that. // When running on .NET Framework, VsoCredentialHelper will automatically obtain currently logged on AAD user name. string userName = !isCredentialProviderSpecified && Utilities.OperatingSystemHelper.IsDotNetCore ? GetAadUserNameUpn() : null; credentialsFactory = new VssCredentialsFactory(new VsoCredentialHelper(s => logger.Debug(s)), userName); #else var secPat = new SecureString(); if (!string.IsNullOrWhiteSpace(pat)) { foreach (char c in pat) { secPat.AppendChar(c); } } else { throw new ArgumentException("PAT must be supplied when not running on Windows"); } credentialsFactory = new VssCredentialsFactory(new VssBasicCredential(new NetworkCredential(string.Empty, secPat))); #endif logger.Diagnostic("Creating BuildCacheCache factory"); var fileSystem = new PassThroughFileSystem(logger); // TODO: Once write-behind is implemented send a contentstorefunc down to the create. Func <IContentStore> writeThroughStore = null; if (!string.IsNullOrWhiteSpace(cacheConfig.CacheName)) { ServiceClientRpcConfiguration rpcConfiguration; if (cacheConfig.GrpcPort != 0) { rpcConfiguration = new ServiceClientRpcConfiguration((int)cacheConfig.GrpcPort); } else { var factory = new MemoryMappedFileGrpcPortSharingFactory(logger, cacheConfig.GrpcPortFileName); var portReader = factory.GetPortReader(); var port = portReader.ReadPort(); rpcConfiguration = new ServiceClientRpcConfiguration(port); } writeThroughStore = () => new ServiceClientContentStore( logger, fileSystem, cacheConfig.CacheName, rpcConfiguration, cacheConfig.ConnectionRetryIntervalSeconds, cacheConfig.ConnectionRetryCount, scenario: cacheConfig.ScenarioName); } BuildCacheServiceConfiguration buildCacheServiceConfiguration = cacheConfig.AsBuildCacheServiceConfigurationFile(); return(BuildCacheCacheFactory.Create(fileSystem, logger, credentialsFactory, buildCacheServiceConfiguration, writeThroughStore)); }