public DarcRemoteFactory(
     BuildAssetRegistryContext context,
     IKustoClientProvider kustoClientProvider)
 {
     Context             = context;
     KustoClientProvider = (KustoClientProvider)kustoClientProvider;
 }
예제 #2
0
        static Startup()
        {
            Triggers <BuildChannel> .Inserted += entry =>
            {
                BuildAssetRegistryContext context = entry.Context as BuildAssetRegistryContext;
                ILogger <Startup>         logger  = context.GetService <ILogger <Startup> >();
                BuildChannel entity = entry.Entity;

                Build build = context.Builds
                              .Include(b => b.Assets)
                              .ThenInclude(a => a.Locations)
                              .FirstOrDefault(b => b.Id == entity.BuildId);

                if (build == null)
                {
                    logger.LogError($"Could not find build with id {entity.BuildId} in BAR. Skipping dependency update.");
                }
                else
                {
                    bool hasAssetsWithPublishedLocations = build.Assets
                                                           .Any(a => a.Locations.Any(al => al.Type != LocationType.None && !al.Location.EndsWith("/artifacts")));

                    if (hasAssetsWithPublishedLocations || ReposWithoutAssetLocationAllowList.Contains(build.GitHubRepository))
                    {
                        var queue = context.GetService <IBackgroundQueue>();
                        queue.Post <StartDependencyUpdate>(StartDependencyUpdate.CreateArgs(entity));
                    }
                    else
                    {
                        logger.LogInformation($"Skipping Dependency update for Build {entity.BuildId} because it contains no assets in valid locations");
                    }
                }
            };
        }
 public BuildTimeController(
     BuildAssetRegistryContext context,
     IKustoClientProvider kustoClientProvider)
 {
     _context             = context;
     _kustoClientProvider = (KustoClientProvider)kustoClientProvider;
 }
 public SubscriptionsController(
     BuildAssetRegistryContext context,
     IBackgroundQueue queue)
     : base(context, queue)
 {
     _context = context;
 }
예제 #5
0
        static Startup()
        {
            Triggers <BuildChannel> .Inserting += entry =>
            {
                BuildAssetRegistryContext context = entry.Context as BuildAssetRegistryContext;
                BuildChannel entity = entry.Entity;
                Build        build  = context.Builds.Find(entity.BuildId);

                if (build == null)
                {
                    ILogger <Startup> logger = context.GetService <ILogger <Startup> >();
                    logger.LogError($"Could not find build with id {entity.BuildId} in BAR. Skipping pipeline triggering.");
                }
                else
                {
                    if (build.PublishUsingPipelines && ChannelHasAssociatedReleasePipeline(entity.ChannelId, context))
                    {
                        entry.Cancel = true;
                        var queue = context.GetService <BackgroundQueue>();
                        var releasePipelineRunner = context.GetService <IReleasePipelineRunner>();
                        queue.Post(() => releasePipelineRunner.StartAssociatedReleasePipelinesAsync(entity.BuildId, entity.ChannelId));
                    }
                }
            };

            Triggers <BuildChannel> .Inserted += entry =>
            {
                DbContext    context = entry.Context;
                BuildChannel entity  = entry.Entity;

                var queue             = context.GetService <BackgroundQueue>();
                var dependencyUpdater = context.GetService <IDependencyUpdater>();
                queue.Post(() => dependencyUpdater.StartUpdateDependenciesAsync(entity.BuildId, entity.ChannelId));
            };
        }
예제 #6
0
        private async Task UpdateUserAsync(
            ApplicationUser user,
            BuildAssetRegistryContext dbContext,
            UserManager <ApplicationUser> userManager,
            SignInManager <ApplicationUser> signInManager)
        {
            using (IDbContextTransaction txn = await dbContext.Database.BeginTransactionAsync())
            {
                string token = await userManager.GetAuthenticationTokenAsync(user, GitHubScheme, "access_token");

                var          roles        = new HashSet <string>(await GetGithubRolesAsync(token));
                List <Claim> currentRoles = (await userManager.GetClaimsAsync(user))
                                            .Where(c => c.Type == ClaimTypes.Role)
                                            .ToList();

                // remove claims where github doesn't have the role anymore
                await userManager.RemoveClaimsAsync(user, currentRoles.Where(c => !roles.Contains(c.Value)));

                // add new claims
                await userManager.AddClaimsAsync(
                    user,
                    roles.Where(r => currentRoles.All(c => c.Value != r))
                    .Select(r => new Claim(ClaimTypes.Role, r, ClaimValueTypes.String, GitHubScheme)));

                user.LastUpdated = DateTimeOffset.UtcNow;
                await dbContext.SaveChangesAsync();

                txn.Commit();
            }
        }
예제 #7
0
 public BuildsController(
     BuildAssetRegistryContext context,
     ISystemClock clock)
     : base(context)
 {
     _clock = clock;
 }
예제 #8
0
        private async Task UpdateUserAsync(ApplicationUser user,
                                           BuildAssetRegistryContext dbContext,
                                           UserManager <ApplicationUser> userManager,
                                           SignInManager <ApplicationUser> signInManager,
                                           GitHubClaimResolver gitHubClaimResolver)
        {
            using (IDbContextTransaction txn = await dbContext.Database.BeginTransactionAsync())
            {
                string token = await userManager.GetAuthenticationTokenAsync(user, GitHubScheme, "access_token");

                var newClaims = (await gitHubClaimResolver.GetUserInformationClaims(token)).Concat(
                    await gitHubClaimResolver.GetMembershipClaims(token)
                    ).Where(AccountController.ShouldAddClaimToUser);
                var currentClaims = (await userManager.GetClaimsAsync(user)).ToList();

                // remove old claims
                await userManager.RemoveClaimsAsync(user, currentClaims);

                // add new claims
                await userManager.AddClaimsAsync(user, newClaims);

                user.LastUpdated = DateTimeOffset.UtcNow;
                await dbContext.SaveChangesAsync();

                txn.Commit();
            }
        }
예제 #9
0
        private async Task UpdateUserIfNeededAsync(ApplicationUser user,
                                                   BuildAssetRegistryContext dbContext,
                                                   UserManager <ApplicationUser> userManager,
                                                   SignInManager <ApplicationUser> signInManager,
                                                   GitHubClaimResolver gitHubClaimResolver)
        {
            while (true)
            {
                try
                {
                    if (ShouldUpdateUser(user))
                    {
                        await UpdateUserAsync(user, dbContext, userManager, signInManager, gitHubClaimResolver);
                    }

                    break;
                }
                catch (DbUpdateConcurrencyException)
                {
                    // If we have a concurrent modification exception reload the data from the DB and try again
                    foreach (EntityEntry entry in dbContext.ChangeTracker.Entries())
                    {
                        await entry.ReloadAsync();
                    }
                }
            }
        }
예제 #10
0
        static Startup()
        {
            Triggers <BuildChannel> .Inserting += entry =>
            {
                BuildAssetRegistryContext context = entry.Context as BuildAssetRegistryContext;
                BuildChannel entity = entry.Entity;
                Build        build  = context.Builds.Find(entity.BuildId);

                if (build == null)
                {
                    ILogger <Startup> logger = context.GetService <ILogger <Startup> >();
                    logger.LogError($"Could not find build with id {entity.BuildId} in BAR. Skipping pipeline triggering.");
                }
                else
                {
                    if (build.PublishUsingPipelines && ChannelHasAssociatedReleasePipeline(entity.ChannelId, context))
                    {
                        entry.Cancel = true;
                        var queue = context.GetService <BackgroundQueue>();
                        var releasePipelineRunner = context.GetService <IReleasePipelineRunner>();
                        queue.Post(() => releasePipelineRunner.StartAssociatedReleasePipelinesAsync(entity.BuildId, entity.ChannelId));
                    }
                }
            };

            Triggers <BuildChannel> .Inserted += entry =>
            {
                BuildAssetRegistryContext context = entry.Context as BuildAssetRegistryContext;
                ILogger <Startup>         logger  = context.GetService <ILogger <Startup> >();
                BuildChannel entity = entry.Entity;

                Build build = context.Builds
                              .Include(b => b.Assets)
                              .ThenInclude(a => a.Locations)
                              .FirstOrDefault(b => b.Id == entity.BuildId);

                if (build == null)
                {
                    logger.LogError($"Could not find build with id {entity.BuildId} in BAR. Skipping dependency update.");
                }
                else
                {
                    bool hasAssetsWithPublishedLocations = build.Assets
                                                           .Any(a => a.Locations.Any(al => al.Type != LocationType.None && !al.Location.EndsWith("/artifacts")));

                    if (hasAssetsWithPublishedLocations)
                    {
                        var queue             = context.GetService <BackgroundQueue>();
                        var dependencyUpdater = context.GetService <IDependencyUpdater>();

                        queue.Post(() => dependencyUpdater.StartUpdateDependenciesAsync(entity.BuildId, entity.ChannelId));
                    }
                    else
                    {
                        logger.LogInformation($"Skipping Dependency update for Build {entity.BuildId} because it contains no assets in valid locations");
                    }
                }
            };
        }
예제 #11
0
 public BuildsController(
     BuildAssetRegistryContext context,
     IBackgroundQueue queue,
     ISystemClock clock)
     : base(context, clock)
 {
     Queue = queue;
 }
예제 #12
0
 private static bool ChannelHasAssociatedReleasePipeline(int channelId, BuildAssetRegistryContext context)
 {
     return(context.Channels
            .Where(ch => ch.Id == channelId)
            .Include(ch => ch.ChannelReleasePipelines)
            .ThenInclude(crp => crp.ReleasePipeline)
            .FirstOrDefault(c => c.ChannelReleasePipelines.Count > 0) != null);
 }
예제 #13
0
 public ChannelsController(BuildAssetRegistryContext context,
                           IRemoteFactory factory,
                           ILogger <ChannelsController> logger)
 {
     _context       = context;
     _remoteFactory = factory;
     Logger         = logger;
 }
예제 #14
0
 public RepositoryController(
     BuildAssetRegistryContext context,
     IBackgroundQueue queue,
     IActorProxyFactory <IPullRequestActor> pullRequestActorFactory)
 {
     Context = context;
     Queue   = queue;
     PullRequestActorFactory = pullRequestActorFactory;
 }
 public RepositoryController(
     BuildAssetRegistryContext context,
     BackgroundQueue queue,
     Func <ActorId, IPullRequestActor> pullRequestActorFactory)
 {
     Context = context;
     Queue   = queue;
     PullRequestActorFactory = pullRequestActorFactory;
 }
예제 #16
0
 public AccountController(
     SignInManager <ApplicationUser> signInManager,
     UserManager <ApplicationUser> userManager,
     BuildAssetRegistryContext context)
 {
     SignInManager = signInManager;
     UserManager   = userManager;
     Context       = context;
 }
 public SubscriptionsController(
     BuildAssetRegistryContext context,
     IBackgroundQueue queue,
     IGitHubClientFactory gitHubClientFactory)
     : base(context, queue)
 {
     _context             = context;
     _gitHubClientFactory = gitHubClientFactory;
 }
예제 #18
0
 public SubscriptionsController(
     BuildAssetRegistryContext context,
     BackgroundQueue queue,
     Func <ActorId, ISubscriptionActor> subscriptionActorFactory)
 {
     _context = context;
     _queue   = queue;
     _subscriptionActorFactory = subscriptionActorFactory;
 }
예제 #19
0
 public TokensModel(
     BuildAssetRegistryContext context,
     UserManager <ApplicationUser> userManager,
     ILogger <TokensModel> logger)
 {
     Context     = context;
     UserManager = userManager;
     Logger      = logger;
 }
예제 #20
0
 public BuildsController(
     BuildAssetRegistryContext context,
     IBackgroundQueue queue,
     ISystemClock clock,
     IRemoteFactory factory)
     : base(context, clock)
 {
     Queue   = queue;
     Factory = factory;
 }
 public ReleasePipelineRunner(
     IReliableStateManager stateManager,
     ILogger <ReleasePipelineRunner> logger,
     BuildAssetRegistryContext context,
     IDependencyUpdater dependencyUpdater)
 {
     StateManager      = stateManager;
     Logger            = logger;
     Context           = context;
     DependencyUpdater = dependencyUpdater;
 }
예제 #22
0
 public DarcRemoteFactory(
     IConfigurationRoot configuration,
     IGitHubTokenProvider gitHubTokenProvider,
     IAzureDevOpsTokenProvider azureDevOpsTokenProvider,
     BuildAssetRegistryContext context)
 {
     Configuration            = configuration;
     GitHubTokenProvider      = gitHubTokenProvider;
     AzureDevOpsTokenProvider = azureDevOpsTokenProvider;
     Context = context;
 }
예제 #23
0
 public SubscriptionActor(
     BuildAssetRegistryContext context,
     ILogger <SubscriptionActor> logger,
     IActionRunner actionRunner,
     IActorProxyFactory <IPullRequestActor> pullRequestActorFactory)
 {
     Context                 = context;
     Logger                  = logger;
     ActionRunner            = actionRunner;
     PullRequestActorFactory = pullRequestActorFactory;
 }
예제 #24
0
 public SubscriptionsController(
     BuildAssetRegistryContext context,
     BackgroundQueue queue,
     IDependencyUpdater dependencyUpdater,
     IActorProxyFactory <ISubscriptionActor> subscriptionActorFactory)
     : base(context, queue, dependencyUpdater, subscriptionActorFactory)
 {
     _context           = context;
     _queue             = queue;
     _dependencyUpdater = dependencyUpdater;
 }
예제 #25
0
 public DependencyUpdater(
     IReliableStateManager stateManager,
     ILogger <DependencyUpdater> logger,
     BuildAssetRegistryContext context,
     Func <ActorId, ISubscriptionActor> subscriptionActorFactory)
 {
     StateManager             = stateManager;
     Logger                   = logger;
     Context                  = context;
     SubscriptionActorFactory = subscriptionActorFactory;
 }
예제 #26
0
 public DependencyUpdateErrorProcessor(
     IReliableStateManager stateManager,
     ILogger <DependencyUpdateErrorProcessor> logger,
     BuildAssetRegistryContext context,
     IOptions <DependencyUpdateErrorProcessorOptions> options
     )
 {
     _stateManager = stateManager;
     _context      = context;
     _options      = options.Value;
     _logger       = logger;
 }
 public BuildsController(BuildAssetRegistryContext context,
                         IRemoteFactory factory,
                         IServiceScopeFactory serviceScopeFactory,
                         BackgroundQueue queue,
                         ILogger <BuildsController> logger)
     : base(context)
 {
     RemoteFactory       = factory;
     ServiceScopeFactory = serviceScopeFactory;
     Queue  = queue;
     Logger = logger;
 }
 public DependencyUpdater(
     IReliableStateManager stateManager,
     ILogger <DependencyUpdater> logger,
     BuildAssetRegistryContext context,
     IRemoteFactory factory,
     IActorProxyFactory <ISubscriptionActor> subscriptionActorFactory)
 {
     StateManager             = stateManager;
     Logger                   = logger;
     Context                  = context;
     RemoteFactory            = factory;
     SubscriptionActorFactory = subscriptionActorFactory;
 }
예제 #29
0
 public DarcRemoteFactory(
     BuildAssetRegistryContext context,
     IKustoClientProvider kustoClientProvider,
     IGitHubTokenProvider gitHubTokenProvider,
     IAzureDevOpsTokenProvider azureDevOpsTokenProvider,
     DarcRemoteMemoryCache memoryCache)
 {
     Context                  = context;
     KustoClientProvider      = (KustoClientProvider)kustoClientProvider;
     GitHubTokenProvider      = gitHubTokenProvider;
     AzureDevOpsTokenProvider = azureDevOpsTokenProvider;
     Cache = memoryCache;
 }
예제 #30
0
 public DependencyUpdateErrorProcessor(
     IReliableStateManager stateManager,
     ILogger <DependencyUpdateErrorProcessor> logger,
     BuildAssetRegistryContext context,
     IOptions <DependencyUpdateErrorProcessorOptions> options,
     IGitHubApplicationClientFactory authenticateGithubApplicationClient
     )
 {
     _stateManager = stateManager;
     _context      = context;
     _options      = options.Value;
     _logger       = logger;
     _authenticateGitHubApplicationClient = authenticateGithubApplicationClient;
 }