Introduction
Some DCI users may not clearly understand how the agents' code is structured once they are installed in their servers, so they take long time to locate the resources they would need to check during the usage of the DCI agents or during troubleshooting.
Currently, the README documentation of each agent explains what are the files that are installed and their location in the server. Based on that information, this blog post will help users to understand why these files are placed in these locations and their roles in the execution process.
The projects covered on this blog post are the following:
General concepts
If you look at the GitHub repositories mentioned earlier, you will see a clear directory structure, but these files are not placed in the same directory once onboarded in the server where you install the DCI agents.
Remember that these DCI agents are all packaged and available as RPMs, so you eventually install the DCI agents using the RPM. If you take a look at each project's repository, you will find a .spec
file, which contains the instructions used by rpmbuild
to generate the RPM.
In the case of dci-pipeline
, the .spec
file directly includes the commands that are launched to place each folder/file in the correct destination. However, for dci-openshift-agent
(1) and dci-openshift-app-agent
(2), you can also find a Makefile for each case: (1), (2), which is eventually called in the .spec
file to run the installation steps.
In addition to placing files and folders in the server, each RPM also holds instructions to create system users with sudo permissions and system groups, or to create system services. These features and utilities are beyond the scope of this blog post; we will just concentrate on files and folders that directly impact DCI users when dealing with the execution of DCI jobs.
So, let's delve into the project structure of each agent, checking the meaning of the most important files and folders provided, and identifying their location after installing the RPM on your server.
dci-openshift-agent
From the README, you will have some introductory information regarding the places where folders and files are located. Here, we will expand this information:
/etc/dci-openshift-agent
: this directory contains configuration files placed by the RPM, primarily templates, but you can save here aconfig
file to declare environment variables to be consumed by the agent. Templates you can find here are:dcirc.sh.dist
file, which is a template of thedcirc.sh
file you need to use to save your DCI credentials (based on your DCI's remote-ci) when running DCI jobs.hooks
it is a directory that acts as a placeholder for partner hooks that you can use as base to build your own customized hooks.settings.yml
file, with a standard setup to launch the agent with the legacy mode. If you still have some settings file and you want to transform them todci-pipeline
's format, take a look below at dci-pipeline section to see how to do this.
/usr/share/dci-openshift-agent/
: this directory contains:- The main Ansible logic that drives this agent, composed by:
- The
dci-openshift-agent.yml
playbook, which is the entry point to launch an OCP installation with DCI. - All the playbooks used during the agent execution, saved in the
plays
folder. You will see there are no roles in this project, and it is because we are importing the redhatci-ocp collection. - Files for the Ansible configuration (
ansible.cfg
) and the provision of default values for variables (group_vars
folder).
- The
- Other interesting artifacts, that you can find in the
utils
folder (e.g. cleanup scripts).
- The main Ansible logic that drives this agent, composed by:
/var/lib/dci-openshift-agent
: under thesamples
directory, you will find some examples that you can use in your labs, referring to useful deployments (such as deploying Assisted on libvirt) or extra utilities (like a local registry deployment).
dci-openshift-app-agent
The structure of dci-openshift-app-agent
is quite similar to dci-openshift-agent
's one, but it focuses on the deployment of workloads, or running processes, on top of an already deployed OCP cluster. In the README, you can find some information, but here we provide the differences compared with dci-openshift-agent
:
/etc/dci-openshift-app-agent
: serves as a directory to place the required configuration files for this agent. Here, you will find the presence ofdcirc.sh.dist
orsettings.yml
files andhooks
folder, with the same meaning than indci-openshift-agent
, but here we can also fild ahosts.yml
file, which is typically used as-is when runningdci-openshift-app-agent
, since the hosts file points tolocalhost
and the agent relies on the cluster's kubeconfig file to interact with the cluster resources. You can place here aconfig
file to define environment variables to be consumed by the agent./usr/share/dci-openshift-app-agent/
: it holds the Ansible configuration and playbooks, havingansible.cfg
file for the Ansible configuration,dci-openshift-app-agent.yml
main playbook,group_vars
folder for defining default values to variables, andplays
folder containing the playbooks that are used in the agent. Then, similarly todci-openshift-agent
, there is anutilities
folder to place some utils, such as an internal registry./var/lib/dci-openshift-app-agent
: it provides asamples
folder with examples of workloads that you can launch with this agent; for example,control_plane_example
, a very simple workload based on a webserver deployment, ortnf_test_example
, a set of resources that are suitable for CNF Certification using the Red Hat Best Practices Test Suite for Kubernetes.
dci-pipeline
The case of dci-pipeline
differs from the agents as it's not an "agent" at all; it provides a set of tools to enable the deployment of pipelines to run DCI jobs. In the README, you can find a review of the files and folders you can find here. Details are below:
/etc/dci-pipeline
: in this case, it just contains an emptypipeline.yml
file to serve as a template. Typically you will create a folder in a separate repo to save your pipelines and use them from there. But also, this folder can be used to hold aconfig
file with some interesting variables to be consumed bydci-pipeline
, e.g.PIPELINES_DIR
variable pointing to the location of the pipelines (extracted from here)./usr/bin
: in this folder, you will find some executable files that serve as entry point for the main utilitie, (also withpodman
flavour, provided in this project. Some of these scripts come fromtools
folder, and others are generated from folders likedciagent
,dcipipeline
ordciqueue
, and their podman flavours are located incontainer
folder. These are:dci-pipeline
: standard way of launching pipelines with DCI. More documentation can be found here.dci-auto-launch
: this allows to automatically schedule pipelines based on strings in the description of Github's pull requests or Gerrit's reviews. It relies on a configuration file that can be found in~/.config/dci-pipeline/auto.conf
. More details can be seen here.dci-pipeline-schedule
: wrapper to calldci-pipeline
without specifying the paths for the pipeline files and the inventories.dci-pipeline-check
: another wrapper to test a Github pull request or a Gerrit review with a specific pipeline.dci-queue
: this command allows you to execute commands consuming resources from pools, so that you can schedule calls to DCI pipeline that are eventually queued in a set of resources you have defined in advance.dci-agent-ctl
: as defined in the README, it is a thin layer on top ofdci-pipeline
to consume regular agent settings transparently.dci-rebuild-pipeline
: this command rebuilds a pipeline based on a given DCI job, using the components extracted from that job.dci-settings2pipeline
: this allows you to run the parsing capabilities ofdci-agent-ctl
but without executingdci-pipeline
, just outputing the pipeline file. More information here.dci-diff-pipeline
: this compares two jobs to check the differences in components between two jobs.
/usr/share/dci-pipeline
: you will find here some scripts that are placed in thetools
folder from the repo, that can be use in standalone mode or usingpodman
flavour (meant to be run from a podman container). Some of them are used by the scripts placed in/usr/bin
. They are:alert
: send alerts to Google Chat and/or Slack from monitored repositories. This can be used, for example, to define webhooks which allows you to send alerts when a DCI job fails while testing PRs on specific repositories.common
: import environment variables that may be defined in~/.config/dci-pipeline
(folder that is created when installingdci-pipeline
) and/etc/dci-pipeline
folders.dci-pipeline-helper
: called fromdci-pipeline-schedule
with the information fromdci-queue
to be able to expand the@RESOURCE
and@QUEUE
strings (more information about these two concepts can be found here) with the right information and then calldci-pipeline
with the right arguments.extract-dependencies
: this is used to extract the content from Github pull requests or Gerrit reviews that are included as dependencies of the change you are testing.get-config-entry
: used from scripts that interacts with Github/Gerrit repos to extract some configuration such as tokens or extra config.loop_until_failure
andloop_until_success
: loops used bydci-pipeline-check
logic.send_status
: send messages to Github PRs and Gerrit reviews regarding some status of the DCI pipeline execution that needs to be reported.send_comment
: send messages to Github PRs and Gerrit reviews to put a comment in the history of these PRs/reviews.test-runner
: utility that is called bydci-pipeline-check
to properly translate the configuration and variables to adapt to the changes that are about to be tested, then callingdci-pipeline
with the proper arguments.yaml2json
: transform a YAML input in JSON output.
Conclusions
We hope this information is useful for you when dealing with any of dci-openshift-agent
, dci-openshift-app-agent
and dci-pipeline
projects, to be able to easily locate the resources you may need to check when dealing with troubleshooting.