Exemplo n.º 1
0
        /// <summary>
        /// バケットを削除する。
        /// 接続情報は<see cref="Initialize(StorageConfigModel)"/>で指定したものではなく、引数で指定したものを使う。
        /// </summary>
        /// <remarks>
        /// バケット内に空のサブフォルダがある場合、削除できずに例外が発生する。
        /// </remarks>
        public async Task <bool> DeleteBucketAsync(StorageConfigModel storageConfig)
        {
            var  deleteClient     = GenerateConfig(storageConfig);
            bool isContainsBucket = await ContainsBucketAsync(deleteClient, storageConfig.Bucket);

            if (!isContainsBucket)
            {
                // 指定するバケットは既に存在しない
                LogDebug($"bucket already deleted : {storageConfig.Bucket}");
                return(false);
            }
            // 全てのファイルとバケットの削除
            LogDebug($"deleting bucket : {storageConfig.Bucket}");
            try
            {
                // バケットの削除は全てのオブジェクトを削除して実施
                await DeleteObjectsAsync(deleteClient, storageConfig.Bucket, "");

                await deleteClient.DeleteBucketAsync(storageConfig.Bucket);
            }
            catch (AmazonS3Exception e)
            {
                LogWarning($"AmazonS3Client#DeleteBucketAsync() throws exception: {e.Message}");
                throw;
            }
            LogDebug($"deleted bucket : {storageConfig.Bucket}");
            return(true);
        }
Exemplo n.º 2
0
 /// <summary>
 /// オブジェクトストレージに接続するための設定情報を初期化する。
 /// </summary>
 public void Initialize(StorageConfigModel storageConfig)
 {
     bucket    = storageConfig.Bucket;
     secretKey = storageConfig.SecretKey;
     accessKey = storageConfig.AccessKey;
     client    = GenerateConfig(storageConfig);
 }
 public TestJobController(IConfiguration configuration, ILogger <TestConfigController> logger, IJob1 job1, StorageConfigModel storageConfigModel)
 {
     _storageConfigModel = storageConfigModel;
     Configuration       = configuration;
     _logger             = logger;
     _job1 = job1;
 }
        public void SourceStorageServiceCreationTest(StorageType storageType, StorageConfigModel configModel, Type storageServiceType)
        {
            IStorageFactory storageFactory = new SourceStorageFactory();
            IStorageService storageService = storageFactory.CreateStorageService(storageType, configModel);

            Assert.Equal(storageServiceType, storageService.GetType());
        }
 public ConfigModel()
 {
     Storage       = new StorageConfigModel();
     Parser        = new ParserConfigModel();
     Chunker       = new ChunkerConfigModel();
     CustomText    = new CustomTextConfigModel();
     TextAnalytics = new TextAnalyticsConfigModel();
 }
Exemplo n.º 6
0
        /// <summary>
        /// prefix で指定するフォルダ階層を含む配下のオブジェクトを全て削除する。トップなら "" を prefix として指定する。
        /// 接続情報は<see cref="Initialize(StorageConfigModel)"/>で指定したものではなく、引数で指定したものを使う。
        /// </summary>
        public async Task DeleteObjectsAsync(StorageConfigModel config, string prefix)
        {
            var deleteClient = GenerateConfig(config);

            // prefix で指定するフォルダ階層以下のオブジェクトを全て削除する。
            await DeleteObjectsAsync(deleteClient, config.Bucket, prefix);

            // prefix で指定するフォルダオブジェクトを削除する。
            await deleteClient.DeleteObjectAsync(config.Bucket, prefix);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Configから接続クライアントインスタンスを生成する
        /// </summary>
        private AmazonS3Client GenerateConfig(StorageConfigModel storageConfig)
        {
            var amazonS3Config = new AmazonS3Config()
            {
                //アプリからの接続はすべてHTTPで繋いでいる
                ServiceURL       = $"http://{storageConfig.StorageServer}/",
                UseHttp          = true,
                ForcePathStyle   = true,
                SignatureVersion = "4"
            };

            return(new AmazonS3Client(storageConfig.AccessKey, storageConfig.SecretKey, amazonS3Config));
        }
Exemplo n.º 8
0
        public IStorageService CreateStorageService(StorageType storageType, StorageConfigModel storageConfigModel)
        {
            switch (storageType)
            {
            case StorageType.Blob:
                return(new BlobStorageService(storageConfigModel.Blob.ConnectionString, storageConfigModel.Blob.DestinationContainer));

            case StorageType.Local:
                return(new LocalStorageService(storageConfigModel.Local.DestinationDirectory));

            default:
                throw new NotSupportedException();
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public StorageLogic(
            ICommonDiLogic commonDiLogic,
            IObjectStorageService objectStorageService) : base(commonDiLogic)
        {
            this.objectStorageService = objectStorageService;

            //DBのテナント情報からオブジェクトストレージの設定を初期化する。
            Tenant tenant = CurrentUserInfo?.SelectedTenant;

            if (tenant != null && tenant.Storage != null)
            {
                config = ConvertToStorageConfig(tenant, tenant.Storage);
                this.objectStorageService.Initialize(config);
            }
        }
Exemplo n.º 10
0
        /// <summary>
        /// 初期生成テナントと ObjectStore を同期させる。
        /// </summary>
        public void SyncInitialObjectStore()
        {
            StorageConfigModel storageConfigModel = new StorageConfigModel()
            {
                AccessKey     = deployOptions.ObjectStorageAccessKey,
                SecretKey     = deployOptions.ObjectStorageSecretKey,
                StorageServer = deployOptions.ObjectStorageNode + ":" + deployOptions.ObjectStoragePort,
                Bucket        = ApplicationConst.DefaultFirstTenantName
            };
            bool isCreated = objectStorageService.CreateBucketAsync(storageConfigModel).Result;

            if (isCreated)
            {
                LogDebug($"ObjectStore のバケット {ApplicationConst.DefaultFirstTenantName} は既に作成済みです。");
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// 新規にバケットを作成する。
        /// 接続情報は<see cref="Initialize(StorageConfigModel)"/>で指定したものではなく、引数で指定したものを使う。
        /// </summary>
        /// <returns>バケットが存在せず新規作成なら true、既にバケットが存在していたなら false を返却</returns>
        /// <exception cref="AmazonS3Exception">バケット生成の失敗</exception>
        public async Task <bool> CreateBucketAsync(StorageConfigModel storageConfig)
        {
            var createClient = GenerateConfig(storageConfig);

            bool isContainsBucket = await ContainsBucketAsync(createClient, storageConfig.Bucket);

            if (isContainsBucket)
            {
                // バケットの存在は確認できたので、直下にディレクトリが存在するか
                await CreateDirUnderBucketAsync(createClient, storageConfig.Bucket);

                // 既にバケットが存在しているので false を返却する
                LogError($"bucket already exists : {storageConfig.Bucket}");
                return(false);
            }

            //バケットを作成
            try
            {
                await createClient.PutBucketAsync(storageConfig.Bucket);

                LogDebug($"created new bucket : {storageConfig.Bucket}");
            }
            catch (AmazonS3Exception e)
            {
                // 例外を投げる or 値を返す : 現状は例外を投げるので呼び出し側で catch すること
                LogError($"AmazonS3Client#PutBucketAsync() throws exception: {e.Message}");
                throw;
            }

            // ディレクトリとdummyファイルの作成
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.Data.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.TrainingContainerOutputFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.TrainingContainerAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.TrainingHistoryAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.PreprocContainerAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.InferenceHistoryAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.InferenceContainerAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.InferenceContainerOutputFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.NotebookContainerAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.NotebookContainerOutputFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.ExperimentContainerAttachedFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.ExperimentContainerOutputFiles.ToString());
            await CreateDirAsync(storageConfig.Bucket, createClient, ResourceType.ExperimentPreprocContainerAttachedFiles.ToString());

            return(true);
        }
Exemplo n.º 12
0
        /// <summary>
        /// 指定した接続情報でCORS設定を変更する。
        /// </summary>
        public async Task <bool> SetCorsConfigurationAsync(StorageConfigModel storageConfig, string corsConfigStr)
        {
            //CORS設定の更新

            PutCORSConfigurationRequest request = new PutCORSConfigurationRequest()
            {
                BucketName = storageConfig.Bucket
            };

            using (var reader = new StringReader(corsConfigStr))
            {
                var deserializer = new XmlSerializer(typeof(CORSConfiguration));
                var corsConfig   = deserializer.Deserialize(reader) as CORSConfiguration;
                request.Configuration = corsConfig;
            }

            AmazonWebServiceResponse response;

            try
            {
                var s3Client = GenerateConfig(storageConfig);
                response = await s3Client.PutCORSConfigurationAsync(request);
            }
            catch (AmazonS3Exception e)
            {
                //XMLに不備があると、例外になってしまう。
                //接続エラー(System.Net.Http.HttpRequestException)との区別はつくので、他のAmazonS3Exceptionエラーとは区別できなくなるが、まとめてcatch
                LogWarning($"CORS設定に失敗しました。Message = {e.Message}");
                return(false);
            }

            if (response.HttpStatusCode == HttpStatusCode.OK)
            {
                return(true);
            }
            else
            {
                LogWarning($"CORS設定に失敗しました。HttpStatusCode = {response.HttpStatusCode}. {response.ResponseMetadata.Metadata}");
                return(false);
            }
        }
Exemplo n.º 13
0
        /// <summary>
        /// 指定した接続情報でCORS設定を削除する。
        /// </summary>
        public async Task <bool> DeleteCorsConfigurationAsync(StorageConfigModel storageConfig)
        {
            //CORS設定の削除

            DeleteCORSConfigurationRequest request = new DeleteCORSConfigurationRequest()
            {
                BucketName = storageConfig.Bucket
            };
            var s3Client = GenerateConfig(storageConfig);
            AmazonWebServiceResponse response = await s3Client.DeleteCORSConfigurationAsync(request);

            //削除の際はNoContentが返ってくるのが正常
            if (response.HttpStatusCode == HttpStatusCode.NoContent)
            {
                return(true);
            }
            else
            {
                LogWarning($"CORS設定の削除に失敗しました。HttpStatusCode = {response.HttpStatusCode}. {response.ResponseMetadata.Metadata}");
                return(false);
            }
        }
Exemplo n.º 14
0
        /// <summary>
        /// 指定した接続情報でCORS設定を取得する。
        /// </summary>
        public async Task <string> GetCorsConfigurationAsync(StorageConfigModel storageConfig)
        {
            GetCORSConfigurationRequest request = new GetCORSConfigurationRequest()
            {
                BucketName = storageConfig.Bucket
            };

            var s3Client = GenerateConfig(storageConfig);
            GetCORSConfigurationResponse response;

            try
            {
                response = await s3Client.GetCORSConfigurationAsync(request);
            }
            catch (HttpRequestException e)
            {
                LogError(e.Message, e);
                return("Unable to connect storage server. Please contact system administrators. NOTE: If you edit the tenant information, you may loose settings for the storage service." + Environment.NewLine + e.Message);
            }
            string result;

            if (response.Configuration == null)
            {
                result = "";
            }
            else
            {
                //結果を文字列に変換
                var serializer = new XmlSerializer(typeof(CORSConfiguration));
                using (var writer = new StringWriter())
                {
                    serializer.Serialize(writer, response.Configuration);
                    result = writer.ToString();
                }
            }

            return(result);
        }
Exemplo n.º 15
0
 public TestConfigController(IConfiguration configuration, ILogger <TestConfigController> logger, StorageConfigModel storageConfigModel)
 {
     Configuration       = configuration;
     _logger             = logger;
     _storageConfigModel = storageConfigModel;
 }
Exemplo n.º 16
0
        /// <summary>
        /// 指定したテナントに対応するバケットを削除する。
        /// </summary>
        /// <remarks>削除用の StorageConfigModel を生成するために、Tenant と Storage オブジェクトを引数に取る</remarks>
        /// <returns>バケットが存在して削除したなら true、既にバケットが存在していなかったなら false を返却</returns>
        /// <exception>バケット削除失敗</exception>
        public async Task <bool> DeleteBucketAsync(Tenant tenant, Storage storage)
        {
            StorageConfigModel configForDelete = ConvertToStorageConfig(tenant, storage);

            return(await objectStorageService.DeleteBucketAsync(configForDelete));
        }
 public PostfileController(StorageConfigModel storageConfigModel, ILogger <PostfileController> logger)
 {
     this._storageConfigModel = storageConfigModel;
     _logger = logger;
 }
Exemplo n.º 18
0
 /// <summary>
 /// 指定したテナントに対応するバケットを新規作成する。
 /// </summary>
 /// <remarks>新規作成時は<see cref="Tenant.Storage"/>が未セットの場合があるため、それぞれ引数で与えている</remarks>
 /// <returns>バケットが存在せず新規作成なら true、既にバケットが存在していたなら false を返却</returns>
 /// <exception>バケット生成の失敗</exception>
 public async Task <bool> CreateBucketAsync(Tenant tenant, Storage storage)
 {
     config = ConvertToStorageConfig(tenant, storage);
     return(await objectStorageService.CreateBucketAsync(config));
 }