.. _check_your_installation: ====================================== Check your installation ====================================== If you are here, we suppose you have read the documentation that came before. Specifically: * you should know about our :ref:`development_model` * you should have read about :ref:`development_environment`, at least until the :ref:`editing_code` part. Within this part we'll check the basics, and we'll do few exercises. Is my installation correctly done? -------------------------------------- We will now do few, very simple checks. The first can be done by using the python interactive shell. For these examples I will actually use `iPython `_, which is a highly recommended shell. Make sure that you are running these commands inside the python virtual environment that you have created with *virtualenv* as explained in :ref:`editing_code`. .. code-block:: python In [1]: import pyparsing In [2]: import MySQLdb In [3]: import DIRAC Were these imports OK? If not, then you should probably hit the "previous" button of this guide, or check the *pip install* log. The real basic stuff -------------------- Let's start with the **logger** .. code-block:: python In [3]: from DIRAC import gLogger In [4]: gLogger.notice('Hello world') Hello world Out[4]: True What's that? It is a `singleton `_ object for logging in DIRAC. Needless to say, you'll use it a lot. .. code-block:: python In [5]: gLogger.info('Hello world') Out[5]: False Why "Hello world" was not printed? Because the logging level is too high: .. code-block:: python In [6]: gLogger.getLevel() Out[6]: 'NOTICE' But we can increase it simply doing, for example: .. code-block:: python In [7]: gLogger.setLevel('VERBOSE') Out[7]: True In [8]: gLogger.info('Hello world') Hello world Out[8]: True In DIRAC, you should not use print. Use the gLogger instead. You will find more details on gLogger in the :ref:`gLogger_gLogger` documentation. Let's continue, and we have a look at the **return codes**: .. code-block:: python In [11]: from DIRAC import S_OK, S_ERROR These 2 are the basic return codes that you should use. How do they work? .. code-block:: python In [12]: S_OK('All is good') Out[12]: {'OK': True, 'Value': 'All is good'} In [13]: S_ERROR('Damn it') Out[13]: {'Errno': 0, 'Message': 'Damn it', 'OK': False, 'CallStack': [' File "", line 1, in \n']} In [14]: S_ERROR( errno.EPERM, 'But I want to!') Out[14]: {'Errno': 1, 'Message': 'Operation not permitted ( 1 : But I want to!)', 'OK': False, 'CallStack': [' File "", line 1, in \n']} Quite clear, isn't it? Often, you'll end up doing a lot of code like that: .. code-block:: python result = aDIRACMethod() if not result['OK']: gLogger.error('aDIRACMethod-Fail', "Call to aDIRACMethod() failed with message %s" %result['Message']) return result else: returnedValue = result['Value'] Playing with the Configuration Service -------------------------------------- Note: please, read and complete :ref:`stuff_that_run` before continuing. If you are here, it means that your developer installation contains a **dirac.cfg** file, that should stay in the $DIRACDEVS/etc directory. We'll play a bit with it now. You have already done this: .. code-block:: python In [14]: from DIRAC import gConfig In [15]: gConfig.getValue('/DIRAC/Setup') Out[15]: 'DeveloperSetup' Where does 'DeveloperSetup' come from? Open that dirac.cfg and search for it. Got it? it's in:: DIRAC { ... Setup = DeveloperSetup ... } Easy, huh? Try to get something else now, still using gConfig.getValue(). So, gConfig is another singleton: it is the guy you need to call for basic interactions with the `Configuration Service `_. If you are here, we assume you already know about the CS servers and layers. More information can be found in the Administration guide. We remind that, for a developer installation, we will work in ISOLATION, so with only the local dirac.cfg Mostly, gConfig exposes *get* type of methods: .. code-block:: python In [2]: gConfig.get gConfig.getOption gConfig.getOptionsDict gConfig.getServersList gConfig.getOptions gConfig.getSections gConfig.getValue for example, try: .. code-block:: python In [2]: gConfig.getOptionsDict('/DIRAC') In the next section we will modify a bit the dirac.cfg file. Before doing that, have a look at it. It's important what's in there, but for the developer installation it is also important what it is NOT there. We said we will work in isolation. So, it's important that this file does not contain any URL to server infrastructure (at least, not at this level: later, when you will feel more confortable, you can add some). A very important option of the cfg file is "DIRAC/Configuration/Server": this option can contain the URL(s) of the running Configuration Server. But, as said, for doing development, this option should stay empty. Getting a Proxy --------------------- We assume that you have already your public and private certificates key in $HOME/.globus. Then, do the following:: dirac-proxy-init if you got something like:: > dirac-proxy-init Traceback (most recent call last): File "/home/dirac/diracInstallation/scripts/dirac-proxy-init", line 22, in for entry in os.listdir( baseLibPath ): OSError: [Errno 2] No such file or directory: '/home/dirac/diracInstallation/Linux_x86_64_glibc-2.12/lib' just create the directory by hand. Now, if try again you will probably get something like:: > dirac-proxy-init Generating proxy... Enter Certificate password: DN /DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=fstagni/CN=693025/CN=Federico Stagni is not registered This is because DIRAC still doesn't know you exist. You should add yourself to the CS. For example, I had add the following section:: Registry { Users { fstagni { DN = /DC=ch/DC=cern/OU=Organic Units/OU=Users/CN=fstagni/CN=693025/CN=Federico Stagni CA = /DC=ch/DC=cern/CN=CERN Trusted Certification Authority Email = federico.stagni@cern.ch } } All the info you want and much more in:: openssl x509 -in usercert.pem -text Now, it's time to issue again:: toffo@pclhcb181:~/.globus$ dirac-proxy-init Generating proxy... Enter Certificate password: User fstagni has no groups defined So, let's add the groups within the /Registry section:: Groups { devGroup { Users = fstagni } } You can keep playing with it (e.g. adding some properties), but for the moment this is enough.