Repository: irods/irods_training
Pull request #68: updates for 2025
Author: login: FifthPotato
Created: 2025-05-20T10:18:12Z | Merged: 2025-05-28T15:43:24Z

As titled.


Diff:
diff --git a/beginner/Makefile b/beginner/Makefile
index dd72949..f421dcb 100644
--- a/beginner/Makefile
+++ b/beginner/Makefile
@@ -1,7 +1,7 @@
 SHELL=/bin/bash
 
 default:
-	pdflatex irods_beginner_training_2024.tex
+	pdflatex irods_beginner_training_2025.tex
 
 clean:
-	rm -f irods_beginner_training_2024.{aux,log,out,toc}
+	rm -f irods_beginner_training_2025.{aux,log,out,toc}
diff --git a/beginner/irods_beginner_training_2024.pdf b/beginner/irods_beginner_training_2024.pdf
deleted file mode 100644
index ee2971d..0000000
Binary files a/beginner/irods_beginner_training_2024.pdf and /dev/null differ
diff --git a/beginner/irods_beginner_training_2025.pdf b/beginner/irods_beginner_training_2025.pdf
new file mode 100644
index 0000000..310176e
Binary files /dev/null and b/beginner/irods_beginner_training_2025.pdf differ
diff --git a/beginner/irods_beginner_training_2024.tex b/beginner/irods_beginner_training_2025.tex
similarity index 96%
rename from beginner/irods_beginner_training_2024.tex
rename to beginner/irods_beginner_training_2025.tex
index 6e2abba..dc09ea7 100644
--- a/beginner/irods_beginner_training_2024.tex
+++ b/beginner/irods_beginner_training_2025.tex
@@ -69,16 +69,16 @@
 \begin{center}
 
 \vspace{20mm}
-\huge{\textbf{BEGINNER TRAINING WITH iRODS 4.3}}
+\huge{\textbf{BEGINNER TRAINING WITH iRODS 5.0}}
 
 \vspace{60mm}
 \textbf{Part of the iRODS User Group Meeting}
 
 \vspace{10mm}
-\textbf{Amsterdam, Netherlands}
+\textbf{Durham, North Carolina}
 
 \vspace{10mm}
-\textbf{May 28, 2024}
+\textbf{June 17, 2025}
 
 \end{center}
 
@@ -128,7 +128,7 @@ \section{About the iRODS Consortium}
 
 The iRODS Consortium is operated at the University of North Carolina at Chapel Hill (UNC) by RENCI (Renaissance Computing Institute), a research institute of UNC. Consortium governance is provided through an Executive Board and Planning Committee. A Technology Working Group, composed of Consortium staff and satellite teams, contributes decision-making and development time to the project.
 
-Current Consortium members include RENCI, Bayer, The National Institute of Environmental Health Sciences (NIEHS), Wellcome Sanger Institute, Utrecht University, University College London, University of Groningen, SURF, Texas Advanced Computing Center (TACC), Maastricht University, KU Leuven, CUBI at Berlin Institute of Health, Bibliothèque et Archives nationales du Québec (BAnQ), CINES, Omnibond, The Council for Scientific and Industrial Research (CSIR), University of Arizona, IT4Innovations National Supercomputing Center, Globus, GRAU DATA, and three organizations that wish to remain anonymous. Membership is open to anyone interested in sustaining iRODS' success and participating in the iRODS community.
+Current Consortium members include RENCI, Bayer, The National Institute of Environmental Health Sciences (NIEHS), Wellcome Sanger Institute, Utrecht University, University of Groningen, SURF, Texas Advanced Computing Center (TACC), Maastricht University, KU Leuven, CUBI at Berlin Institute of Health, Bibliothèque et Archives nationales du Québec (BAnQ), CINES, Omnibond, The Council for Scientific and Industrial Research (CSIR), University of Arizona, IT4Innovations National Supercomputing Center, Globus, Wageningen University and Research (WUR), The Netherlands Cancer Institute (NKI), and three organizations that wish to remain anonymous. Membership is open to anyone interested in sustaining iRODS' success and participating in the iRODS community.
 
 Consortium members receive a variety of benefits, including prioritized access to support, training, and consulting; and the opportunity to influence the developmental roadmap of future software releases.
 
@@ -425,7 +425,7 @@ \section{The iRODS Catalog Database}
 Create the PostgreSQL user account to be used by iRODS:
 
 \begin{lstlisting}[language=sql]
-  > CREATE USER irods WITH PASSWORD @\char"0D@testpassword@\char"0D@;
+> CREATE USER irods WITH PASSWORD @\char"0D@testpassword@\char"0D@;
 \end{lstlisting}
 
 Give the iRODS PostgreSQL user account permission to use the database:
@@ -434,6 +434,12 @@ \section{The iRODS Catalog Database}
 > GRANT ALL PRIVILEGES ON DATABASE "ICAT" to irods;
 \end{lstlisting}
 
+If using PostgreSQL 15.0+, set the owner of the database:
+
+\begin{lstlisting}[language=sql]
+> ALTER DATABASE "ICAT" OWNER TO irods;
+\end{lstlisting}
+
 Log out of the PostgreSQL command console:
 
 \begin{lstlisting}[language=sql]
@@ -472,7 +478,7 @@ \section{Installing iRODS Software Packages}
 To download the core server software execute:
 
 \begin{lstlisting}
-$ sudo apt-get -y install irods-server irods-database-plugin-postgres
+$ sudo apt-get -y install irods-server irods-database-plugin-postgres irods-icommands
 \end{lstlisting}
 
 Then you will be presented with, among other things, this set of messages:
@@ -530,15 +536,12 @@ \section{Installing iRODS Software Packages}
 \ugmbullet Zone Port & \colorbox{gray!70}{1247} The main iRODS port. \\
 \ugmbullet Parallel Port Range (Begin) & \colorbox{gray!70}{20000} The beginning of the port range used when transferring large files. \\
 \ugmbullet Parallel Port Range (End) & \colorbox{gray!70}{20199} The end of the port range used when transferring large files. \\
-\ugmbullet Control Plane Port & \colorbox{gray!70}{1248} The port used for the control plane. The control plane receives status updates from all servers, and issues commands to servers to pause, resume, shutdown, etc. \\
-\makecell[l]{\ugmbullet Schema Validation \\ \hspace{8.5mm}Base URI} & \colorbox{gray!70}{file:///var/lib/irods/configuration\_schemas} The location of the schema files used to validate the server's configuration files. \\
 \makecell[l]{\ugmbullet iRODS Administrator \\ \hspace{8.5mm}Username} & \colorbox{gray!70}{rods} The name of the iRODS administration account that will be created during setup. \\
 \hline
 
 \multicolumn{2}{|l|}{4. Keys and Passwords} \\
 \ugmbullet Zone Key & A secret key used in server-to-server communication. \\
 \ugmbullet Negotiation Key & A secret key used in server-to-server communication.  Must be exactly 32 bytes (characters). \\
-\ugmbullet Control Plane Key & A secret key shared by all servers.  Must be exactly 32 bytes (characters).\\
 \makecell[l]{\ugmbullet iRODS Administrator \\ \hspace{8.5mm}Password} & For the purposes of this class, use \texttt{rods}. In the future, however, you will want to use more complex passwords. \\
 \hline
 
@@ -556,7 +559,7 @@ \section{Installing iRODS Software Packages}
 
 The iRODS server will not be running after setup. Run the following to start the server:
 \begin{lstlisting}
-$ sudo su irods -c "/var/lib/irods/irodsctl start"
+$ sudo su - irods -c "irodsServer -d"
 \end{lstlisting}
 
 Finally, we will activate the delay server on this machine for use later on in this training:
@@ -582,7 +585,7 @@ \chapter{Using iCommands}
 
 To get help on a specific iCommand (such as \texttt{ils} for listing the contents of a collection), you may
 \begin{itemize}
- \item visit this webpage: \url{https://docs.irods.org/4.3.0/icommands/user/}
+ \item visit this webpage: \url{https://docs.irods.org/5.0.0/icommands/user/}
  \item use the -h option with the command (e.g., \texttt{ils -h}), or
  \item use the \texttt{ihelp} command as the argument with the command you'd like to learn more
          about (e.g., \texttt{ihelp ils}).
@@ -670,7 +673,7 @@ \section{Administrative Operations}
 
 Let's use iadmin to create a second resource, \texttt{newResc}, of the type unixfilesystem, on the local host, and mounted at \texttt{/var/lib/irods/new\_vault}. This will be a single line of text on your screen.
 
-\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+\begin{lstlisting}[basicstyle=\ttfamily]
 $ iadmin mkresc newResc unixfilesystem $(hostname):/var/lib/irods/new_vault
 \end{lstlisting}
 
@@ -790,7 +793,7 @@ \section{Working with Data Objects}
 For this training, we will be using a set of images. To prepare your home directory for the following exercises, do the following:
 
 \begin{lstlisting}
-$ wget https://github.com/irods/irods_training/raw/ugm2024/beginner/training_jpgs.zip
+$ wget https://github.com/irods/irods_training/raw/ugm2025/beginner/training_jpgs.zip
 $ sudo apt-get -y install unzip
 $ unzip training_jpgs.zip
 \end{lstlisting}
@@ -1060,7 +1063,7 @@ \section{Wrapping Up}
 We have covered several fundamental iCommands, but there are dozens more that cover copying data between collections, moving data between resources, computing checksums, etc.
 
 You can learn more about any iCommand using the \texttt{-h} command line option, or by visiting \\
-\url{https://docs.irods.org/4.3.0/icommands/user/}.
+\url{https://docs.irods.org/5.0.0/icommands/user/}.
 
 \chapter{Virtualization}
 
@@ -1077,10 +1080,10 @@ \chapter{Virtualization}
 \hline
 Interface & Plugins \\
 \hline
-Authentication & \vspace{-6mm}\makecell[l]{Native (iRODS password) \\ Pluggable Authentication Module (PAM) \\ LDAP via PAM \\Kerberos* \\ Grid Security Infrastructure (GSI)*} \\
-Network & \makecell[l]{Transmission Control Protocol (TCP) \\ Secure Socket Layer (SSL)} \\
-Database & \makecell[l]{Oracle* \\ PostgreSQL* \\ MySQL* \\ CockroachDB (unreleased)*} \\
-Rule Engine & \vspace{-3mm}\makecell[l]{iRODS Rule Language \\ Python* \\ C++ (various)* \\ Javascript (unreleased)* \\ Go (unreleased)*} \\
+Authentication & \vspace{-6mm}\makecell[l]{Native (iRODS password) \\ Pluggable Authentication Module (PAM)} \\
+Network & \makecell[l]{Transmission Control Protocol (TCP) \\ Transport Layer Security (TLS)} \\
+Database & \makecell[l]{Oracle* \\ PostgreSQL* \\ MariaDB* \\ MySQL*} \\
+Rule Engine & \vspace{-3mm}\makecell[l]{iRODS Rule Language \\ Python* \\ C++ (various)*} \\
 API & An avenue through which new functionality can be added to an iRODS deployment. \\
 Microservices & There are over 350 available, covering a variety of functions. \\
 Composable Resources & There are two kinds of Composable Resources in iRODS: Coordinating and Storage. Both are discussed in more detail in the next section. \\
@@ -1411,12 +1414,13 @@ \section{The \texttt{imeta} Command}
 
 This confirms that the metadata has been added.
 
-Recall that \texttt{imeta} also allows users to search on metadata. You may place conditions on attributes and values by using a comparison operator. For example, using the \texttt{qu} subcommand (meaning query), let's search for an object that has an author of AJones.
+iRODS allows a user to search on metadata via GenQuery, an SQL-inspired query language. You may place conditions on attributes and values by using a comparison operator. For example, using the \texttt{iquest} command, let's search for a data object that has an author of AJones.
 
-\begin{lstlisting}
-$ imeta qu -d author = @\char"0D@AJones@\char"0D@
-collection: /tempZone/home/alice/training_jpgs
-dataObj: seal.jpg
+\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+$ iquest "SELECT COLL_NAME, DATA_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE = 'AJones'"
+COLL_NAME = /tempZone/home/alice/training_jpgs
+DATA_NAME = seal.jpg
+------------------------------------------------------------
 \end{lstlisting}
 
 The data object that has AJones listed as the author is \texttt{seal.jpg} in the \texttt{training\_jpgs} collection.
@@ -1429,25 +1433,26 @@ \section{The \texttt{imeta} Command}
 $ imeta add -d grapes.jpg color_bw color
 \end{lstlisting}
 
-You may also search using wildcards. In iRODS, the percent symbol (\%) is used as the wildcard character. Let's try this out. We'll search for data objects that contain any value for the attribute author, using the \texttt{qu} subcommand and the \texttt{\%} wildcard.
-
-\begin{lstlisting}
-$ imeta qu -d author like @\char"0D@%@\char"0D@
+You may also search using wildcards. In GenQuery, the percent symbol (\%) is used as the wildcard character in LIKE statements. Let's try this out. We'll search for data objects that contain any value for the attribute author, using the \texttt{iquest} command and the \texttt{\%} wildcard.
 
-collection: /tempZone/home/alice/training_jpgs
-dataObj: grapes.jpg
-----
-collection: /tempZone/home/alice/training_jpgs
-dataObj: seal.jpg
+\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+$ iquest "SELECT COLL_NAME, DATA_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE LIKE '%'"
+COLL_NAME = /tempZone/home/alice/training_jpgs
+DATA_NAME = grapes.jpg
+------------------------------------------------------------
+COLL_NAME = /tempZone/home/alice/training_jpgs
+DATA_NAME = seal.jpg
+------------------------------------------------------------
 \end{lstlisting}
 
 From this search, two data objects were returned: \texttt{grapes.jpg} and \texttt{seal.jpg}. Both have an author attribute.
 
-We can also search for collections based on their metadata. Let's search for collections that have an attribute of \texttt{collection\_type}. Remember, for this we need to use the \texttt{-C} option.
+We can also search for collections based on their metadata. Let's search for collections that have an attribute of \texttt{collection\_type}. For this we need to use the \texttt{META\_COLL\_ATTR\_NAME} attribute in \texttt{iquest}.
 
-\begin{lstlisting}
-$ imeta qu -C collection_type like @\char"0D@%@\char"0D@
-collection: /tempZone/home/alice/training_jpgs
+\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+$ iquest "SELECT COLL_NAME WHERE META_COLL_ATTR_NAME = 'collection_type' AND META_COLL_ATTR_VALUE LIKE '%'"
+COLL_NAME = /tempZone/home/alice/training_jpgs
+------------------------------------------------------------
 \end{lstlisting}
 
 To modify a data object's AVU with \texttt{imeta}, we must specify the object's name, the attribute name, the attribute's associated value, and the desired new value. To change the author attribute from AJones to BSmith for \texttt{grapes.jpg}, we'll use the \texttt{mod} subcommand and the \texttt{v:} prefix for changing the value of author.
@@ -1518,7 +1523,7 @@ \section{Using the Delay Queue}
 \begin{lrbox}{\exampleDelayRule}
 \lstinputlisting[basicstyle=\scriptsize\ttfamily]{example_delay.r}
 \end{lrbox}
-\href{https://raw.githubusercontent.com/irods/irods_training/ugm2024/beginner/example_delay.r}{\usebox{\exampleDelayRule}}
+\href{https://raw.githubusercontent.com/irods/irods_training/ugm2025/beginner/example_delay.r}{\usebox{\exampleDelayRule}}
 
 This rule will print the string \texttt{Adding delay rule to queue.} to the server log. After 30 seconds, this rule will print the string \texttt{Hello iRODS World!} to the server log, and then every minute thereafter.
 
@@ -1597,13 +1602,13 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
 \begin{lrbox}{\lstTrainingRuleBase}
 \lstinputlisting[language=Python,basicstyle=\scriptsize\ttfamily]{training.re}
 \end{lrbox}
-\href{https://raw.githubusercontent.com/irods/irods_training/ugm2024/beginner/training.re}{\usebox{\lstTrainingRuleBase}}
+\href{https://raw.githubusercontent.com/irods/irods_training/ugm2025/beginner/training.re}{\usebox{\lstTrainingRuleBase}}
 
 \vspace{5mm}
 \begin{lrbox}{\lstPythonRulebase}
 \lstinputlisting[language=Python,basicstyle=\scriptsize\ttfamily]{core.py}
 \end{lrbox}
-\href{https://raw.githubusercontent.com/irods/irods_training/ugm2024/beginner/core.py}{\usebox{\lstPythonRulebase}}
+\href{https://raw.githubusercontent.com/irods/irods_training/ugm2025/beginner/core.py}{\usebox{\lstPythonRulebase}}
 
 We will be updating the \texttt{pep\_api\_data\_obj\_put\_post} PEP to provide the desired behavior as the default is an empty definition with no effect.  This PEP is triggered after a data object is at rest (i.e., when all the bits have been uploaded and the data object is registered in iRODS), and this suits our purposes because after StockPhotoSite (SPS) data objects have been uploaded to iRODS, we will want the metadata to be harvested and applied to data objects for later discovery by SPS users.
 
@@ -1630,7 +1635,7 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
         },
 \end{lstlisting}
 \end{lrbox}
-\href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L41-L45}{\usebox{\lstServerConfigA}}
+\href{https://github.com/irods/irods_training/blob/ugm2025/beginner/server_config.json#L41-L45}{\usebox{\lstServerConfigA}}
 
 And add the new \texttt{training.re} rulebase to ``re\_rulebase\_set":
 
@@ -1642,12 +1647,18 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
                 ],
 \end{lstlisting}
 \end{lrbox}
-\href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
+\href{https://github.com/irods/irods_training/blob/ugm2025/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
 
-Save the file and the new rulebases will be activated!  Let's upload a new file to our home collection:
+Save the file, then issue the following command to reload the server configuration.
 
 \begin{lstlisting}
-$ wget https://github.com/irods/irods_training/raw/ugm2024/stickers.jpg
+$ sudo su - irods -c 'kill -HUP $(cat /var/run/irods/irods-server.pid)'
+\end{lstlisting}
+
+The new rulebases will be activated!  Let's upload a new file to our home collection:
+
+\begin{lstlisting}
+$ wget https://github.com/irods/irods_training/raw/ugm2025/stickers.jpg
 $ iput stickers.jpg
 \end{lstlisting}
 
@@ -1746,9 +1757,6 @@ \chapter{Glossary Of iRODS Terms}
 \item [Composable Resources]
 Composable Resources are plugins that allow you to manage storage and retrieval of data on storage devices. There are two types of composable resources: Coordinating and Storage.
 
-\item [Control Plane]
-The control plane receives status updates from all servers, and issues commands to servers to pause, resume, shut down, etc.
-
 \item [Coordinating Resource]
 A Coordinating Resource is a type of Composable Resource that actively makes decisions about which physical storage device will receive or serve up a Data Object.
 


Reviews:
user: login: alanking
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-20T12:54:51Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-20T12:57:30Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-20T12:57:49Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-20T12:58:47Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-21T17:11:46Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-22T12:27:38Z
user: login: alanking
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-22T16:13:29Z
user: login: FifthPotato
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-22T19:41:45Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T00:25:23Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-23T19:46:34Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-27T16:36:52Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-27T16:38:14Z
user: login: alanking
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T14:18:25Z
user: login: alanking
body: Looks better to me. I defer
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T15:10:28Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:18:22Z
user: login: FifthPotato
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T15:21:46Z
user: login: trel
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-05-28T15:30:42Z
user: login: alanking
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-28T15:43:18Z

Review comments:
path: beginner/irods_beginner_training_2024.pdf
user: login: alanking
body: I guess we haven't generated this recently? I'm confused how increasing the font size for one command made the side of the PDF go *down*.
created_at: 2025-05-20T12:54:51Z
author_association: CONTRIBUTOR
path: beginner/irods_beginner_training_2024.pdf
user: login: trel
body: we're definitely not going to re-render and include a binary file until we get 'all' the changes in for this year.

let's remove the pdf from this PR for now.
created_at: 2025-05-20T12:57:30Z
author_association: MEMBER
path: beginner/irods_beginner_training_2024.pdf
user: login: trel
body: we'll also need to rename the files and makefile to produce 2025, rather than 2024.
created_at: 2025-05-20T12:57:49Z
author_association: MEMBER
path: beginner/irods_beginner_training_2024.pdf
user: login: trel
body: same work done in this commit... https://github.com/irods/irods_training/commit/d6b942f30fdff72e5c8e5a7fb73c99fdb58b1ff9
created_at: 2025-05-20T12:58:47Z
author_association: MEMBER
diff_hunk: @@ -1077,10 +1077,10 @@ \chapter{Virtualization}
 \hline
 Interface & Plugins \\
 \hline
-Authentication & \vspace{-6mm}\makecell[l]{Native (iRODS password) \\ Pluggable Authentication Module (PAM) \\ LDAP via PAM \\Kerberos* \\ Grid Security Infrastructure (GSI)*} \\
-Network & \makecell[l]{Transmission Control Protocol (TCP) \\ Secure Socket Layer (SSL)} \\
-Database & \makecell[l]{Oracle* \\ PostgreSQL* \\ MySQL* \\ CockroachDB (unreleased)*} \\
-Rule Engine & \vspace{-3mm}\makecell[l]{iRODS Rule Language \\ Python* \\ C++ (various)* \\ Javascript (unreleased)* \\ Go (unreleased)*} \\
+Authentication & \vspace{-6mm}\makecell[l]{Native (iRODS password) \\ Pluggable Authentication Module (PAM)} \\
+Network & \makecell[l]{Transmission Control Protocol (TCP) \\ Transport Layer Security (TLS)} \\
+Database & \makecell[l]{Oracle* \\ PostgreSQL* \\ MariaDB* \\ MySQL* \\ CockroachDB (unreleased)*} \\
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: let's remove cockroach too
created_at: 2025-05-21T17:11:46Z
author_association: MEMBER
diff_hunk: @@ -1408,12 +1408,13 @@ \section{The \texttt{imeta} Command}
 
 This confirms that the metadata has been added.
 
-Recall that \texttt{imeta} also allows users to search on metadata. You may place conditions on attributes and values by using a comparison operator. For example, using the \texttt{qu} subcommand (meaning query), let's search for an object that has an author of AJones.
+iRODS allows a user to search on metadata via GenQuery, an SQL-inspired query language. You may place conditions on attributes and values by using a comparison operator. For example, using the \texttt{iquest} command, let's search for a data object that has an author of AJones.
 
-\begin{lstlisting}
-$ imeta qu -d author = @\char"0D@AJones@\char"0D@
-collection: /tempZone/home/alice/training_jpgs
-dataObj: seal.jpg
+\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+$ iquest "SELECT DATA_NAME, COLL_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE = 'AJones'"
+DATA_NAME = seal.jpg
+COLL_NAME = /tempZone/home/alice/training_jpgs
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: let's keep the ordering...

```suggestion
$ iquest "SELECT COLL_NAME, DATA_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE = 'AJones'"
COLL_NAME = /tempZone/home/alice/training_jpgs
DATA_NAME = seal.jpg
```
created_at: 2025-05-22T11:29:48Z
author_association: MEMBER
diff_hunk: @@ -1426,25 +1427,26 @@ \section{The \texttt{imeta} Command}
 $ imeta add -d grapes.jpg color_bw color
 \end{lstlisting}
 
-You may also search using wildcards. In iRODS, the percent symbol (\%) is used as the wildcard character. Let's try this out. We'll search for data objects that contain any value for the attribute author, using the \texttt{qu} subcommand and the \texttt{\%} wildcard.
-
-\begin{lstlisting}
-$ imeta qu -d author like @\char"0D@%@\char"0D@
+You may also search using wildcards. In GenQuery, the percent symbol (\%) is used as the wildcard character in LIKE statements. Let's try this out. We'll search for data objects that contain any value for the attribute author, using the \texttt{iquest} command and the \texttt{\%} wildcard.
 
-collection: /tempZone/home/alice/training_jpgs
-dataObj: grapes.jpg
-----
-collection: /tempZone/home/alice/training_jpgs
-dataObj: seal.jpg
+\begin{lstlisting}[basicstyle=\scriptsize\ttfamily]
+$ iquest "SELECT DATA_NAME, COLL_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE LIKE '%'"
+DATA_NAME = grapes.jpg
+COLL_NAME = /tempZone/home/alice/training_jpgs
+------------------------------------------------------------
+DATA_NAME = seal.jpg
+COLL_NAME = /tempZone/home/alice/training_jpgs
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: same

```suggestion
$ iquest "SELECT COLL_NAME, DATA_NAME WHERE META_DATA_ATTR_NAME = 'author' AND META_DATA_ATTR_VALUE LIKE '%'"
COLL_NAME = /tempZone/home/alice/training_jpgs
DATA_NAME = grapes.jpg
------------------------------------------------------------
COLL_NAME = /tempZone/home/alice/training_jpgs
DATA_NAME = seal.jpg
```
created_at: 2025-05-22T12:26:05Z
author_association: MEMBER
path: beginner/irods_beginner_training_2024.pdf
user: login: alanking
body: :eyes: 
created_at: 2025-05-22T16:13:24Z
author_association: CONTRIBUTOR
path: beginner/irods_beginner_training_2024.pdf
user: login: FifthPotato
body: Oops.
created_at: 2025-05-22T19:41:45Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1643,7 +1643,13 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
 \end{lrbox}
 \href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
 
-Save the file and the new rulebases will be activated!  Let's upload a new file to our home collection:
+Save the file, then issue the following command.
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: ```suggestion
Save the file, then issue the following command to reload the server configuration.
```
created_at: 2025-05-23T00:25:23Z
author_association: MEMBER
diff_hunk: @@ -128,7 +128,7 @@ \section{About the iRODS Consortium}
 
 The iRODS Consortium is operated at the University of North Carolina at Chapel Hill (UNC) by RENCI (Renaissance Computing Institute), a research institute of UNC. Consortium governance is provided through an Executive Board and Planning Committee. A Technology Working Group, composed of Consortium staff and satellite teams, contributes decision-making and development time to the project.
 
-Current Consortium members include RENCI, Bayer, The National Institute of Environmental Health Sciences (NIEHS), Wellcome Sanger Institute, Utrecht University, University College London, University of Groningen, SURF, Texas Advanced Computing Center (TACC), Maastricht University, KU Leuven, CUBI at Berlin Institute of Health, Bibliothèque et Archives nationales du Québec (BAnQ), CINES, Omnibond, The Council for Scientific and Industrial Research (CSIR), University of Arizona, IT4Innovations National Supercomputing Center, Globus, GRAU DATA, and three organizations that wish to remain anonymous. Membership is open to anyone interested in sustaining iRODS' success and participating in the iRODS community.
+Current Consortium members include RENCI, Bayer, The National Institute of Environmental Health Sciences (NIEHS), Wellcome Sanger Institute, Utrecht University, University of Groningen, SURF, Texas Advanced Computing Center (TACC), Maastricht University, KU Leuven, CUBI at Berlin Institute of Health, Bibliothèque et Archives nationales du Québec (BAnQ), CINES, Omnibond, The Council for Scientific and Industrial Research (CSIR), University of Arizona, IT4Innovations National Supercomputing Center, Globus, GRAU DATA, and three organizations that wish to remain anonymous. Membership is open to anyone interested in sustaining iRODS' success and participating in the iRODS community.
path: beginner/irods_beginner_training_2025.tex
user: login: trel
body: ```suggestion
Current Consortium members include RENCI, Bayer, The National Institute of Environmental Health Sciences (NIEHS), Wellcome Sanger Institute, Utrecht University, University of Groningen, SURF, Texas Advanced Computing Center (TACC), Maastricht University, KU Leuven, CUBI at Berlin Institute of Health, Bibliothèque et Archives nationales du Québec (BAnQ), CINES, Omnibond, The Council for Scientific and Industrial Research (CSIR), University of Arizona, IT4Innovations National Supercomputing Center, Globus, Wageningen University and Research (WUR), The Netherlands Cancer Institute (NKI), and three organizations that wish to remain anonymous. Membership is open to anyone interested in sustaining iRODS' success and participating in the iRODS community.
```
created_at: 2025-05-23T19:46:34Z
author_association: MEMBER
diff_hunk: @@ -434,6 +434,12 @@ \section{The iRODS Catalog Database}
 > GRANT ALL PRIVILEGES ON DATABASE "ICAT" to irods;
 \end{lstlisting}
 
+If using PostgreSQL 15.0+, issue the following query:
path: beginner/irods_beginner_training_2025.tex
user: login: trel
body: ```suggestion
If using PostgreSQL 15.0+, set the owner of the database:
```
created_at: 2025-05-27T16:36:52Z
author_association: MEMBER
diff_hunk: @@ -434,6 +434,12 @@ \section{The iRODS Catalog Database}
 > GRANT ALL PRIVILEGES ON DATABASE "ICAT" to irods;
 \end{lstlisting}
 
+If using PostgreSQL 15.0+, issue the following query:
path: beginner/irods_beginner_training_2025.tex
user: login: trel
body: and i also see a leading space before the 'CREATE USER' line... please remove it.
created_at: 2025-05-27T16:38:14Z
author_association: MEMBER
path: beginner/irods_beginner_training_2024.pdf
user: login: alanking
body: :eyes: :eyes: :eyes: 
created_at: 2025-05-28T14:12:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1643,7 +1643,13 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
 \end{lrbox}
 \href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
 
-Save the file and the new rulebases will be activated!  Let's upload a new file to our home collection:
+Save the file, then issue the following command to reload the server configuration.
+
+\begin{lstlisting}
+$ sudo su - irods -c 'kill -HUP $(cat /var/run/irods/irods-server.pid)'
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: does this work with single quotes?   or does it need to be double quotes for the subshell to work?
created_at: 2025-05-28T15:18:22Z
author_association: MEMBER
diff_hunk: @@ -1643,7 +1643,13 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
 \end{lrbox}
 \href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
 
-Save the file and the new rulebases will be activated!  Let's upload a new file to our home collection:
+Save the file, then issue the following command to reload the server configuration.
+
+\begin{lstlisting}
+$ sudo su - irods -c 'kill -HUP $(cat /var/run/irods/irods-server.pid)'
path: beginner/irods_beginner_training_2024.tex
user: login: FifthPotato
body: Ah, I actually tested this one. This specifically needs to not be double quotes, because the current user may not have access to read `/var/run/irods/irods-server.pid`. So what this hopefully achieves is that it does the subshell as irods, instead of doing the subshell as the current user and passing it to irods's .
Maybe there's a pathological case in which irods's default shell doesn't work with `$()` syntax, but hopefully that never happens. 
created_at: 2025-05-28T15:21:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1643,7 +1643,13 @@ \section{The Example Rule: Harvesting and Applying Metadata with the Python Rule
 \end{lrbox}
 \href{https://github.com/irods/irods_training/blob/ugm2024/beginner/server_config.json#L56-L59}{\usebox{\lstServerConfigB}}
 
-Save the file and the new rulebases will be activated!  Let's upload a new file to our home collection:
+Save the file, then issue the following command to reload the server configuration.
+
+\begin{lstlisting}
+$ sudo su - irods -c 'kill -HUP $(cat /var/run/irods/irods-server.pid)'
path: beginner/irods_beginner_training_2024.tex
user: login: trel
body: sold.   carry on.  resolving!
created_at: 2025-05-28T15:30:42Z
author_association: MEMBER

PR comments:
user: login: FifthPotato
created_at: 2025-05-20T16:04:36Z
body: Force-pushing to avoid the trivial squish. Should be good now?
author_association: CONTRIBUTOR
user: login: trel
created_at: 2025-05-20T16:07:40Z
body: looks good - please add more commits to this PR as you work through the updates for this year.
author_association: MEMBER
user: login: alanking
created_at: 2025-05-21T14:02:05Z
body: > looks good - please add more commits to this PR as you work through the updates for this year.

So should we await signal of "done-ness" before reviewing?
author_association: CONTRIBUTOR
user: login: korydraughn
created_at: 2025-05-21T14:17:32Z
body: If it's not in draft and the author did not request that we wait for a signal to review, then it's open for review.

@FifthPotato What's the status of this PR? Are more changes on the way?
author_association: CONTRIBUTOR
user: login: FifthPotato
created_at: 2025-05-21T16:36:09Z
body: > If it's not in draft and the author did not request that we wait for a signal to review, then it's open for review.
> 
> @FifthPotato What's the status of this PR? Are more changes on the way?

Yep, the last few should be the meatiest ones. Open to any comments on the existing ones whenever, though, so I can integrate them as I go.
author_association: CONTRIBUTOR
user: login: FifthPotato
created_at: 2025-05-21T16:52:07Z
body: @korydraughn Quick question: what specific lines does https://github.com/irods/irods_training/issues/59 refer to?
author_association: CONTRIBUTOR
user: login: korydraughn
created_at: 2025-05-21T17:33:32Z
body: > @korydraughn Quick question: what specific lines does #59 refer to?

See page 12 of the PDF.

You can try searching for "control plane" and "schema validation" too.
author_association: CONTRIBUTOR
user: login: korydraughn
created_at: 2025-05-22T15:27:51Z
body: @FifthPotato See https://github.com/irods/irods_training/issues/58#issuecomment-2901663237 for `irodsctl` notes.
author_association: CONTRIBUTOR
user: login: trel
created_at: 2025-05-27T17:52:00Z
body: looks good - please squash to taste (one commit per issue i suppose?)
author_association: MEMBER
user: login: trel
created_at: 2025-05-27T17:52:50Z
body: you can leave the 'update to 2025' as an un-numbered commit if you want.  we don't have an issue for that.
author_association: MEMBER
user: login: FifthPotato
created_at: 2025-05-27T22:34:58Z
body: Squished. Super ugly rebase, so I hope I didn't git wrong.
author_association: CONTRIBUTOR
user: login: trel
created_at: 2025-05-27T23:35:47Z
body: looks pretty good to me.

please swap the last two commits, so the 2024->2025 commit is last..

then we can get the updated pdf merged into that same commit.
author_association: MEMBER
user: login: FifthPotato
created_at: 2025-05-28T03:10:09Z
body: > looks pretty good to me.
> 
> please swap the last two commits, so the 2024->2025 commit is last..
> 
> then we can get the updated pdf merged into that same commit.

Did the swap and removed the old pdf after building it. Did it work?
author_association: CONTRIBUTOR
user: login: trel
created_at: 2025-05-28T11:37:32Z
body: i still see the pdf being manipulated in the first commit.
author_association: MEMBER
user: login: FifthPotato
created_at: 2025-05-28T15:05:25Z
body: Ok, did some more git, rebased it onto main, rebuilt the pdf and merged the change into the last commit, and hopefully it's okay now?
author_association: CONTRIBUTOR
user: login: trel
created_at: 2025-05-28T15:19:18Z
body: the commits look clean now - yes - thanks.
author_association: MEMBER
user: login: trel
created_at: 2025-05-28T15:30:52Z
body: please # em.
author_association: MEMBER
user: login: FifthPotato
created_at: 2025-05-28T15:39:00Z
body: Many octothorpes applied.
author_association: CONTRIBUTOR
user: login: alanking
created_at: 2025-05-28T15:43:38Z
body: Please close linked issues as appropriate. Thanks
author_association: CONTRIBUTOR