---
# System prepended metadata

title: get-hash consolidation
tags: [Design]

---

# get-hash consolidation
###### tags: `Design`

| Repository | Code src | Usage | Where |
| ---------- | -------- | ----- | ----- |
| openstack/tripleo-ci | [roles/build-containers](https://opendev.org/openstack/tripleo-ci/src/branch/master/roles/build-containers/tasks/main.yaml#L28-L69) | Retrieve the hash to build containers | container build jobs (check/periodic) |
| openstack/tripleo-ci | [emit_releases_file.py](https://opendev.org/openstack/tripleo-ci/src/branch/master/scripts/emit_releases_file/emit_releases_file.py#L84-L140) | :question: | :question: |
| openstack/tripleo-quickstart | [roles/repo-setup](https://opendev.org/openstack/tripleo-quickstart/src/branch/master/roles/repo-setup/tasks/main.yml) | retrieve hash to set repo up | :question: |
| rdo-infra/ci-config | [roles/get-hash](https://github.com/rdo-infra/ci-config/blob/master/ci-scripts/infra-setup/roles/get_hash/tasks/get_hash.yaml) | get hash for component/integration pipelines | centos8 & component jobs |
| rdo-infra/review.rdoproject.org-config | [get-hash.sh](https://github.com/rdo-infra/review.rdoproject.org-config/blob/master/playbooks/tripleo-ci-periodic-base/pre.yaml#L22) | old/deprecated get-hash script | (must be) replaced by get-hash role in ci-config |
| rdo-infra/ci-config | promoter code | promoter bits that get dlrn hash? | promoter code |

## PROBLEMS

### Duplicated code
There are many different get-hash code functions spread across tripleo projects/repos w/ their respective unique ways of getting the hash from dlrn api. All these bits must be consolidated in one single code.

### Bash code
Some bits in bash are hard to test, or even untestable.

### Deprecated / old code
Some of these methods are no longer used and should be removed from the code base.

## SOLUTION
Once you get dlrnapi_client installed in the virtualenv, you can use dlrn_api ansible module like in the [example here]( https://github.com/softwarefactory-project/dlrnapi_client/blob/master/dlrnapi_client/ansible/example_playbook.yaml). You may also import the python module dlrnapi_client, which comes from the same pip packages installed.

Tested example:
```
- name: check reported results
  hosts: localhost
  vars:
    dlrnapi_user: <obfuscated>
    dlrnapi_pass: <obfuscated>
    dlrn_server_url: https://trunk.rdoproject.org/api-centos8-master-uc
    get_hash:
      commit_hash: 364d07fa857eb87caa6717f4d063dc84e5e2842a
      distro_hash: f6f9a73b2565b441813c54aa1e44730f9bde9c2e
  tasks:

    - pip:
        name: dlrnapi_client

    - command: "{{ ansible_python_interpreter }} -c 'import dlrnapi_client'"

    - dlrn_api:
        action: repo-status
        host: "{{ dlrn_server_url }}"
        user: "{{ dlrnapi_user }}"
        password: "{{ dlrnapi_pass }}"
        job_id: "{{ item }}"
        commit_hash: "{{ get_hash.commit_hash }}"
        distro_hash: "{{ get_hash.distro_hash }}"
        success: true
        notes: 'Tested from ansible'
      register: dlrnout
      with_items:
        - periodic-tripleo-ci-centos-8-standalone
    - debug:
        var: dlrnout
```

:::info
Note: This works pretty well on py3 :heavy_check_mark: 
:::


## Collateral fixes
The bits that interact with dlrn api (like `check_dlrn_reports` task and `promote-hash` role) are written in bash and should be replaced w/ python/ansible modules. These are not directly related to `get-hash` code.


#### check dlrn reports
Even w/ the new role, the [code that interacts w/ dlrnapi](https://raw.githubusercontent.com/rdo-infra/review.rdoproject.org-config/b1fbc15575a6f9ad857cb747a7d5f3b8b7ccad4d/ci-scripts/tripleo-upstream/dlrnapi_check_reports.sh) is a bash script. And it sources files w/ env vars. This is how hash_info files are created and sourced in the get-hash role.


#### promote hash
Another piece of code that is in bash and must be converted to ansible is the [promote-hash role](https://github.com/rdo-infra/review.rdoproject.org-config/blob/master/roles/promote-hash/tasks/promote-primary-distro.yaml#L23
) in config repo.


#### Ensuring rpm content is sane.
This may very well be out of scope, but it's related and worth writing down as a possible edge case.
[1] https://review.rdoproject.org/r/#/c/26294/

[1] fixed an issue where older ( much older) rpms
were getting added to promoted yum repos. This caused
a series of bugs and complaints in the upstream. [2][3]

[2]https://trello.com/c/uO0K0iE1
[3]https://trello.com/c/EpkhyOK9


