99from os import environ , remove
1010import datajoint as dj
1111from distutils .version import LooseVersion
12+ import os
13+ from pathlib import Path
14+ from minio import Minio
15+ import urllib3
16+ import certifi
17+ import shutil
18+ from datajoint .utils import parse_sql
1219
13- __author__ = 'Edgar Walker, Fabian Sinz, Dimitri Yatsenko'
20+ __author__ = 'Edgar Walker, Fabian Sinz, Dimitri Yatsenko, Raphael Guzman '
1421
1522# turn on verbose logging
1623logging .basicConfig (level = logging .DEBUG )
6168 conn_root .query (
6269 "GRANT SELECT ON `djtest%%`.* TO 'djssl'@'%%';" )
6370else :
64- # grant permissions. For mysql5.6/5.7 this also automatically creates user
71+ # grant permissions. For mysql5.6/5.7 this also automatically creates user
6572 # if not exists
6673 conn_root .query ("""
6774 GRANT ALL PRIVILEGES ON `djtest%%`.* TO 'datajoint'@'%%'
7683 REQUIRE SSL;
7784 """ )
7885
86+ # Initialize httpClient with relevant timeout.
87+ httpClient = urllib3 .PoolManager (
88+ timeout = 30 ,
89+ cert_reqs = 'CERT_REQUIRED' ,
90+ ca_certs = certifi .where (),
91+ retries = urllib3 .Retry (
92+ total = 3 ,
93+ backoff_factor = 0.2 ,
94+ status_forcelist = [500 , 502 , 503 , 504 ]
95+ )
96+ )
97+
98+ # Initialize minioClient with an endpoint and access/secret keys.
99+ minioClient = Minio (S3_CONN_INFO ['endpoint' ],
100+ access_key = S3_CONN_INFO ['access_key' ],
101+ secret_key = S3_CONN_INFO ['secret_key' ],
102+ secure = False ,
103+ http_client = httpClient )
104+
79105
80106def setup_package ():
81107 """
@@ -84,6 +110,44 @@ def setup_package():
84110 """
85111 dj .config ['safemode' ] = False
86112
113+ # Add old MySQL
114+ source = os .path .dirname (os .path .realpath (__file__ )) + \
115+ "/external-legacy-data"
116+ db_name = "djtest_blob_migrate"
117+ db_file = "v0_11.sql"
118+ conn_root .query ("""
119+ CREATE DATABASE {};
120+ """ .format (db_name ))
121+
122+ statements = parse_sql ('{}/{}' .format (source , db_file ))
123+ for s in statements :
124+ conn_root .query (s )
125+
126+ # Add old S3
127+ source = os .path .dirname (os .path .realpath (__file__ )) + \
128+ "/external-legacy-data/s3"
129+ bucket = "migrate-test"
130+ region = "us-east-1"
131+ minioClient .make_bucket (bucket , location = region )
132+
133+ pathlist = Path (source ).glob ('**/*' )
134+ for path in pathlist :
135+ if os .path .isfile (str (path )) and ".sql" not in str (path ):
136+ minioClient .fput_object (
137+ bucket , os .path .relpath (
138+ str (path ),
139+ '{}/{}' .format (source , bucket )
140+ ), str (path ))
141+
142+ # Add S3
143+ minioClient .make_bucket ("datajoint-test" , location = region )
144+
145+ # Add old File Content
146+ shutil .copytree (
147+ os .path .dirname (os .path .realpath (__file__ )) +
148+ "/external-legacy-data/file/temp" ,
149+ os .path .expanduser ('~/temp' ))
150+
87151
88152def teardown_package ():
89153 """
@@ -99,3 +163,21 @@ def teardown_package():
99163 conn .query ('DROP DATABASE `{}`' .format (db [0 ]))
100164 conn .query ('SET FOREIGN_KEY_CHECKS=1' )
101165 remove ("dj_local_conf.json" )
166+
167+ # Remove old S3
168+ bucket = "migrate-test"
169+ objs = list (minioClient .list_objects_v2 (
170+ bucket , recursive = True ))
171+ objs = [minioClient .remove_object (bucket ,
172+ o .object_name .encode ('utf-8' )) for o in objs ]
173+ minioClient .remove_bucket (bucket )
174+
175+ # Remove S3
176+ bucket = "datajoint-test"
177+ objs = list (minioClient .list_objects_v2 (bucket , recursive = True ))
178+ objs = [minioClient .remove_object (bucket ,
179+ o .object_name .encode ('utf-8' )) for o in objs ]
180+ minioClient .remove_bucket (bucket )
181+
182+ # Remove old File Content
183+ shutil .rmtree (os .path .expanduser ('~/temp' ))
0 commit comments