The Data Bookkeeping Service 3 (DBS 3) provides an improved event data catalog for Monte Carlo and recorded data of the CMS experiment. It provides the necessary information used for tracking datasets, for example the data processing history, files and runs associated with a given dataset, and much more.
DBS 3 has been completely re-designed and re-implemented in Python on the basis of a CherryPy based environment for developing RESTful (Representational State Transfer) web services, which is commonly used within the data management and workload management (DMWM) group of CMS. DBS 3 is using the Java Script Object Notation (JSON) dataformat for interchanging information and Oracle as database backend.
DBS3-Client is the python client of DBS3. It enable to user to use DBS3 through Python.
Dbs3-client have 2 python dependencies. | Dependency's name | Pypi link | version |
---|---|---|---|
dbs3-pycurl | dbs3-pycurl · PyPI | 3.17.1 | |
pycurl | pycurl · PyPI | 7.43.0.6 |
You can use any Python version higher or equal than 3.8.2.
Note: If libcurl is already installed, you can skip this step. To use libcurl, is highly recommanded to use linux or MacOS. Dbs3-client use pycurl, which requires libcurl. We will see in this section how to get libcurl. Run the following command:
sudo yum install libcurl-devel
sudo apt-get install libcurl-devel
In this first part we are going to install Python 3 and pip. We are going to follow the following tutorial in the next sections.
We are going to install Python 3.8.2. Note : You can use any Python version higher than 3.8.2.
mkdir $HOME/python
cd $HOME/python
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
tar zxfv Python-3.8.2.tgz
find $HOME/python -type d | xargs chmod 0755
cd Python-3.8.2
./configure --prefix=$HOME/python
If you get an "No acceptable C compiler found in $PATH" error while running the last command, it mean that python could not find gcc. Please then run the following command:
sudo yum groupinstall "Development Tools"
sudo yum install openssl-devel
sudo yum -y install libffi-devel
sudo apt-get install build-essential
sudo apt-get install openssl-devel
sudo apt-get -y install libffi-devel
Solution found on stackoverflow.
You will then be able to redo the previous command (./configure --prefix=$HOME/python
).
To finish run the following:
make && make install
export PATH=$HOME/python/Python-3.8.2/:$PATH
export PYTHONPATH=$HOME/python/Python-3.8.2
Pypi (Python Package Index) is a repository of software for the Python programming language. In other word, Pypi is where most libraries are stored and updated. Anyone can download any library on Pypi and upload his own library. To get a library from Pypi we need pip. Two way to install pip and one way to update if you already have pip. You can find the official tutorial here. To know if you have pip already installed:
pip --version
If it is installed go to Changing pip version else go to Ensurepip or Get-pip.
Python comes with an ensurepip
module, which can install pip in a Python environment.
python -m ensurepip --upgrade
This is a Python script that uses some bootstrapping logic to install pip.
cd
to the folder containing the get-pip.py
file and run:python get-pip.py
If you already have an old version of pip3 or you need to change the version of your pip, You can run the next command (we are getting the 21.2.2 version in the next example):
export PATH=$HOME/python/bin:$PATH
pip3 install pip==21.2.2
To ensure that python and pip are installed we are going to run the which
command.
The following command:
which python
Should return:
~/python/Python-3.8.2/python
We are going to do the same thing for pip:
which pip
Which should return:
~/.local/bin/pip
We can also check their versions:
python --version
pip --version
Be sure to have a python version higher than 3.8.2 (version 3.8.2 is recommanded) and pip version higher than 21.2.2.
You can now export those path:
export PATH=$HOME/python/Python-3.8.2/:$HOME/.local/bin:$PATH
export PYTHONPATH=$HOME/python/Python-3.8.2/:$PYTHONPATH
export LD_LIBRARY_PATH="$(python -c 'import site; print(site.getsitepackages()[0])')":$LD_LIBRARY_PATH
PycURL is a Python interface to libcurl, the multiprotocol file transfer library. Similarly to the urllib Python module, PycURL can be used to fetch objects identified by a URL from a Python program.
Dbs3-client use pycurl and to avoid error, you will need to run:
export PYCURL_SSL_LIBRARY=nss
pip install --compile --install-option="--with-nss" --no-cache-dir pycurl==7.43.0.6
You now have python3 and pip installed. You are finally able to download libraries from pypi. On pypi you will be able to find dbs3-client.
As any library on pypi, you can download dbs3-client using the following command:
pip install dbs3-client
If you need a specific version of it, you can precise the version wanted like the following example (getting the 3.17.0 version of dbs3-client):
pip install dbs3-client==3.17.0
You have now succesfully installed DBSClient. Before we start using it, you need to export the DBS3-Client_Root to the site package:
export DBS3_CLIENT_ROOT="$(python -c 'import site; print(site.getsitepackages()[0])')"/DbsClient/
We will now set up the key and certificate. First we will convert our userkey.pem into rsa key:
openssl rsa -in $HOME/.globus/f_userkey.pem -out $HOME/.globus/rsauserkey.pem
You can also export your certificate and key to make your python script easier (if you export, you won't have to tell python where your certificate and key are):
export X509_USER_CERT=$HOME/.globus/usercert.pem
export X509_USER_KEY=$HOME/.globus/rsauserkey.pem
We can quickly check if library work using the python interpreter in the terminal. You can load python interpreter with:
python
Then you can try to import dbsClient and RestClient (which is dbs3-pycurl):
from dbs.apis.dbsClient import *
from RestClient.RestApi import RestApi
If there is no error message, you library works.
You can run the following python script to ensure you can read:
# DBS-3 imports
from dbs.apis.dbsClient import *
url="https://cmsweb-testbed.cern.ch/dbs/prod/global/DBSReader/"
# API Object
dbs3api = DbsApi(url=url)
# print(dbs3api.listDataTiers())
print(dbs3api.listDataTiers(data_tier_name='AOD'))
You can run the following python script to ensure you can write:
from dbsClient.apis.dbsClient import *
import os
url="https://cmsweb-testbed.cern.ch/dbs/int/global/DBSWriter/"
# API Object
dbs3api = DbsApi(url=url)
for j in range(101, 102):
acq_era={'acquisition_era_name': 'FirstName_LastName%s' %(j), 'description': 'testing_insert_era2',
'start_date':1234567890}
print(dbs3api.insertAcquisitionEra(acq_era))
print(dbs3api.listAcquisitionEras_ci(acquisition_era_name='FirstName_LastName%'))
# print("case seneitive")
# print(dbs3api.listAcquisitionEras(acquisition_era_name='FirstName_LastName%'))
print(dbs3api.listDataTiers(data_tier_name='AOD'))