Quickops 2: Configure Python SDK for OCI 
Tags: python, oraclecloud, beginners, sdk
Published: 2021-12-10 20:24:45

Before you can start using python SDK for OCI you need to comply with the following requirements, and also certain information you need to have at hand:
* Signing public and private key pair.
    * OCI request the key to be on PEM format. you can use the following commands
```
openssl genrsa -out oci-api-key -aes128 2048
chmod go-rwx oci-api-key
openssl rsa -pubout -in oci-api-key -out oci-api-key.pub
```
**Note** It is required that the private key has permissions only to the file owner, otherwise you will receive an error when trying to use it on OCI.
* Upload the public key to your user on OCI
![Access to user OCI](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ls5x0xa5eo8ks5p94pk5.png)
    * Move to Identity > Users > User Details > API Keys 
 
![Resource API Keys](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12sfrk7xgs1jzg0ys4tq.png)

Clic over Add API key - Here you will paste the content from the **oci-api-key.pub** file you just generated, and click over **Add**

Take note of the fingerprint that will appear on your console. OCI use fingerprint during authentication phase to review your keys.
Fingerprints looks something like this:
> 56:73:ff:44:8f:b3:c3:1d:58:12:a8:1f:ff:ff:aa:66

* Take note of your user OCI
* Take note of the tenancy OCID
You can look it on the console **(Menu > Administration > Tenancy Details)** Remember that: tenant OCID is Root Compartment OCI

You can get more information about Compartments in OCID [HERE](https://dev.to/aernesto24/7-things-to-know-about-compartments-on-oracle-cloud-infrastructure-4l1p)


* Get your **Region Identifier** 
This should be the region selected when the account was created, or in case you subscribed to a different region, it should be that region. Example:
> region=us-phoenix-1

Now we can proceed to the SDK configuration

*************************************************
## **Python SDK**
In simple words, an SDK is a library that allows a programming language to interact with Oracle cloud infrastructure resources.

For this case we are using [Python SDK](https://github.com/oracle/oci-python-sdk)

##### **1.- So, to install the SDK, first we need to make sure we have python installed.**

**Note** Python SDK works with both version 2 or 3 but use the latest.
 
```
☁  .oci  python --version
Python 3.9.7
☁  .oci
```

On your case you may find that the versions is pointing to python 2. To set python 3 as default on MAC yo can consult one of these:
* [The right and wrong way to set Python 3 as default on a Mac](https://opensource.com/article/19/5/python-3-default-mac)
* [How to set Python3 as a default python version on MacOS?](https://dev.to/malwarebo/how-to-set-python3-as-a-default-python-version-on-mac-4jjf)


##### **2.- Update pip as Python SDK for OCI is a [PyPi module](https://pypi.org/project/oci/)**

Under the documentation:
> This is the Python SDK for Oracle Cloud Infrastructure. Python 3.6, 3.7, 3.8 and 3.9 are supported.

And also as a note:
>It is highly recommended that a Python virtual environment be used when installing oci.

Let follows the recommendations:
```
☁  oci-sdk-python  ls
☁  oci-sdk-python  python -m venv ocisdk
☁  oci-sdk-python  ls
ocisdk
☁  oci-sdk-python  source ocisdk/bin/activate


(ocisdk) ☁  oci-sdk-python  python -m pip install --upgrade pip
Requirement already satisfied: pip in ./ocisdk/lib/python3.9/site-packages (21.2.4)
Collecting pip
  Downloading pip-21.3.1-py3-none-any.whl (1.7 MB)
     |████████████████████████████████| 1.7 MB 1.6 MB/s
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.2.4
    Uninstalling pip-21.2.4:
      Successfully uninstalled pip-21.2.4
Successfully installed pip-21.3.1
(ocisdk) ☁  oci-sdk-python
```

We can proceed to install OCI SDK

```
(ocisdk) ☁  oci-sdk-python  pip install oci
...
Installing collected packages: pycparser, cffi, six, cryptography, pytz, python-dateutil, pyOpenSSL, circuitbreaker, certifi, oci
    Running setup.py install for circuitbreaker ... done
Successfully installed certifi-2021.10.8 cffi-1.15.0 circuitbreaker-1.3.2 cryptography-3.4.7 oci-2.52.1 pyOpenSSL-19.1.0 pycparser-2.21 python-dateutil-2.8.2 pytz-2021.3 six-1.16.0
```


##### **3.- Create OCI Config file**

If you remember, at the beginning i wrote some information you need to have at hand, well now is the moment to use that information.

There are **2 ways** to setup your config file,

**FIRST**, by installing OCI CLI and running the setup dialog 

```
brew update && brew install oci-cli
oci --version

oci setup config
```

**Note** More on the [official documentation](https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm)

**SECOND**, by manually creating the file under `~/.oci`

```
cd
cd .oci
vi config
```

and inside the config file add the following:
```
[DEFAULT]
user = <user-ocid>
fingerprint = <fingerprint from your user API key >
tenancy = <tenancy-id or rootCompartment-id>
region = us-phoenix-1
key_file = <the full path to your private key file in pem format>
```

**Note** the file should have the following permissions
`-rw-------`

You can store several profiles on the same file.


##### **4.- Finally!!! Using the SDK**
If you deactivate your venv execute the source command again,
Under the venv run
```
(ocisdk) ☁  oci-sdk-python  python
```
And inside the Python CLI run

```
>>> import oci
>>> config = oci.config.from_file("~/.oci/config", "DEFAULT2")
>>> identity = oci.identity.identityClient(config)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'oci.identity' has no attribute 'identityClient'
>>> identity = oci.identity.IdentityClient(config)
>>> availability_domains_list = identity.list_availability_domains(config['tenancy']).data


>>> for availability_domain in availability_domains_list:
...     print('AD: ' + str(availability_domain.name))
...
//look for your results
>>>
```

>You can find information on any known issues with the SDK here and under the “Issues” tab of this project’s [Github Repository](https://github.com/oracle/oci-python-sdk)