Example #1
0
        public override async Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            InnerInitialization(controllerContext);
            DocumentDatabase db;

            try
            {
                db = await DatabasesLandlord.GetResourceInternal(DatabaseName).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                return(GetMessageWithObject(new
                {
                    Error = $"Could not open database named: {DatabaseName}, {e.Message}"
                }, HttpStatusCode.ServiceUnavailable));
            }
            if (db == null)
            {
                return(GetMessageWithObject(new
                {
                    Error = $"Could not open database named: {DatabaseName}, database does not exists"
                }, HttpStatusCode.ServiceUnavailable));
            }
            if (db.Configuration == null || db.Configuration.Core.ActiveBundles == null ||
                !db.Configuration.Core.ActiveBundles.Any(activeBundleName => activeBundleName.Equals(BundleName, StringComparison.InvariantCultureIgnoreCase)))
            {
                return(GetMessageWithObject(new
                {
                    Error = $"{BundleName} bundle not activated in database named: {DatabaseName}"
                }, HttpStatusCode.BadRequest));
            }

            return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
        }
        public override async Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            if (ForceClusterAwareness == false)
            {
                var  clusterAwareHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterAwareHeader);
                bool clusterAware;
                if (clusterAwareHeader == null || bool.TryParse(clusterAwareHeader, out clusterAware) == false || clusterAware == false)
                {
                    return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
                }
            }

            InnerInitialization(controllerContext);
            HttpResponseMessage message;

            if (IsClientV4OrHigher(out message))
            {
                return(message);
            }

            if (Database == null || ClusterManager.IsActive() == false)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (DatabaseName != null && await DatabasesLandlord.GetResourceInternal(DatabaseName).ConfigureAwait(false) == null)
            {
                var msg = "Could not find a database named: " + DatabaseName;
                return(GetMessageWithObject(new { Error = msg }, HttpStatusCode.ServiceUnavailable));
            }

            if (Database.IsClusterDatabase() == false)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (ClusterManager.IsLeader())
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            if (IsReadRequest(controllerContext))
            {
                var clusterReadBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterReadBehaviorHeader);
                if (string.Equals(clusterReadBehaviorHeader, "All", StringComparison.OrdinalIgnoreCase))
                {
                    return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
                }
            }

            var  clusterFailoverBehaviorHeader = GetClusterHeader(controllerContext, Constants.Cluster.ClusterFailoverBehaviorHeader);
            bool clusterFailoverBehavior;

            if (bool.TryParse(clusterFailoverBehaviorHeader, out clusterFailoverBehavior) && clusterFailoverBehavior)
            {
                return(await base.ExecuteAsync(controllerContext, cancellationToken).ConfigureAwait(false));
            }

            return(RedirectToLeader(controllerContext.Request));
        }
        protected override TData GetData()
        {
            if (Landlord.IsDatabaseLoaded(DatabaseName))
            {
                return(GetData(Landlord.GetResourceInternal(DatabaseName).Result));
            }

            return(default(TData));
        }
Example #4
0
        private void Attach(bool force)
        {
            if (force == false && attached)
            {
                return;
            }

            Task.Factory.StartNew(() =>
            {
                lock (locker)
                {
                    if (force == false && attached)
                    {
                        return;
                    }

                    var database = databaseLandlord
                                   .GetResourceInternal(databaseName)
                                   .Result;

                    database.Notifications.OnIndexChange += (db, notification) =>
                    {
                        if (notification.Type != IndexChangeTypes.IndexAdded)
                        {
                            return;
                        }

                        loadedIndexes.GetOrAdd(notification.Name, AddIndex);
                    };

                    database.ConfigurationRetriever.SubscribeToConfigurationDocumentChanges(Constants.RavenReplicationDestinations, AddReplicationDestinationsFromDatabase);

                    AddIndexesFromDatabase(database);
                    AddReplicationDestinationsFromDatabase();

                    attached = true;
                }
            });
        }
Example #5
0
        private List <DatabaseData> GetDatabasesData(IEnumerable <RavenJToken> databases)
        {
            return(databases
                   .Select(database =>
            {
                var bundles = new string[] {};
                var settings = database.Value <RavenJObject>("Settings");
                if (settings != null)
                {
                    var activeBundles = settings.Value <string>("Raven/ActiveBundles");
                    if (activeBundles != null)
                    {
                        bundles = activeBundles.Split(';');
                    }
                }

                var dbName = database.Value <RavenJObject>("@metadata").Value <string>("@id").Replace("Raven/Databases/", string.Empty);
                var isDatabaseLoaded = DatabasesLandlord.IsDatabaseLoaded(dbName);
                DocumentDatabase.ReducedDatabaseStatistics stats = null;
                if (isDatabaseLoaded)
                {
                    try
                    {
                        var db = DatabasesLandlord.GetResourceInternal(dbName).Result;
                        if (db != null)
                        {
                            stats = db.ReducedStatistics;
                        }
                    }
                    catch (Exception)
                    {
                        //the database is shutting down or locked
                        //we can ignore this
                    }
                }

                return new DatabaseData
                {
                    Name = dbName,
                    Disabled = database.Value <bool>("Disabled"),
                    IndexingDisabled = GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.IndexingDisabled),
                    RejectClientsEnabled = GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.RejectClientsModeEnabled),
                    ClusterWide = ClusterManager.IsActive() && !GetBooleanSettingStatus(database.Value <RavenJObject>("Settings"), Constants.Cluster.NonClusterDatabaseMarker),
                    Bundles = bundles,
                    IsAdminCurrentTenant = DatabasesLandlord.SystemConfiguration.AnonymousUserAccessMode == AnonymousUserAccessMode.Admin,
                    IsLoaded = isDatabaseLoaded,
                    Stats = stats
                };
            }).ToList());
        }
Example #6
0
        public async Task <HttpResponseMessage> Console(string id)
        {
            var database = await DatabasesLandlord.GetResourceInternal(id).ConfigureAwait(false);

            var script = await ReadJsonObjectAsync <AdminJsScript>().ConfigureAwait(false);

            var console = new AdminJsConsole(database);

            var result = console.ApplyScript(script);

            if (result.Type == JTokenType.Null)
            {
                result = new RavenJValue("OK");
            }
            return(GetMessageWithObject(result));
        }