Esempio n. 1
0
        public override bool OnStart()
        {
            // Not sure what this should be. Hopefully storage over smb doesn't open a million connections
            ServicePointManager.DefaultConnectionLimit = 12;

            #region Load Config Settings
            nodeName = RoleEnvironment.CurrentRoleInstance.Id;
            string UseElasticLocalDataFolder    = CloudConfigurationManager.GetSetting("UseElasticLocalDataFolder");
            string javaInstaller                = CloudConfigurationManager.GetSetting("JavaInstallerName");
            string javaDownloadURL              = CloudConfigurationManager.GetSetting("JavaDownloadURL");
            string elasticsearchZip             = CloudConfigurationManager.GetSetting("ElasticsearchZip");
            string elasticsearchDownloadURL     = CloudConfigurationManager.GetSetting("ElasticsearchDownloadURL");
            string elasticsearchPluginContainer = CloudConfigurationManager.GetSetting("ElasticsearchPluginContainer");
            string shareName        = CloudConfigurationManager.GetSetting("ShareName");  //root path for es data
            string shareDrive       = CloudConfigurationManager.GetSetting("ShareDrive"); //Drive letter to map azure share
            string endpointName     = CloudConfigurationManager.GetSetting("EndpointName");
            string archiveRoot      = RoleEnvironment.GetLocalResource("ArchiveRoot").RootPath;
            string logRoot          = RoleEnvironment.GetLocalResource("LogRoot").RootPath;
            string elasticDataRoot  = RoleEnvironment.GetLocalResource("ElasticDataRoot").RootPath;
            string elasticRoot      = RoleEnvironment.GetLocalResource("ElasticRoot").RootPath;
            string emulatorDataRoot = RoleEnvironment.GetLocalResource("EmulatorDataRoot").RootPath; // we need this cause we can't emulate shares
            string roleRoot         = Environment.GetEnvironmentVariable("ROLEROOT");
            string tempPath         = RoleEnvironment.GetLocalResource("CustomTempRoot").RootPath;   //Standard temp folder is too small

            /**
             * Issue #1.  In azure the role root is just a drive letter. Unfortunately, System.IO doesn't add needed slash
             *  so Path.Combine("E:","path\to\file") yields E:path\to\file
             *  Still hoping there is a .net api that I an use to avoid the code below.
             */
            if (!roleRoot.EndsWith(@"\"))
            {
                roleRoot += @"\";
            }

            #endregion

            #region Configure Java  manager
            //Are we downloading java from storage or regular url?
            string      javaDownloadType = CloudConfigurationManager.GetSetting("JavaDownloadType");
            WebArtifact javaArtifact;

            if (!string.IsNullOrWhiteSpace(javaDownloadType) && javaDownloadType == "storage")
            {
                javaArtifact = new StorageArtifact(javaDownloadURL, javaInstaller, storage);
            }
            else
            {
                javaArtifact = new WebArtifact(javaDownloadURL, javaInstaller);
            }

            javaManager = new JavaManager(javaArtifact, archiveRoot, logRoot); //Java installer

            #endregion

            #region Configure Elasticsearch manager
            //Are we downloading elasticsearch from storage or regular url?
            string      elasticsearchDownloadType = CloudConfigurationManager.GetSetting("ElasticsearchDownloadType");
            WebArtifact elasticsearchArtifact;

            if (!string.IsNullOrWhiteSpace(elasticsearchDownloadType) && elasticsearchDownloadType == "storage")
            {
                elasticsearchArtifact = new StorageArtifact(elasticsearchDownloadURL, elasticsearchZip, storage);
            }
            else
            {
                elasticsearchArtifact = new WebArtifact(elasticsearchDownloadURL, elasticsearchZip);
            }

            bridge = new PipesRuntimeBridge(endpointName); //Discovery helper

            if (UseElasticLocalDataFolder.ToLower() != "true")
            {
                //Azure file is not available in emulator
                if (!RoleEnvironment.IsEmulated)
                {
                    // Mount a drive for a CloudFileShare.
                    Trace.WriteLine("Configuring file Share");
                    var share = storage.CreateCloudFileClient()
                                .GetShareReference(shareName);
                    share.CreateIfNotExists();

                    Trace.WriteLine("Mapping Share to " + shareDrive);
                    share.Mount(shareDrive);
                }
                else
                {
                    shareDrive = emulatorDataRoot;
                }
            }
            else
            {
                shareDrive = elasticDataRoot;
            }

            var runtimeConfig = new ElasticsearchRuntimeConfig
            {
                DataPath              = shareDrive,
                LogPath               = logRoot,
                TempPath              = tempPath,
                NodeName              = nodeName,
                BridgePipeName        = bridge.PipeName,
                PackagePluginPath     = Path.Combine(roleRoot, "approot", "plugins"),
                TemplateConfigFile    = Path.Combine(roleRoot, "approot", "config", ElasticsearchManager.ELASTICSEARCH_CONFIG_FILE),
                TemplateLogConfigFile = Path.Combine(roleRoot, "approot", "config", ElasticsearchManager.ELASTICSEARCH_LOG_CONFIG_FILE)
            };

            elasticsearchManager = new ElasticsearchManager(runtimeConfig, elasticsearchArtifact, archiveRoot, elasticRoot, logRoot);

            if (!string.IsNullOrWhiteSpace(elasticsearchPluginContainer))
            {
                elasticsearchManager.AddPluginSource(elasticsearchPluginContainer, storage);
            }
            #endregion



            bool result = base.OnStart();

            Trace.TraceInformation("ElasticsearchRole has been started");

            return(result);
        }