This is an automated email from the ASF dual-hosted git repository.

zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 97bf213  Add/update documentation for content invalidation jobs in TO 
API v4 (#6342)
97bf213 is described below

commit 97bf21374f37b69b644befb4cdc1791e72264fd1
Author: ocket8888 <[email protected]>
AuthorDate: Mon Nov 15 14:31:04 2021 -0700

    Add/update documentation for content invalidation jobs in TO API v4 (#6342)
    
    * Add jobs overview section
    
    * Add styling for kbd elements in the docs
    
    * Create glossary term for jobs, link it everywhere
    
    I didn't worry too much about the APIv4 docs, since they'll need to be
    rebased anyway.
    
    * Fix incorrect plurality, broken tables
    
    * Fix rendering of keyboard key elements containing only whitespace
    
    * Simplify string formatting of new jobs, add Godocs and example/test
    
    * Add section links, missing TTL alias
    
    * Add a description of the new "semi-global" "refetch_enabled" Parameter
    
    * Update the v4 documentation for /jobs
    
    * Move admonition about HTTP caching support to the overview page
    
    * Update the "quick how-to" guide for content invalidation jobs
    
    * Fix rendering errors in TP 'using' section
    
    * Fix extraneous 'Content' and incorrect plurality
    
    * Fix 'term' role in response payload examples
    
    * Fix Asset URL labled immutable in the overview
    
    * Remove extraneous '.'
    
    * Remove stutter in model reference
    
    * Fix incorrect response example for v4/jobs
---
 docs/source/_static/theme_overrides.css            |  14 +
 .../admin/quick_howto/content_invalidation.rst     |  12 +-
 .../admin/quick_howto/content_invalidation/01.png  | Bin 42695 -> 155334 bytes
 .../admin/quick_howto/content_invalidation/03.png  | Bin 32869 -> 158245 bytes
 .../admin/quick_howto/content_invalidation/04.png  | Bin 0 -> 43711 bytes
 .../admin/traffic_portal/usingtrafficportal.rst    |  18 +-
 docs/source/api/v2/deliveryservices_request.rst    |   2 +-
 docs/source/api/v2/jobs.rst                        | 133 ++++----
 .../api/v2/servers_hostname_update_status.rst      |   8 +-
 docs/source/api/v3/deliveryservices_request.rst    |   2 +-
 docs/source/api/v3/jobs.rst                        | 129 ++++----
 .../api/v3/servers_hostname_update_status.rst      |   8 +-
 docs/source/api/v4/jobs.rst                        | 354 +++++++++------------
 .../api/v4/servers_hostname_update_status.rst      |   8 +-
 docs/source/glossary.rst                           |   8 +
 docs/source/overview/delivery_service_requests.rst |   1 +
 docs/source/overview/jobs.rst                      | 137 ++++++++
 docs/source/overview/profiles_and_parameters.rst   |  24 +-
 docs/source/tools/atstccfg.rst                     |   2 +-
 lib/go-tc/invalidationjobs.go                      |  24 +-
 lib/go-tc/invalidationjobs_test.go                 |  17 +
 21 files changed, 531 insertions(+), 370 deletions(-)

diff --git a/docs/source/_static/theme_overrides.css 
b/docs/source/_static/theme_overrides.css
index ebdf46e..c71faea 100644
--- a/docs/source/_static/theme_overrides.css
+++ b/docs/source/_static/theme_overrides.css
@@ -99,3 +99,17 @@ ul, ol, ul > li, ol > li {
 ul > li > p, ol > li > p {
        margin: 0;
 }
+
+kbd {
+       display: inline-block;
+       padding: 4px 5px;
+       font: smaller ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, 
Liberation Mono, monospace;
+       line-height: 10px;
+       vertical-align: middle;
+       background-color: white;
+       border: solid 1px rgba(99,110,123,0.4);
+       border-radius: 6px;
+       box-shadow: inset 0 -1px 0 rgba(99,110,123,0.4);
+       min-height: 1.5em;
+       min-width: 1.2em;
+}
diff --git a/docs/source/admin/quick_howto/content_invalidation.rst 
b/docs/source/admin/quick_howto/content_invalidation.rst
index 7e5061c..cb8270c 100644
--- a/docs/source/admin/quick_howto/content_invalidation.rst
+++ b/docs/source/admin/quick_howto/content_invalidation.rst
@@ -22,8 +22,6 @@ Invalidating content on the CDN is sometimes necessary when 
the :term:`Origin` w
 
 .. impl-detail:: Given the size of a typical Traffic Control CDN and the 
amount of content that can be cached in it, removing the content from all the 
caches may take a long time. To speed up content invalidation, Traffic Control 
does not try to remove the content from the caches, but it makes the content 
inaccessible using the `regex_revalidate plugin for Apache Traffic Server 
<https://docs.trafficserver.apache.org/en/8.0.x/admin-guide/plugins/regex_revalidate.en.html>`_.
 This forces a  [...]
 
-.. Warning:: This method forces :term:`cache servers` to "re-validate" 
content, so in order to work properly the :term:`Origin` needs to support 
revalidation according to section 4.3.2 of :rfc:`7234`.
-
 To invalidate content for a specific :term:`Delivery Service`, follow these 
steps:
 
 #. Select the desired :term:`Delivery Service` from the 
:ref:`tp-services-delivery-service` view of Traffic Portal
@@ -42,10 +40,18 @@ To invalidate content for a specific :term:`Delivery 
Service`, follow these step
 
                Select 'Manage Invalidation Requests'
 
-#. Click/tap on the :guilabel:`+` button to open the submission form for a new 
content invalidation. Fill out this form. The "Path Regex" field should be a 
`PCRE <http://www.pcre.org/>`_-compatible regular expression that matches all 
content that must be invalidated - and should **not** match any content that 
must *not* be invalidated. "TTL (hours)" specifies the number of hours for 
which the invalidation should remain active. Best practice is to set this to 
the same as the content's cac [...]
+#. From the :guilabel:`More` drop-down menu on this page, select 
:menuselection:`Create Invalidation Request`
 
        .. figure:: content_invalidation/03.png
                :align: center
+               :alt: The 'Create Invalidation Request' option under 'More'
+
+               Select 'Create Invalidation Request'
+
+#. Fill out this form. The "Path Regex" field should be a `PCRE 
<http://www.pcre.org/>`_-compatible regular expression that matches all content 
that must be invalidated - and should **not** match any content that must *not* 
be invalidated. "TTL (hours)" specifies the number of hours for which the 
invalidation should remain active. Best practice is to set this to the same as 
the content's cache lifetime (typically set in the :term:`Origin`'s 
``Cache-Control`` response header). :ref:`job-i [...]
+
+       .. figure:: content_invalidation/04.png
+               :align: center
                :alt: The new content invalidation submission form
 
                The 'new content invalidation submission' Form
diff --git a/docs/source/admin/quick_howto/content_invalidation/01.png 
b/docs/source/admin/quick_howto/content_invalidation/01.png
index d0b94e2..fb11981 100644
Binary files a/docs/source/admin/quick_howto/content_invalidation/01.png and 
b/docs/source/admin/quick_howto/content_invalidation/01.png differ
diff --git a/docs/source/admin/quick_howto/content_invalidation/03.png 
b/docs/source/admin/quick_howto/content_invalidation/03.png
index 83d8935..098349a 100644
Binary files a/docs/source/admin/quick_howto/content_invalidation/03.png and 
b/docs/source/admin/quick_howto/content_invalidation/03.png differ
diff --git a/docs/source/admin/quick_howto/content_invalidation/04.png 
b/docs/source/admin/quick_howto/content_invalidation/04.png
new file mode 100644
index 0000000..40862b6
Binary files /dev/null and 
b/docs/source/admin/quick_howto/content_invalidation/04.png differ
diff --git a/docs/source/admin/traffic_portal/usingtrafficportal.rst 
b/docs/source/admin/traffic_portal/usingtrafficportal.rst
index 2858c94..f0adce7 100644
--- a/docs/source/admin/traffic_portal/usingtrafficportal.rst
+++ b/docs/source/admin/traffic_portal/usingtrafficportal.rst
@@ -645,21 +645,23 @@ Tools
 
 Invalidate Content
 ------------------
-Here, specific assets can be invalidated in all caches of a :term:`Delivery 
Service`, forcing content to be updated from the origin. Specifically, this 
*doesn't* mean that :term:`cache servers` will immediately remove items from 
their caches, but rather will fetch new copies whenever a request is made 
matching the 'Asset URL' regular expression. This behavior persists until the 
Invalidate Content Job's :abbr:`TTL (Time To Live)` expires.
+Here, specific assets can be invalidated in all caches of a :term:`Delivery 
Service`, forcing content to be updated from the origin. Specifically, this 
*doesn't* mean that :term:`cache servers` will immediately remove items from 
their caches, but rather will fetch new copies whenever a request is made 
matching the 'Asset URL' regular expression. This behavior persists until the 
:term:`Content Invalidation Job`'s :ref:`job-ttl` expires.
 
-.. Warning:: This method forces :term:`cache servers` to "re-validate" 
content, so in order to work properly the :term:`Origin` needs to support 
revalidation according to section 4.3.2 of :rfc:`7234`.
+.. warning:: This method forces :term:`cache servers` to "re-validate" 
content, so in order to work properly the :term:`Origin` needs to support 
revalidation according to section 4.3.2 of :rfc:`7234`.
 
 Each entry in the table on this page has the following fields:
 
-:term:`Delivery Service`: The :term:`Delivery Service` to which to apply this 
Invalidate Content Job
-:Asset URL:        A URL or regular expression which describes the asset(s) to 
be invalidated
-:Parameters:       So far, the only use for this is setting a :abbr:`TTL (Time 
To Live)` over which the Invalidate Content Job shall remain active
-:Start:            An effective start time until which the job is delayed
-:Created By:       The user name of the person who created this Invalidate 
Content Job
+:Delivery Service:  The :term:`Delivery Service` to which to apply this 
:term:`Content Invalidation Job`
+:Asset URL:         A URL or regular expression which describes the asset(s) 
to be invalidated
+:TTL (Hours):       A :abbr:`TTL (Time To Live)` (as a number of hours) over 
which the :term:`Content Invalidation Job` shall remain active
+:Start:             An effective start time until which the :term:`job` is 
delayed
+:Expires:           The date/time at which the :term:`Content Invalidation 
Job` will end (effectively "Start" plus "TTL (Hours)")
+:Created By:        The user name of the person who created this 
:term:`Content Invalidation Job`
+:Invalidation Type: The :ref:`job-invalidation-type` of this :term:`Content 
Invalidation Job`
 
 Invalidate content includes the ability to (where applicable):
 
-- create a new invalidate content job
+- create a new :term:`Content Invalidation Job`
 
 .. _tp-tools-generate-iso:
 
diff --git a/docs/source/api/v2/deliveryservices_request.rst 
b/docs/source/api/v2/deliveryservices_request.rst
index 05d91b9..c9a372d 100644
--- a/docs/source/api/v2/deliveryservices_request.rst
+++ b/docs/source/api/v2/deliveryservices_request.rst
@@ -36,7 +36,7 @@ Request Structure
 -----------------
 :details: An object describing the actual parameters for the Delivery Service 
request
 
-       :customer: Name of the customer associated with the :term:`Delivery 
Service` - must only contain alphanumeric characters and the characters 
:kbd:`@`, :kbd:`!`, :kbd:`#`, :kbd:`$`, :kbd:`%`, :kbd:`^`, :kbd:`&`, :kbd:`*`, 
:kbd:`(`, :kbd:`)`, :kbd:`[`, :kbd:`]`, :kbd:`.`, :kbd:` `, and :kbd:`-`
+       :customer: Name of the customer associated with the :term:`Delivery 
Service` - must only contain alphanumeric characters and the characters 
:kbd:`@`, :kbd:`!`, :kbd:`#`, :kbd:`$`, :kbd:`%`, :kbd:`^`, :kbd:`&`, :kbd:`*`, 
:kbd:`(`, :kbd:`)`, :kbd:`[`, :kbd:`]`, :kbd:`.`, :kbd:`\ `, and :kbd:`-`
 
                .. versionchanged:: ATCv6
                        Prior to ATC version 6, this field had no restrictions.
diff --git a/docs/source/api/v2/jobs.rst b/docs/source/api/v2/jobs.rst
index 58bcea5..487996b 100644
--- a/docs/source/api/v2/jobs.rst
+++ b/docs/source/api/v2/jobs.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Retrieve content invalidation jobs.
+Retrieve :term:`Content Invalidation Jobs`.
 
 :Auth. Required: Yes
 :Roles Required: None\ [#tenancy]_
@@ -34,23 +34,24 @@ Request Structure
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Name                 | Required | Description                         
                                                                                
                                             |
        
+======================+==========+==================================================================================================================================================================+
-       | assetUrl             | no       | Return only invalidation jobs that 
operate on URLs by matching this regular expression                             
                                              |
+       | assetUrl             | no       | Return only :term:`Content 
Invalidation Jobs` that operate on URLs by matching this regular expression     
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | cdn                  | no       | Return only invalidation jobs for 
delivery services with this CDN name                                            
                                               |
+       | cdn                  | no       | Return only :term:`Content 
Invalidation Jobs` for delivery services with this CDN name                     
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | createdBy            | no       | Return only invalidation jobs that 
were created by the user with this username                                     
                                              |
+       | createdBy            | no       | Return only :term:`Content 
Invalidation Jobs` that were created by the user with this username             
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | deliveryService      | no       | Return only invalidation jobs that 
operate on the :term:`Delivery Service` with this :ref:`ds-xmlid`               
                                              |
+       | deliveryService      | no       | Return only :term:`Content 
Invalidation Jobs` that operate on the :term:`Delivery Service` with this 
:ref:`ds-xmlid`                                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | dsId                 | no       | Return only invalidation jobs 
pending on the :term:`Delivery Service` identified by this integral, unique 
identifier                                             |
+       | dsId                 | no       | Return only :term:`Content 
Invalidation Jobs` pending on the :term:`Delivery Service` identified by this 
integral, unique identifier                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | id                   | no       | Return only the single invalidation 
job identified by this integral, unique identifer                               
                                             |
+       | id                   | no       | Return only the single 
:term:`Content Invalidation Job` identified by this integral, unique identifer  
                                                          |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | keyword              | no       | Return only invalidation jobs that 
have this "keyword" - only "PURGE" should exist                                 
                                              |
+       | keyword              | no       | Return only :term:`Content 
Invalidation Jobs` that have this "keyword" - only "PURGE" should exist         
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | maxRevalDurationDays | no       | Return only invalidation jobs with 
a startTime that is within the window defined by the ``maxRevalDurationDays`` 
:term:`Parameter` in :ref:`the-global-profile`  |
+       | maxRevalDurationDays | no       | Return only :term:`Content 
Invalidation Jobs` with a startTime that is within the window defined by the 
``maxRevalDurationDays`` :term:`Parameter` in            |
+       |                      |          | :ref:`the-global-profile`           
                                                                                
                                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | userId               | no       | Return only invalidation jobs 
created by the user identified by this integral, unique identifier              
                                                   |
+       | userId               | no       | Return only :term:`Content 
Invalidation Jobs` created by the user identified by this integral, unique 
identifier                                                 |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
 
@@ -68,16 +69,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`job` operates
+:id:              An integral, unique identifier for this :term:`job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`job` will prevent caching of URLs matching the 
``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`job` - currently only uses Time to Live e.g. 
``"TTL:48h"``
+:startTime:  The date and time at which the :term:`job` began, in a 
non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -108,9 +109,9 @@ Response Structure
 
 ``POST``
 ========
-Creates a new content invalidation job.
+Creates a new :term:`Content Invalidation Job`.
 
-.. caution:: Creating a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Creating a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -121,7 +122,7 @@ Request Structure
 :deliveryService: This should either be the integral, unique identifier of a 
:term:`Delivery Service`, or a string containing an :ref:`ds-xmlid`
 :startTime: This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` format, 
or a string in :rfc:`3339` format, or a string representing a date in the same 
non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This date must be in the future.
 :regex: A regular expression that will be used to match the path part of URIs 
for content stored on :term:`cache servers` that service traffic for the 
:term:`Delivery Service` identified by ``deliveryService``.
-:ttl: Either the number of hours for which the content invalidation job should 
remain active, or a "duration" string, which is a sequence of numbers followed 
by units. The accepted units are:
+:ttl: Either the number of hours for which the :term:`Content Invalidation 
Job` should remain active, or a "duration" string, which is a sequence of 
numbers followed by units. The accepted units are:
 
        - ``h`` gives a duration in hours
        - ``m`` gives a duration in minutes
@@ -155,16 +156,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`job` operates
+:id:              An integral, unique identifier for this :term:`job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`job` will prevent caching of URLs matching the 
``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`job` - currently only uses Time to Live e.g. 
``"TTL:48h"``
+:startTime:  The date and time at which the :term:`job` began, in a 
non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -204,9 +205,9 @@ Response Structure
 
 ``PUT``
 =======
-Replaces an existing content invalidation job with a new one provided in the 
request. This method of editing a content invalidation job does not prevent the 
requesting user from changing fields that normally only have one value. Use 
with care.
+Replaces an existing :term:`Content Invalidation Job` with a new one provided 
in the request. This method of editing a :term:`Content Invalidation Job` does 
not prevent the requesting user from changing fields that normally only have 
one value. Use with care.
 
-.. caution:: Modifying a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Pa [...]
+.. caution:: Modifying a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the  [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -216,25 +217,25 @@ Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
 :assetUrl: A regular expression - matching URLs will be operated upon 
according to ``keyword``
 
        .. note:: Unlike in the payloads of POST_ requests to this endpoint, 
this must be a **full** URL regular expression, as it is **not** combined with 
the :ref:`ds-origin-url` of the :term:`Delivery Service` identified by 
``deliveryService``.
 
-:createdBy:       The username of the user who initiated the job\ [#readonly]_
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates\ [#readonly]_ - unlike POST_ request payloads, this cannot be 
an integral, unique identifier
-:id:              An integral, unique identifier for this job\ [#readonly]_
-:keyword:         A keyword that represents the operation being performed by 
the job. It can have any (string) value, but the only value with any meaning to 
Traffic Control is:
+:createdBy:       The username of the user who initiated the :term:`job`\ 
[#readonly]_
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`job` operates\ [#readonly]_ - unlike POST_ request payloads, this 
cannot be an integral, unique identifier
+:id:              An integral, unique identifier for this :term:`job`\ 
[#readonly]_
+:keyword:         A keyword that represents the operation being performed by 
the :term:`job`. It can have any (string) value, but the only value with any 
meaning to Traffic Control is:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`job` will prevent caching of URLs matching the 
``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing space-separated key/value pairs - delimited 
by colons (:kbd:`:`\ s) representing parameters associated with the job. In 
practice, any string can be passed as a job's ``parameters``, but the only 
value with meaning is a single key/value pair indicated a :abbr:`TTL (Time To 
Live)` in hours in the format :file:`TTL:{hours}h`, and any other type of value 
may cause components of Traffic Control to work improperly or not at all.
+:parameters: A string containing space-separated key/value pairs - delimited 
by colons (:kbd:`:`\ s) representing parameters associated with the 
:term:`job`. In practice, any string can be passed as a :term:`job`'s 
``parameters``, but the only value with meaning is a single key/value pair 
indicated a :abbr:`TTL (Time To Live)` in hours in the format 
:file:`TTL:{hours}h`, and any other type of value may cause components of 
Traffic Control to work improperly or not at all.
 :startTime:  This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` 
format, or a string in :rfc:`3339` format, or a string representing a date in 
the same non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This **must** be in the future, but 
only by no more than two days.
 
 .. code-block:: http
@@ -263,16 +264,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`job` operates
+:id:              An integral, unique identifier for this :term:`job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`job` will prevent caching of URLs matching the 
``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`job` - currently only uses Time to Live e.g. 
``"TTL:48h"``
+:startTime:  The date and time at which the :term:`job` began, in a 
non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -291,7 +292,7 @@ Response Structure
        Content-Length: 234
 
        { "alerts": [{
-               "text": "Content invalidation job updated",
+               "text": "job updated",
                "level": "success"
        }],
        "response": {
@@ -307,11 +308,11 @@ Response Structure
 
 ``DELETE``
 ==========
-Deletes a content invalidation job.
+Deletes a :term:`Content Invalidation Job`.
 
-.. tip:: Content invalidation jobs that have passed their :abbr:`TTL (Time To 
Live)` are not automatically deleted - for record-keeping purposes - so use 
this to clean up old jobs that are no longer useful.
+.. tip:: :term:`Content Invalidation Jobs` that have passed their :abbr:`TTL 
(Time To Live)` are not automatically deleted - for record-keeping purposes - 
so use this to clean up old :term:`jobs` that are no longer useful.
 
-.. caution:: Deleting a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Deleting a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -321,11 +322,11 @@ Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
 .. code-block:: http
        :caption: Request Example
@@ -342,16 +343,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`job` operates
+:id:              An integral, unique identifier for this :term:`job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`job` will prevent caching of URLs matching the 
``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`job` - currently only uses Time to Live e.g. 
``"TTL:48h"``
+:startTime:  The date and time at which the :term:`job` began, in a 
non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -371,7 +372,7 @@ Response Structure
 
        { "alerts": [
                {
-                       "text": "Content invalidation job was deleted",
+                       "text": "job was deleted",
                        "level": "success"
                }
        ],
@@ -386,5 +387,5 @@ Response Structure
        }}
 
 
-.. [#tenancy] When viewing content invalidation jobs, only those jobs that 
operate on a :term:`Delivery Service` visible to the requesting user's 
:term:`Tenant` will be returned. Likewise, creating a new content invalidation 
job requires that the target :term:`Delivery Service` is modifiable by the 
requesting user's :term:`Tenant`. However, when modifying or deleting an 
existing content invalidation job, the operation can be completed if and only 
if the requesting user's :term:`Tenant` i [...]
-.. [#readonly] This field must exist, but it must *not* be different than the 
same field of the existing job (i.e. as seen in a GET_ response)
+.. [#tenancy] When viewing :term:`Content Invalidation Jobs`, only those jobs 
that operate on a :term:`Delivery Service` visible to the requesting user's 
:term:`Tenant` will be returned. Likewise, creating a new :term:`Content 
Invalidation Jobs` requires that the target :term:`Delivery Service` is 
modifiable by the requesting user's :term:`Tenant`. However, when modifying or 
deleting an existing :term:`Content Invalidation Jobs`, the operation can be 
completed if and only if the requesti [...]
+.. [#readonly] This field must exist, but it must *not* be different than the 
same field of the existing :term:`job` (i.e. as seen in a GET_ response)
diff --git a/docs/source/api/v2/servers_hostname_update_status.rst 
b/docs/source/api/v2/servers_hostname_update_status.rst
index 8324298..ea08b17 100644
--- a/docs/source/api/v2/servers_hostname_update_status.rst
+++ b/docs/source/api/v2/servers_hostname_update_status.rst
@@ -23,7 +23,7 @@
 
 ``GET``
 =======
-Retrieves information regarding pending updates and revalidation jobs for a 
given server
+Retrieves information regarding pending updates and :term:`Content 
Invalidation Jobs` for a given server
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -55,14 +55,14 @@ Each object in the returned array\ [1]_ will contain the 
following fields:
 :host_id:              The integral, unique identifier for the server for 
which the other fields in this object represent the pending updates and 
revalidation status
 :host_name:            The (short) hostname of the server for which the other 
fields in this object represent the pending updates and revalidation status
 :parent_pending:       A boolean telling whether or not the :term:`parents` of 
this server have pending updates
-:parent_reval_pending: A boolean telling whether or not the :term:`parents` of 
this server have pending revalidation jobs
-:reval_pending:        ``true`` if the server has pending revalidation jobs, 
``false`` otherwise
+:parent_reval_pending: A boolean telling whether or not the :term:`parents` of 
this server have pending :term:`Content Invalidation Jobs`
+:reval_pending:        ``true`` if the server has pending :term:`Content 
Invalidation Jobs`, ``false`` otherwise
 :status:               The name of the status of this server
 
        .. seealso:: :ref:`health-proto` gives more information on how these 
statuses are used, and the ``GET`` method of the :ref:`to-api-statuses` 
endpoint can be used to retrieve information about all server statuses 
configured in Traffic Ops.
 
 :upd_pending:       ``true`` if the server has pending updates, ``false`` 
otherwise
-:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending revalidation jobs
+:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending :term:`Content Invalidation Jobs`
 
        .. note:: This field was introduced to give :term:`ORT` the ability to 
work with Traffic Control versions 1.x and 2.x seamlessly - as of Traffic 
Control v3.0 there is no reason for this field to ever be ``false``.
 
diff --git a/docs/source/api/v3/deliveryservices_request.rst 
b/docs/source/api/v3/deliveryservices_request.rst
index d00bac1..f0f1a7d 100644
--- a/docs/source/api/v3/deliveryservices_request.rst
+++ b/docs/source/api/v3/deliveryservices_request.rst
@@ -36,7 +36,7 @@ Request Structure
 -----------------
 :details: An object describing the actual parameters for the Delivery Service 
request
 
-       :customer: Name of the customer associated with the :term:`Delivery 
Service` - must only contain alphanumeric characters and the characters 
:kbd:`@`, :kbd:`!`, :kbd:`#`, :kbd:`$`, :kbd:`%`, :kbd:`^`, :kbd:`&`, :kbd:`*`, 
:kbd:`(`, :kbd:`)`, :kbd:`[`, :kbd:`]`, :kbd:`.`, :kbd:` `, and :kbd:`-`
+       :customer: Name of the customer associated with the :term:`Delivery 
Service` - must only contain alphanumeric characters and the characters 
:kbd:`@`, :kbd:`!`, :kbd:`#`, :kbd:`$`, :kbd:`%`, :kbd:`^`, :kbd:`&`, :kbd:`*`, 
:kbd:`(`, :kbd:`)`, :kbd:`[`, :kbd:`]`, :kbd:`.`, :kbd:`\ `, and :kbd:`-`
 
        .. versionchanged:: ATCv6
                Prior to ATC version 6, this field had no restrictions.
diff --git a/docs/source/api/v3/jobs.rst b/docs/source/api/v3/jobs.rst
index f5e7b02..46cafaa 100644
--- a/docs/source/api/v3/jobs.rst
+++ b/docs/source/api/v3/jobs.rst
@@ -21,7 +21,7 @@
 
 ``GET``
 =======
-Retrieve content invalidation jobs.
+Retrieve :term:`Content Invalidation Jobs`.
 
 :Auth. Required: Yes
 :Roles Required: None\ [#tenancy]_
@@ -34,23 +34,24 @@ Request Structure
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
        | Name                 | Required | Description                         
                                                                                
                                             |
        
+======================+==========+==================================================================================================================================================================+
-       | assetUrl             | no       | Return only invalidation jobs that 
operate on URLs by matching this regular expression                             
                                              |
+       | assetUrl             | no       | Return only :term:`Content 
Invalidation Jobs` that operate on URLs by matching this regular expression     
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | cdn                  | no       | Return only invalidation jobs for 
delivery services with this CDN name                                            
                                               |
+       | cdn                  | no       | Return only :term:`Content 
Invalidation Jobs` for delivery services with this CDN name                     
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | createdBy            | no       | Return only invalidation jobs that 
were created by the user with this username                                     
                                              |
+       | createdBy            | no       | Return only :term:`Content 
Invalidation Jobs` that were created by the user with this username             
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | deliveryService      | no       | Return only invalidation jobs that 
operate on the :term:`Delivery Service` with this :ref:`ds-xmlid`               
                                              |
+       | deliveryService      | no       | Return only :term:`Content 
Invalidation Jobs` that operate on the :term:`Delivery Service` with this 
:ref:`ds-xmlid`                                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | dsId                 | no       | Return only invalidation jobs 
pending on the :term:`Delivery Service` identified by this integral, unique 
identifier                                             |
+       | dsId                 | no       | Return only :term:`Content 
Invalidation Jobs` pending on the :term:`Delivery Service` identified by this 
integral, unique identifier                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | id                   | no       | Return only the single invalidation 
job identified by this integral, unique identifer                               
                                             |
+       | id                   | no       | Return only the single invalidation 
:term:`Content Invalidation Job` identified by this integral, unique identifer  
                                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | keyword              | no       | Return only invalidation jobs that 
have this "keyword" - only "PURGE" should exist                                 
                                              |
+       | keyword              | no       | Return only :term:`Content 
Invalidation Jobs` that have this "keyword" - only "PURGE" should exist         
                                                      |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | maxRevalDurationDays | no       | Return only invalidation jobs with 
a startTime that is within the window defined by the ``maxRevalDurationDays`` 
:term:`Parameter` in :ref:`the-global-profile`  |
+       | maxRevalDurationDays | no       | Return only :term:`Content 
Invalidation Jobs` with a startTime that is within the window defined by the 
``maxRevalDurationDays`` :term:`Parameter` in            |
+       |                      |          | :ref:`the-global-profile`           
                                                                                
                                             |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | userId               | no       | Return only invalidation jobs 
created by the user identified by this integral, unique identifier              
                                                   |
+       | userId               | no       | Return only :term:`Content 
Invalidation Jobs` created by the user identified by this integral, unique 
identifier                                                 |
        
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
 
@@ -68,16 +69,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`Content 
Invalidation Job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`Content Invalidation Job` operates
+:id:              An integral, unique identifier for this :term:`Content 
Invalidation Job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`Content Invalidation Job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`Content Invalidation Job` will prevent caching of 
URLs matching the ``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`Content Invalidation Job` - currently only uses Time 
to Live e.g. ``"TTL:48h"``
+:startTime:  The date and time at which the :term:`Content Invalidation Job` 
began, in a non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -108,9 +109,9 @@ Response Structure
 
 ``POST``
 ========
-Creates a new content invalidation job.
+Creates a new :term:`Content Invalidation Job`.
 
-.. caution:: Creating a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Creating a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -121,7 +122,7 @@ Request Structure
 :deliveryService: This should either be the integral, unique identifier of a 
:term:`Delivery Service`, or a string containing an :ref:`ds-xmlid`
 :startTime: This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` format, 
or a string in :rfc:`3339` format, or a string representing a date in the same 
non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This date must be in the future.
 :regex: A regular expression that will be used to match the path part of URIs 
for content stored on :term:`cache servers` that service traffic for the 
:term:`Delivery Service` identified by ``deliveryService``.
-:ttl: Either the number of hours for which the content invalidation job should 
remain active, or a "duration" string, which is a sequence of numbers followed 
by units. The accepted units are:
+:ttl: Either the number of hours for which the :term:`Content Invalidation 
Job` should remain active, or a "duration" string, which is a sequence of 
numbers followed by units. The accepted units are:
 
        - ``h`` gives a duration in hours
        - ``m`` gives a duration in minutes
@@ -155,16 +156,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`Content 
Invalidation Job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`Content Invalidation Job` operates
+:id:              An integral, unique identifier for this :term:`Content 
Invalidation Job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`Content Invalidation Job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`Content Invalidation Job` will prevent caching of 
URLs matching the ``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`Content Invalidation Job` - currently only uses Time 
to Live e.g. ``"TTL:48h"``
+:startTime:  The date and time at which the :term:`Content Invalidation Job` 
began, in a non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -204,9 +205,9 @@ Response Structure
 
 ``PUT``
 =======
-Replaces an existing content invalidation job with a new one provided in the 
request. This method of editing a content invalidation job does not prevent the 
requesting user from changing fields that normally only have one value. Use 
with care.
+Replaces an existing :term:`Content Invalidation Job` with a new one provided 
in the request. This method of editing a :term:`Content Invalidation Job` does 
not prevent the requesting user from changing fields that normally only have 
one value. Use with care.
 
-.. caution:: Modifying a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Pa [...]
+.. caution:: Modifying a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the  [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -216,25 +217,25 @@ Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
 :assetUrl: A regular expression - matching URLs will be operated upon 
according to ``keyword``
 
        .. note:: Unlike in the payloads of POST_ requests to this endpoint, 
this must be a **full** URL regular expression, as it is **not** combined with 
the :ref:`ds-origin-url` of the :term:`Delivery Service` identified by 
``deliveryService``.
 
-:createdBy:       The username of the user who initiated the job\ [#readonly]_
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates\ [#readonly]_ - unlike POST_ request payloads, this cannot be 
an integral, unique identifier
-:id:              An integral, unique identifier for this job\ [#readonly]_
-:keyword:         A keyword that represents the operation being performed by 
the job. It can have any (string) value, but the only value with any meaning to 
Traffic Control is:
+:createdBy:       The username of the user who initiated the :term:`Content 
Invalidation Job`\ [#readonly]_
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`Content Invalidation Job` operates\ [#readonly]_ - unlike POST_ 
request payloads, this cannot be an integral, unique identifier
+:id:              An integral, unique identifier for this :term:`Content 
Invalidation Job`\ [#readonly]_
+:keyword:         A keyword that represents the operation being performed by 
the :term:`Content Invalidation Job`. It can have any (string) value, but the 
only value with any meaning to Traffic Control is:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`Content Invalidation Job` will prevent caching of 
URLs matching the ``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing space-separated key/value pairs - delimited 
by colons (:kbd:`:`\ s) representing parameters associated with the job. In 
practice, any string can be passed as a job's ``parameters``, but the only 
value with meaning is a single key/value pair indicated a :abbr:`TTL (Time To 
Live)` in hours in the format :file:`TTL:{hours}h`, and any other type of value 
may cause components of Traffic Control to work improperly or not at all.
+:parameters: A string containing space-separated key/value pairs - delimited 
by colons (:kbd:`:`\ s) representing parameters associated with the 
:term:`Content Invalidation Job`. In practice, any string can be passed as a 
:term:`Content Invalidation Job`'s ``parameters``, but the only value with 
meaning is a single key/value pair indicated a :abbr:`TTL (Time To Live)` in 
hours in the format :file:`TTL:{hours}h`, and any other type of value may cause 
components of Traffic Control to work  [...]
 :startTime:  This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` 
format, or a string in :rfc:`3339` format, or a string representing a date in 
the same non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This **must** be in the future, but 
only by no more than two days.
 
 .. code-block:: http
@@ -263,16 +264,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`Content 
Invalidation Job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`Content Invalidation Job` operates
+:id:              An integral, unique identifier for this :term:`Content 
Invalidation Job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`Content Invalidation Job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`Content Invalidation Job` will prevent caching of 
URLs matching the ``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`Content Invalidation Job` - currently only uses Time 
to Live e.g. ``"TTL:48h"``
+:startTime:  The date and time at which the :term:`Content Invalidation Job` 
began, in a non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -307,11 +308,11 @@ Response Structure
 
 ``DELETE``
 ==========
-Deletes a content invalidation job.
+Deletes a :term:`Content Invalidation Job`.
 
-.. tip:: Content invalidation jobs that have passed their :abbr:`TTL (Time To 
Live)` are not automatically deleted - for record-keeping purposes - so use 
this to clean up old jobs that are no longer useful.
+.. tip:: Content :term:`Content Invalidation Jobs` that have passed their 
:abbr:`TTL (Time To Live)` are not automatically deleted - for record-keeping 
purposes - so use this to clean up old :term:`jobs` that are no longer useful.
 
-.. caution:: Deleting a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Deleting a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
 :Auth. Required: Yes
 :Roles Required: "operations" or "admin"\ [#tenancy]_
@@ -321,11 +322,11 @@ Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
 .. code-block:: http
        :caption: Request Example
@@ -342,16 +343,16 @@ Request Structure
 Response Structure
 ------------------
 :assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
+:createdBy:       The username of the user who initiated the :term:`Content 
Invalidation Job`
+:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this :term:`Content Invalidation Job` operates
+:id:              An integral, unique identifier for this :term:`Content 
Invalidation Job`
+:keyword:         A keyword that represents the operation being performed by 
the :term:`Content Invalidation Job`:
 
        PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+               This :term:`Content Invalidation Job` will prevent caching of 
URLs matching the ``assetUrl`` until it is removed (or its Time to Live expires)
 
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:parameters: A string containing key/value pairs representing parameters 
associated with the :term:`Content Invalidation Job` - currently only uses Time 
to Live e.g. ``"TTL:48h"``
+:startTime:  The date and time at which the :term:`Content Invalidation Job` 
began, in a non-standard format
 
 .. code-block:: http
        :caption: Response Example
@@ -386,5 +387,5 @@ Response Structure
        }}
 
 
-.. [#tenancy] When viewing content invalidation jobs, only those jobs that 
operate on a :term:`Delivery Service` visible to the requesting user's 
:term:`Tenant` will be returned. Likewise, creating a new content invalidation 
job requires that the target :term:`Delivery Service` is modifiable by the 
requesting user's :term:`Tenant`. However, when modifying or deleting an 
existing content invalidation job, the operation can be completed if and only 
if the requesting user's :term:`Tenant` i [...]
-.. [#readonly] This field must exist, but it must *not* be different than the 
same field of the existing job (i.e. as seen in a GET_ response)
+.. [#tenancy] When viewing :term:`Content Invalidation Jobs`, only those 
:term:`jobs` that operate on a :term:`Delivery Service` visible to the 
requesting user's :term:`Tenant` will be returned. Likewise, creating a new 
:term:`Content Invalidation Jobs` requires that the target :term:`Delivery 
Service` is modifiable by the requesting user's :term:`Tenant`. However, when 
modifying or deleting an existing :term:`Content Invalidation Jobs`, the 
operation can be completed if and only if the  [...]
+.. [#readonly] This field must exist, but it must *not* be different than the 
same field of the existing :term:`Content Invalidation Job` (i.e. as seen in a 
GET_ response)
diff --git a/docs/source/api/v3/servers_hostname_update_status.rst 
b/docs/source/api/v3/servers_hostname_update_status.rst
index 3429cc9..8ef5755 100644
--- a/docs/source/api/v3/servers_hostname_update_status.rst
+++ b/docs/source/api/v3/servers_hostname_update_status.rst
@@ -23,7 +23,7 @@
 
 ``GET``
 =======
-Retrieves information regarding pending updates and revalidation jobs for a 
given server
+Retrieves information regarding pending updates and :term:`Content 
Invalidation Jobs` for a given server
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -55,14 +55,14 @@ Each object in the returned array\ [1]_ will contain the 
following fields:
 :host_id:              The integral, unique identifier for the server for 
which the other fields in this object represent the pending updates and 
revalidation status
 :host_name:            The (short) hostname of the server for which the other 
fields in this object represent the pending updates and revalidation status
 :parent_pending:       A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending updates
-:parent_reval_pending: A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending revalidation jobs
-:reval_pending:        ``true`` if the server has pending revalidation jobs, 
``false`` otherwise
+:parent_reval_pending: A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending :term:`Content 
Invalidation Jobs`
+:reval_pending:        ``true`` if the server has pending :term:`Content 
Invalidation Jobs`, ``false`` otherwise
 :status:               The name of the status of this server
 
        .. seealso:: :ref:`health-proto` gives more information on how these 
statuses are used, and the ``GET`` method of the :ref:`to-api-v3-statuses` 
endpoint can be used to retrieve information about all server statuses 
configured in Traffic Ops.
 
 :upd_pending:       ``true`` if the server has pending updates, ``false`` 
otherwise
-:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending revalidation jobs
+:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending :term:`Content Invalidation Jobs`
 
        .. note:: This field was introduced to give :term:`ORT` the ability to 
work with Traffic Control versions 1.x and 2.x seamlessly - as of Traffic 
Control v3.0 there is no reason for this field to ever be ``false``.
 
diff --git a/docs/source/api/v4/jobs.rst b/docs/source/api/v4/jobs.rst
index ed9f822..ed1eaee 100644
--- a/docs/source/api/v4/jobs.rst
+++ b/docs/source/api/v4/jobs.rst
@@ -21,44 +21,43 @@
 
 ``GET``
 =======
-Retrieve content invalidation jobs.
+Retrieve :term:`Content Invalidation Jobs`.
 
-:Auth. Required: Yes
-:Roles Required: None\ [#tenancy]_
-:Permissions Required: JOB:READ, DELIVERY-SERVICE:READ
-:Response Type:  Array
+:Auth. Required:       Yes
+:Roles Required:       None\ [#tenancy]_
+:Permissions Required: JOB:READ, DELIVERY-SERVICE:READ\ [#tenancy]_
+:Response Type:        Array
 
 Request Structure
 -----------------
 .. table:: Request Query Parameters
 
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | Name                 | Required | Description                         
                                                                                
                                             |
-       
+======================+==========+==================================================================================================================================================================+
-       | assetUrl             | no       | Return only invalidation jobs that 
operate on URLs by matching this regular expression                             
                                              |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | cdn                  | no       | Return only invalidation jobs for 
delivery services with this CDN name                                            
                                               |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | createdBy            | no       | Return only invalidation jobs that 
were created by the user with this username                                     
                                              |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | deliveryService      | no       | Return only invalidation jobs that 
operate on the :term:`Delivery Service` with this :ref:`ds-xmlid`               
                                              |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | dsId                 | no       | Return only invalidation jobs 
pending on the :term:`Delivery Service` identified by this integral, unique 
identifier                                             |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | id                   | no       | Return only the single invalidation 
job identified by this integral, unique identifer                               
                                             |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | keyword              | no       | Return only invalidation jobs that 
have this "keyword" - only "PURGE" should exist                                 
                                              |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | maxRevalDurationDays | no       | Return only invalidation jobs with 
a startTime that is within the window defined by the ``maxRevalDurationDays`` 
:term:`Parameter` in :ref:`the-global-profile`  |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-       | userId               | no       | Return only invalidation jobs 
created by the user identified by this integral, unique identifier              
                                                   |
-       
+----------------------+----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | Name                 | Required | Description                         
                                                                                
                 |
+       
+======================+==========+======================================================================================================================================+
+       | assetUrl             | no       | Return only :term:`Content 
Invalidation Jobs` with this :ref:`job-asset-url`                               
                          |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | cdn                  | no       | Return only :term:`Content 
Invalidation Jobs` for :term:`Delivery Services` within the CDN with this name  
                          |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | createdBy            | no       | Return only :term:`Content 
Invalidation Jobs` that were created by the user with this username             
                          |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | deliveryService      | no       | Return only :term:`Content 
Invalidation Jobs` that operate on the :term:`Delivery Service` with this 
:ref:`ds-xmlid`                 |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | dsId                 | no       | Return only :term:`Content 
Invalidation Jobs` pending on the :term:`Delivery Service` identified by this 
integral, unique identifier |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | id                   | no       | Return only the single 
:term:`Content Invalidation Job` with this :ref:`job-id`                        
                              |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | maxRevalDurationDays | no       | Return only :term:`Content 
Invalidation Jobs` with a :ref:`job-start-time` that is within the window 
defined by the                  |
+       |                      |          | ``maxRevalDurationDays`` 
:term:`Parameter` in :ref:`the-global-profile`                                  
                            |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
+       | userId               | no       | Return only :term:`Content 
Invalidation Jobs` created by the user identified by this integral, unique 
identifier                     |
+       
+----------------------+----------+--------------------------------------------------------------------------------------------------------------------------------------+
 
 
 .. code-block:: http
        :caption: Request Example
 
-       GET /api/4.0/jobs?id=3&dsId=1&userId=2 HTTP/1.1
+       GET /api/4.0/jobs?id=1&dsId=1&userId=2 HTTP/1.1
        Host: trafficops.infra.ciab.test
        User-Agent: python-requests/2.20.1
        Accept-Encoding: gzip, deflate
@@ -84,294 +83,259 @@ Response Structure
        :caption: Response Example
 
        HTTP/1.1 200 OK
-       Access-Control-Allow-Credentials: true
-       Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, 
Accept, Set-Cookie, Cookie
-       Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
-       Access-Control-Allow-Origin: *
        Content-Encoding: gzip
        Content-Type: application/json
-       Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 
GMT; Max-Age=3600; HttpOnly
-       Whole-Content-Sha512: 
gH41oEi2zrd3y8yo+wfohn4/oHU098RpyPnqBzU7HlLUDkMOPKjAZnamcYqfdy7yDCFDUcgqkvbFAvnljxyb8w==
+       Permissions-Policy: interest-cohort=()
+       Set-Cookie: mojolicious=...
+       Vary: Accept-Encoding
        X-Server-Name: traffic_ops_golang/
-       Date: Tue, 18 Jun 2019 19:47:30 GMT
-       Content-Length: 186
+       Date: Fri, 12 Nov 2021 19:30:36 GMT
+       Content-Length: 206
 
        { "response": [{
-               "assetUrl": "http://origin.infra.ciab.test/.*";,
+               "id": 1,
+               "assetUrl": "http://origin.infra.ciab.test/.+";,
                "createdBy": "admin",
                "deliveryService": "demo1",
-               "id": 3,
-               "keyword": "PURGE",
-               "parameters": "TTL:2h",
-               "startTime": "2019-06-18 21:28:31+00"
+               "ttlHours": 72,
+               "invalidationType": "REFETCH",
+               "startTime": "2021-11-09T01:02:03Z"
        }]}
 
 
+
 ``POST``
 ========
-Creates a new content invalidation job.
+Creates a new :term:`Content Invalidation Jobs`.
 
-.. caution:: Creating a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Creating a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
-:Auth. Required: Yes
-:Roles Required: "operations" or "admin"\ [#tenancy]_
-:Permissions Required: JOB:CREATE, JOB:READ, DELIVERY-SERVICE:READ, 
DELIVERY-SERVICE:UPDATE
-:Response Type:  Object
+:Auth. Required:       Yes
+:Roles Required:       "operations" or "admin"\ [#tenancy]_
+:Permissions Required: JOB:CREATE, JOB:READ, DELIVERY-SERVICE:READ, 
DELIVERY-SERVICE:UPDATE\ [#tenancy]_
+:Response Type:        Object
 
 Request Structure
 -----------------
-:deliveryService: This should either be the integral, unique identifier of a 
:term:`Delivery Service`, or a string containing an :ref:`ds-xmlid`
-:startTime: This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` format, 
or a string in :rfc:`3339` format, or a string representing a date in the same 
non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This date must be in the future.
-:regex: A regular expression that will be used to match the path part of URIs 
for content stored on :term:`cache servers` that service traffic for the 
:term:`Delivery Service` identified by ``deliveryService``.
-:ttl: Either the number of hours for which the content invalidation job should 
remain active, or a "duration" string, which is a sequence of numbers followed 
by units. The accepted units are:
-
-       - ``h`` gives a duration in hours
-       - ``m`` gives a duration in minutes
-       - ``s`` gives a duration in seconds
-       - ``ms`` gives a duration in milliseconds
-       - ``us`` (or ``µs``) gives a duration in microseconds
-       - ``ns`` gives a duration in nanoseconds
-
-       These durations can be combined e.g. ``2h45m`` specifies a TTL of two 
hours and forty-five minutes - however note that durations are always rounded 
up to the nearest hour so that e.g. ``121m`` becomes three hours. TTLs cannot 
ever be negative, obviously.
+:deliveryService:  The :ref:`job-ds`
+:invalidationType: The :ref:`job-invalidation-type`
+:regex:            The :ref:`job-regex`
+:startTime:        The :ref:`job-start-time`
+:ttl:              The :ref:`job-ttl`
 
 .. code-block:: http
        :caption: Request Example
 
        POST /api/4.0/jobs HTTP/1.1
-       Host: trafficops.infra.ciab.test
-       User-Agent: python-requests/2.20.1
+       User-Agent: python-requests/2.25.1
        Accept-Encoding: gzip, deflate
        Accept: */*
        Connection: keep-alive
        Cookie: mojolicious=...
-       Content-Length: 80
+       Transfer-Encoding: chunked
        Content-Type: application/json
 
        {
                "deliveryService": "demo1",
-               "startTime": 1560893311219,
-               "regex": "/.*",
-               "ttl": "121m"
+               "invalidationType": "REFRESH",
+               "regex": "/.+",
+               "startTime": "2021-11-09T01:02:03Z",
+               "ttlHours": 72
        }
 
+
 Response Structure
 ------------------
-:assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
-
-       PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
-
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:assetUrl:         The :ref:`job-asset-url`
+:createdBy:        The :ref:`job-created-by`
+:deliveryService:  The :ref:`job-ds`
+:id:               The :ref:`job-id`.
+:invalidationType: The :ref:`job-invalidation-type`
+:ttlHours:         The :ref:`job-ttl`
+:startTime:        The :ref:`job-start-time`
 
 .. code-block:: http
        :caption: Response Example
 
        HTTP/1.1 200 OK
-       Access-Control-Allow-Credentials: true
-       Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, 
Accept, Set-Cookie, Cookie
-       Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
-       Access-Control-Allow-Origin: *
        Content-Encoding: gzip
        Content-Type: application/json
-       Location: https://trafficops.infra.ciab.test/api/4.0/jobs?id=3
-       Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 
GMT; Max-Age=3600; HttpOnly
-       Whole-Content-Sha512: 
nB2xg2IqO56rLT8dI4+KZgxOsTe5ShctG1U8epRsY9NyyMIpx8TZYt5MrO2QikuYh+NnyoR6V0VICCnGCKZpKw==
+       Location: https://localhost:6443/api/4.0/jobs?id=1
+       Permissions-Policy: interest-cohort=()
+       Set-Cookie: mojolicious=...
+       Vary: Accept-Encoding
        X-Server-Name: traffic_ops_golang/
-       Date: Tue, 18 Jun 2019 19:37:06 GMT
-       Content-Length: 238
+       Date: Mon, 08 Nov 2021 15:44:46 GMT
+       Content-Length: 265
 
        {
                "alerts": [
                        {
-                               "text": "Invalidation Job creation was 
successful",
+                               "text": "Invalidation (REFRESH) request created 
for http://origin.infra.ciab.test/.+, start:2021-11-09 01:02:03 +0000 UTC end 
2021-11-12 01:02:03 +0000 UTC",
                                "level": "success"
                        }
                ],
                "response": {
-                       "assetUrl": "http://origin.infra.ciab.test/.*";,
+                       "id": 1,
+                       "assetUrl": "http://origin.infra.ciab.test/.+";,
                        "createdBy": "admin",
                        "deliveryService": "demo1",
-                       "id": 3,
-                       "keyword": "PURGE",
-                       "parameters": "TTL:2h",
-                       "startTime": "2019-06-18 21:28:31+00"
+                       "ttlHours": 72,
+                       "invalidationType": "REFRESH",
+                       "startTime": "2021-11-09T01:02:03Z"
                }
        }
 
 
+
 ``PUT``
 =======
-Replaces an existing content invalidation job with a new one provided in the 
request. This method of editing a content invalidation job does not prevent the 
requesting user from changing fields that normally only have one value. Use 
with care.
+Replaces an existing :term:`Content Invalidation Job` with a new one provided 
in the request. This method of editing a :term:`Content Invalidation Job` does 
not prevent the requesting user from changing fields that normally only have 
one value. Use with care.
 
-.. caution:: Modifying a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Pa [...]
+.. caution:: Modifying a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the  [...]
 
-:Auth. Required: Yes
-:Roles Required: "operations" or "admin"\ [#tenancy]_
-:Permissions Required: JOB:UPDATE, DELIVERY-SERVICE:UPDATE, JOB:READ, 
DELIVERY-SERVICE:READ
-:Response Type:  Object
+:Auth. Required:       Yes
+:Roles Required:       "operations" or "admin"\ [#tenancy]_
+:Permissions Required: JOB:UPDATE, DELIVERY-SERVICE:UPDATE, JOB:READ, 
DELIVERY-SERVICE:READ\ [#tenancy]_
+:Response Type:        Object
 
 Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
-
-:assetUrl: A regular expression - matching URLs will be operated upon 
according to ``keyword``
-
-       .. note:: Unlike in the payloads of POST_ requests to this endpoint, 
this must be a **full** URL regular expression, as it is **not** combined with 
the :ref:`ds-origin-url` of the :term:`Delivery Service` identified by 
``deliveryService``.
-
-:createdBy:       The username of the user who initiated the job\ [#readonly]_
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates\ [#readonly]_ - unlike POST_ request payloads, this cannot be 
an integral, unique identifier
-:id:              An integral, unique identifier for this job\ [#readonly]_
-:keyword:         A keyword that represents the operation being performed by 
the job. It can have any (string) value, but the only value with any meaning to 
Traffic Control is:
-
-       PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
-:parameters: A string containing space-separated key/value pairs - delimited 
by colons (:kbd:`:`\ s) representing parameters associated with the job. In 
practice, any string can be passed as a job's ``parameters``, but the only 
value with meaning is a single key/value pair indicated a :abbr:`TTL (Time To 
Live)` in hours in the format :file:`TTL:{hours}h`, and any other type of value 
may cause components of Traffic Control to work improperly or not at all.
-:startTime:  This can be a string in the legacy ``YYYY-MM-DD HH:MM:SS`` 
format, or a string in :rfc:`3339` format, or a string representing a date in 
the same non-standard format as the ``last_updated`` fields common in other API 
responses, or finally it can be a number indicating the number of milliseconds 
since the Unix Epoch (January 1, 1970 UTC). This **must** be in the future, but 
only by no more than two days.
+:assetUrl:         The :ref:`job-asset-url` - the scheme and authority parts 
of the regular expression cannot be changed
+:createdBy:        The :ref:`job-created-by`\ [#immutable]_
+:deliveryService:  The :ref:`job-ds`\ [#immutable]_
+:id:               The :ref:`job-id`\ [#immutable]_
+:invalidationType: The :ref:`job-invalidation-type`
+:ttlHours:         The :ref:`job-ttl`
+:startTime:        The :ref:`job-start-time`
 
 .. code-block:: http
        :caption: Request Example
 
-       PUT /api/4.0/jobs?id=3 HTTP/1.1
-       Host: trafficops.infra.ciab.test
-       User-Agent: python-requests/2.20.1
+       PUT /api/4.0/jobs?id=1 HTTP/1.1
+       User-Agent: python-requests/2.25.1
        Accept-Encoding: gzip, deflate
        Accept: */*
        Connection: keep-alive
        Cookie: mojolicious=...
-       Content-Length: 188
-       Content-Type: application/json
+       Content-Length: 191
 
        {
-               "assetUrl": "http://origin.infra.ciab.test/.*";,
+               "assetUrl": "http://origin.infra.ciab.test/.+";,
                "createdBy": "admin",
                "deliveryService": "demo1",
-               "id": 3,
-               "keyword": "PURGE",
-               "parameters": "TTL:360h",
-               "startTime": "2019-06-20 18:33:40+00"
+               "id": 1,
+               "invalidationType": "REFETCH",
+               "startTime": "2021-11-09T01:02:03Z",
+               "ttlHours": 72
        }
 
+
 Response Structure
 ------------------
-:assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
-
-       PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
-
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:assetUrl:         The :ref:`job-asset-url`
+:createdBy:        The :ref:`job-created-by`
+:deliveryService:  The :ref:`job-ds`
+:id:               The :ref:`job-id`
+:invalidationType: The :ref:`job-invalidation-type`
+:ttlHours:         The :ref:`job-ttl`
+:startTime:        The :ref:`job-start-time`
 
 .. code-block:: http
        :caption: Response Example
 
        HTTP/1.1 200 OK
-       Access-Control-Allow-Credentials: true
-       Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, 
Accept, Set-Cookie, Cookie
-       Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
-       Access-Control-Allow-Origin: *
        Content-Encoding: gzip
        Content-Type: application/json
-       Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 
GMT; Max-Age=3600; HttpOnly
-       Whole-Content-Sha512: 
+P1PTav4ZBoiQcCqQnUqf+J0dCfQgVj8mzzKtUCA69mWYulya9Bjf6BUd8Aro2apmpgPBkCEA5sITJV1tMYA0Q==
+       Permissions-Policy: interest-cohort=()
+       Set-Cookie: mojolicious=...
+       Vary: Accept-Encoding
        X-Server-Name: traffic_ops_golang/
-       Date: Wed, 19 Jun 2019 13:38:59 GMT
-       Content-Length: 234
+       Date: Mon, 08 Nov 2021 16:43:35 GMT
+       Content-Length: 266
 
-       { "alerts": [{
-               "text": "Content invalidation job updated",
-               "level": "success"
-       }],
+       { "alerts": [
+               {
+                       "text": "Invalidation request created for 
http://origin.infra.ciab.test/.+, start: 2021-11-09 01:02:03 +0000 UTC end: 
2021-11-12 01:02:03 +0000 UTC invalidation type: REFETCH",
+                       "level": "success"
+               }
+       ],
        "response": {
-               "assetUrl": "http://origin.infra.ciab.test/.*";,
+               "assetUrl": "http://origin.infra.ciab.test/.+";,
                "createdBy": "admin",
                "deliveryService": "demo1",
-               "id": 3,
-               "keyword": "PURGE",
-               "parameters": "TTL:360h",
-               "startTime": "2019-06-20 18:33:40+00"
+               "id": 1,
+               "invalidationType": "REFETCH",
+               "startTime": "2021-11-09T01:02:03Z",
+               "ttlHours": 72
        }}
 
 
 ``DELETE``
 ==========
-Deletes a content invalidation job.
+Deletes a :term:`Content Invalidation Job`.
 
-.. tip:: Content invalidation jobs that have passed their :abbr:`TTL (Time To 
Live)` are not automatically deleted - for record-keeping purposes - so use 
this to clean up old jobs that are no longer useful.
+.. tip:: :term:`Content Invalidation Jobs` that have passed their :abbr:`TTL 
(Time To Live)` are not automatically deleted - for record-keeping purposes - 
so use this to clean up old jobs that are no longer useful.
 
-.. caution:: Deleting a content invalidation job immediately triggers a 
CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that content invalidation jobs become 
active **immediately** at their ``startTime`` - unlike most other configuration 
changes they do not wait for a :term:`Snapshot` or a "Queue Updates". 
Furthermore, if the global :term:`Par [...]
+.. caution:: Deleting a :term:`Content Invalidation Job` immediately triggers 
a CDN-wide revalidation update. In the case that the global :term:`Parameter` 
``use_reval_pending`` has a value of exactly ``"0"``, this will instead trigger 
a CDN-wide "Queue Updates". This means that :term:`Content Invalidation Jobs` 
become active **immediately** at their ``startTime`` - unlike most other 
configuration changes they do not wait for a :term:`Snapshot` or a "Queue 
Updates". Furthermore, if the g [...]
 
-:Auth. Required: Yes
-:Roles Required: "operations" or "admin"\ [#tenancy]_
-:Permissions Required: JOB:DELETE, JOB:READ, DELIVERY-SERVICE:UPDATE, 
DELIVERY-SERVICE:READ
-:Response Type:  Object
+:Auth. Required:       Yes
+:Roles Required:       "operations" or "admin"\ [#tenancy]_
+:Permissions Required: JOB:DELETE, JOB:READ, DELIVERY-SERVICE:UPDATE, 
DELIVERY-SERVICE:READ\ [#tenancy]_
+:Response Type:        Object
 
 Request Structure
 -----------------
 .. table:: Query Parameters
 
-       
+------+----------+--------------------------------------------------------------------------------+
-       | Name | Required | Description                                         
                           |
-       
+======+==========+================================================================================+
-       | id   | yes      | The integral, unique identifier of the content 
invalidation job being modified |
-       
+------+----------+--------------------------------------------------------------------------------+
+       
+------+----------+----------------------------------------------------------------------------------------+
+       | Name | Required | Description                                         
                                   |
+       
+======+==========+========================================================================================+
+       | id   | yes      | The integral, unique identifier of the 
:term:`Content Invalidation Job` being modified |
+       
+------+----------+----------------------------------------------------------------------------------------+
 
 .. code-block:: http
        :caption: Request Example
 
-       DELETE /api/4.0/jobs?id=3 HTTP/1.1
-       Host: trafficops.infra.ciab.test
-       User-Agent: python-requests/2.20.1
+       DELETE /api/4.0/jobs?id=1 HTTP/1.1
+       User-Agent: python-requests/2.25.1
        Accept-Encoding: gzip, deflate
        Accept: */*
        Connection: keep-alive
        Cookie: mojolicious=...
        Content-Length: 0
 
+
 Response Structure
 ------------------
-:assetUrl:        A regular expression - matching URLs will be operated upon 
according to ``keyword``
-:createdBy:       The username of the user who initiated the job
-:deliveryService: The :ref:`ds-xmlid` of the :term:`Delivery Service` on which 
this job operates
-:id:              An integral, unique identifier for this job
-:keyword:         A keyword that represents the operation being performed by 
the job:
-
-       PURGE
-               This job will prevent caching of URLs matching the ``assetUrl`` 
until it is removed (or its Time to Live expires)
-
-:parameters: A string containing key/value pairs representing parameters 
associated with the job - currently only uses Time to Live e.g. ``"TTL:48h"``
-:startTime:  The date and time at which the job began, in a non-standard format
+:assetUrl:         The :ref:`job-asset-url` of the deleted :term:`Content 
Invalidation Job`
+:createdBy:        The :ref:`job-created-by` of the deleted :term:`Content 
Invalidation Job`
+:deliveryService:  The :ref:`job-ds` of the deleted :term:`Content 
Invalidation Job`
+:id:               The :ref:`job-id`. of the deleted :term:`Content 
Invalidation Job`
+:invalidationType: The :ref:`job-invalidation-type` of the deleted 
:term:`Content Invalidation Job`
+:ttlHours:         The :ref:`job-ttl` of the deleted :term:`Content 
Invalidation Job`
+:startTime:        The :ref:`job-start-time` of the deleted :term:`Content 
Invalidation Job`
 
 .. code-block:: http
        :caption: Response Example
 
        HTTP/1.1 200 OK
-       Access-Control-Allow-Credentials: true
-       Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, 
Accept, Set-Cookie, Cookie
-       Access-Control-Allow-Methods: POST,GET,OPTIONS,PUT,DELETE
-       Access-Control-Allow-Origin: *
        Content-Encoding: gzip
        Content-Type: application/json
-       Set-Cookie: mojolicious=...; Path=/; Expires=Mon, 18 Nov 2019 17:40:54 
GMT; Max-Age=3600; HttpOnly
-       Whole-Content-Sha512: 
FqfziXJYYwHb84Fac9+p4NEY3EsklYxe94wg/VOmlXk4R6l4SaPSh015CChPt/yT72MsWSETnIuRD9KtoK4I+w==
+       Permissions-Policy: interest-cohort=()
+       Set-Cookie: mojolicious=...
+       Vary: Accept-Encoding
        X-Server-Name: traffic_ops_golang/
-       Date: Tue, 18 Jun 2019 22:55:15 GMT
-       Content-Length: 234
+       Date: Mon, 08 Nov 2021 16:54:32 GMT
+       Content-Length: 230
 
        { "alerts": [
                {
@@ -380,15 +344,15 @@ Response Structure
                }
        ],
        "response": {
-               "assetUrl": "http://origin.infra.ciab.test/.*";,
+               "assetUrl": "http://origin.infra.ciab.test/.+";,
                "createdBy": "admin",
                "deliveryService": "demo1",
-               "id": 3,
-               "keyword": "PURGE",
-               "parameters": "TTL:36h",
-               "startTime": "2019-06-20 18:33:40+00"
+               "id": 1,
+               "invalidationType": "REFETCH",
+               "startTime": "2021-11-09T01:02:03Z",
+               "ttlHours": 72
        }}
 
 
-.. [#tenancy] When viewing content invalidation jobs, only those jobs that 
operate on a :term:`Delivery Service` visible to the requesting user's 
:term:`Tenant` will be returned. Likewise, creating a new content invalidation 
job requires that the target :term:`Delivery Service` is modifiable by the 
requesting user's :term:`Tenant`. However, when modifying or deleting an 
existing content invalidation job, the operation can be completed if and only 
if the requesting user's :term:`Tenant` i [...]
-.. [#readonly] This field must exist, but it must *not* be different than the 
same field of the existing job (i.e. as seen in a GET_ response)
+.. [#tenancy] When viewing :term:`Content Invalidation Jobs`, only those jobs 
that operate on a :term:`Delivery Service` visible to the requesting user's 
:term:`Tenant` will be returned. Likewise, creating a new :term:`Content 
Invalidation Jobs` requires that the target :term:`Delivery Service` is 
modifiable by the requesting user's :term:`Tenant`. However, when modifying or 
deleting an existing :term:`Content Invalidation Jobs`, the operation can be 
completed if and only if the requesti [...]
+.. [#immutable] This field must exist, but it must *not* be different than the 
same field of the existing job (i.e. as seen in a GET_ response). That is, this 
cannot be changed.
diff --git a/docs/source/api/v4/servers_hostname_update_status.rst 
b/docs/source/api/v4/servers_hostname_update_status.rst
index 6c63328..5aec43a 100644
--- a/docs/source/api/v4/servers_hostname_update_status.rst
+++ b/docs/source/api/v4/servers_hostname_update_status.rst
@@ -23,7 +23,7 @@
 
 ``GET``
 =======
-Retrieves information regarding pending updates and revalidation jobs for a 
given server
+Retrieves information regarding pending updates and :term:`Content 
Invalidation Jobs` for a given server
 
 :Auth. Required: Yes
 :Roles Required: None
@@ -59,14 +59,14 @@ Each object in the returned array\ [#uniqueness]_ will 
contain the following fie
 :host_id:              The integral, unique identifier for the server for 
which the other fields in this object represent the pending updates and 
revalidation status
 :host_name:            The (short) hostname of the server for which the other 
fields in this object represent the pending updates and revalidation status
 :parent_pending:       A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending updates
-:parent_reval_pending: A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending revalidation jobs
-:reval_pending:        ``true`` if the server has pending revalidation jobs, 
``false`` otherwise
+:parent_reval_pending: A boolean telling whether or not any :term:`Topology` 
ancestor or :term:`parent` of this server has pending :term:`Content 
Invalidation Jobs`
+:reval_pending:        ``true`` if the server has pending :term:`Content 
Invalidation Jobs`, ``false`` otherwise
 :status:               The name of the status of this server
 
        .. seealso:: :ref:`health-proto` gives more information on how these 
statuses are used, and the ``GET`` method of the :ref:`to-api-statuses` 
endpoint can be used to retrieve information about all server statuses 
configured in Traffic Ops.
 
 :upd_pending:       ``true`` if the server has pending updates, ``false`` 
otherwise
-:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending revalidation jobs
+:use_reval_pending: A boolean which tells :term:`ORT` whether or not this 
version of Traffic Ops should use pending :term:`Content Invalidation Jobs`
 
        .. note:: This field was introduced to give :term:`ORT` the ability to 
work with Traffic Control versions 1.x and 2.x seamlessly - as of Traffic 
Control v3.0 there is no reason for this field to ever be ``false``.
 
diff --git a/docs/source/glossary.rst b/docs/source/glossary.rst
index 7d7bd6f..84c564f 100644
--- a/docs/source/glossary.rst
+++ b/docs/source/glossary.rst
@@ -52,6 +52,14 @@ Glossary
 
                .. seealso:: For a more complete description of Cache Groups, 
see the :ref:`cache-groups` overview section.
 
+       Content Invalidation Job
+       Content Invalidation Jobs
+       job
+       jobs
+               :dfn:`Content Invalidation Jobs` are a way to force 
:term:`cache servers` to treat their cached content as stale (or even not in 
cache at all).
+
+               .. seealso:: For a more complete description of Content 
Invalidation Jobs, see the :ref:`jobs` overview section.
+
        content routing
                Directing clients (or client systems) to a particular location 
or device in a location for optimal delivery of content See also :ref:`http-cr` 
and :ref:`dns-cr`.
 
diff --git a/docs/source/overview/delivery_service_requests.rst 
b/docs/source/overview/delivery_service_requests.rst
index 7f4f31c..9413ed0 100644
--- a/docs/source/overview/delivery_service_requests.rst
+++ b/docs/source/overview/delivery_service_requests.rst
@@ -60,6 +60,7 @@ The model for a :abbr:`DSR (Delivery Service Request)` in the 
most recent versio
                original: DeliveryService;
                requested: DeliveryService;
        }
+
 .. _dsr-assignee:
 
 Assignee
diff --git a/docs/source/overview/jobs.rst b/docs/source/overview/jobs.rst
new file mode 100644
index 0000000..6e8477a
--- /dev/null
+++ b/docs/source/overview/jobs.rst
@@ -0,0 +1,137 @@
+..
+..
+.. Licensed under the Apache License, Version 2.0 (the "License");
+.. you may not use this file except in compliance with the License.
+.. You may obtain a copy of the License at
+..
+..     http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing, software
+.. distributed under the License is distributed on an "AS IS" BASIS,
+.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+.. See the License for the specific language governing permissions and
+.. limitations under the License.
+..
+
+.. _jobs:
+
+*************************
+Content Invalidation Jobs
+*************************
+:dfn:`Content Invalidation Jobs`, or simply "jobs" as they are sometimes 
known, are ways of forcing :term:`cache servers` to treat content as no longer 
valid, bypassing their normal caching policies.
+
+In general, this *should* be unnecessary, because a well-behaved 
:term:`Origin` *should* be setting its HTTP caching headers properly, so that 
content is only considered valid for some appropriate time intervals. 
Occasionally, however, an :term:`Origin` will be too optimistic with its 
caching instructions, and when content needs to be updated, :term:`cache 
servers` need to be informed that they must check back with the :term:`Origin`. 
Content Invalidation Jobs allow this to be done for s [...]
+
+The model for Content Invalidation Job as API objects is given in 
:ref:`jobs-model`.
+
+.. _jobs-model:
+
+.. code-block:: typescript
+       :caption: Content Invalidation Job as a Typescript interface.
+
+       /** This is the form used to create a new Content Invalidation Job */
+       interface ContentInvalidationJobCreationRequest {
+               deliveryService: string;
+               invalidationType: "REFRESH" | "REFETCH";
+               regex: `/${string}` | `\\/${string}`; // must also be a valid 
RegExp
+               startTime: Date; // RFC3339 string
+               ttlHours: number;
+       }
+
+       /**
+        * This is the form used to return representations of Content 
Invalidation
+        * Requests to clients.
+        */
+       interface ContentInvalidationJob {
+               assetUrl: string;
+               createdBy: string;
+               deliveryService: string;
+               id: number;
+               invalidationType: "REFRESH" | "REFETCH";
+               startTime: Date; // RFC3339 string
+               ttlHours: number;
+       }
+
+.. _job-asset-url:
+
+Asset URL
+---------
+This property only appears in responses from the :ref:`to-api` (and in the 
bodies of ``PUT`` requests to :ref:`to-api-jobs`, where the scheme and 
host/authority sections of the URL is held immutable). The :dfn:`Asset URL` is 
constructed from the `Regular Expression`_ used in the creation of a Content 
Invalidation Job and the :ref:`ds-origin-url` of the :term:`Delivery Service` 
for which it was created. It is a URL that has a valid regular expression as 
its path (and may not be "percent-e [...]
+
+.. _job-created-by:
+
+Created By
+----------
+The username of the user who created the Content Invalidation Job is stored as 
the :dfn:`Created By` property of the Content Invalidation Job.
+
+.. _job-ds:
+
+Delivery Service
+----------------
+A Content Invalidation Job can only act on content for a single 
:term:`Delivery Service` - invalidating content for multiple :term:`Delivery 
Services` requires multiple Content Invalidation Jobs. The :dfn:`Delivery 
Service` property of a Content Invalidation Job holds the :ref:`ds-xmlid` of 
the :term:`Delivery Service` on which it operates.
+
+.. versionchanged:: 4.0
+       In earlier API versions, this property was allowed to be either the 
integral, unique identifier of the target :term:`Delivery Service`, *or* its 
:ref:`ds-xmlid` - this is no longer the case, but it should always be safe to 
use the :ref:`ds-xmlid` in any case.
+
+.. _job-id:
+
+ID
+--
+The integral, unique identifier for the Content Invalidation Job, assigned to 
it upon its creation.
+
+.. _job-invalidation-type:
+
+Invalidation Type
+-----------------
+:dfn:`Invalidation Type` defines how a :term:`cache server` should go about 
ensuring that its cache is valid.
+
+The normal operating mode for a Content Invalidation Job is to force the 
:term:`cache server` to send a request to the :term:`Origin` to verify that its 
cache is valid. If that is the case, no extra work is done and business as 
usual resumes. However, some :term:`Origins` are misconfigured and do not 
respond as required by HTTP specification. In this case, it is strongly advised 
to fix the :term:`Origin` so that it properly implements HTTP. However, if an 
:term:`Origin` is sending cache- [...]
+
+The two values allowed for a Content Invalidation Job's Invalidation Type are:
+
+REFRESH
+       A :dfn:`REFRESH` Content Invalidation Job instructs :term:`cache 
servers` to behave normally - when matching content is requested, send an 
upstream request to (eventually) the :term:`Origin` with cache-controlling HTTP 
headers, and trust the :term:`Origin`'s response. The vast majority of all 
Content Invalidation Jobs should most likely use this Invalidation Type.
+REFETCH
+       Rather than treating the cached content as "stale", the :term:`cache 
servers` processing a :dfn:`REFETCH` Content Invalidation Job should fetch the 
cached content again, regardless of what the :term:`Origin` has to say about 
the validity of their caches. These types of Content Invalidation Jobs cannot 
be created without a proper "semi-global" :ref:`refetch_enabled Parameter 
<parameter-name-refetch_enabled>`.
+
+.. caution:: A "REFETCH" Content Invalidation Job should be used **only** when 
the :term:`Origin` is not properly configured to support HTTP caching, and will 
return invalid or incorrect responses to conditional requests  as described in 
section 4.3.2 of :rfc:`7234`. In any other case, this will cause undo load on 
both the :term:`Origin` and the requesting :term:`cache servers`, and "REFRESH" 
should be used instead.
+
+.. _job-regex:
+
+Regular Expression
+------------------
+The :dfn:`Regular Expression` of a Content Invalidation Job defines the 
content on which it acts. It is used to match URL *paths* (including the query 
string - but **not** including document fragments, which are not sent in HTTP 
requests) of content to be invalidated, and is combined with the 
:ref:`ds-origin-url` of the :term:`Delivery Service` for which the Content 
Invalidation Job was created to obtain a final pattern that is made available 
as the `Asset URL`_.
+
+.. note:: While the :ref:`to-api` and :ref:`tp-overview` both require the 
Regular Expression to begin with ``/`` (so that it matches URL paths), the 
:ref:`to-api` allows optionally escaping this leading character with a 
"backslash" :kbd:`\\`, while :ref:`tp-overview` does not. As ``/`` is not 
syntactically important to regular expressions, the use of a leading :kbd:`\\` 
should be avoided where possible, and is only allowed for legacy compatibility 
reasons.
+
+.. table:: Aliases/Synonyms
+
+       
+------------+--------------------------------------------------------------------------------+-------------------------------+
+       | Name       | Use(s)                                                   
                      | Type                          |
+       
+============+================================================================================+===============================+
+       | Path Regex | In Traffic Portal forms                                  
                      | unchanged (String, str, etc.) |
+       
+------------+--------------------------------------------------------------------------------+-------------------------------+
+       | regex      | In raw :ref:`to-api` requests and responses, internally 
in multiple components | unchanged (String, str, etc.) |
+       
+------------+--------------------------------------------------------------------------------+-------------------------------+
+
+.. _job-start-time:
+
+Start Time
+----------
+Content Invalidation Jobs are planned in advance, by setting their :dfn:`Start 
Time` to some point in the future (the :ref:`to-api` will refuse to create 
Content Invalidation Jobs with a Start Time in the past). Content Invalidation 
Jobs will have no effect until their Start Time.
+
+.. _job-ttl:
+
+TTL
+---
+The :dfn:`TTL` of a Content Invalidation Job defines how long a Content 
Invalidation Job should remain in effect. This is generally expressed as an 
integer number of hours.
+
+.. table:: Aliases/Synonyms
+
+       
+------------+-----------------------------------------+----------------------------------------------------------------------+
+       | Name       | Use(s)                                  | Type           
                                                      |
+       
+============+=========================================+======================================================================+
+       | parameters | In legacy :ref:`to-api` versions        | A string, 
containing the TTL in the format :samp:`TTL:{Actual TTL}h` |
+       
+------------+-----------------------------------------+----------------------------------------------------------------------+
+       | ttlHours   | In :ref:`to-api` requests and responses | Unchanged 
(unsigned integer number of hours)                         |
+       
+------------+-----------------------------------------+----------------------------------------------------------------------+
diff --git a/docs/source/overview/profiles_and_parameters.rst 
b/docs/source/overview/profiles_and_parameters.rst
index 6005489..ae22120 100644
--- a/docs/source/overview/profiles_and_parameters.rst
+++ b/docs/source/overview/profiles_and_parameters.rst
@@ -202,8 +202,8 @@ There is a special Profile of Type_ UNK_PROFILE that holds 
global configuration
        |                          |                         | recommended that 
this be set on a production  system.                                            
                                     |
        
+--------------------------+-------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
        | use_reval_pending        | global                  | When this 
Parameter is present and its Value_ is exactly "1", Traffic Ops will separately 
keep track of :term:`cache servers`'        |
-       |                          |                         | updates and 
pending content invalidation jobs. This behavior should be enabled by default, 
and disabling it, while still possible, is |
-       |                          |                         | **EXTREMELY 
DISCOURAGED**.                                                                  
                                          |
+       |                          |                         | updates and 
pending :term:`Content Invalidation Jobs`. This behavior should be enabled by 
default, and disabling it, while still      |
+       |                          |                         | possible is 
**EXTREMELY DISCOURAGED**.                                                      
                                          |
        
+--------------------------+-------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
        | geolocation.polling.url  | CRConfig.json           | The location of 
a geographic IP mapping database for Traffic Router instances to use.           
                                      |
        
+--------------------------+-------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
@@ -215,14 +215,13 @@ There is a special Profile of Type_ UNK_PROFILE that 
holds global configuration
        |                          |                         | is MaxMind's 
GeoIP2 database. The format of this :ref:`Parameter <parameters>`'s Value_ is:  
                                         |
        |                          |                         | :file:`{Country 
Code};{Latitude},{Longitude}`, e.g. ``US;37.751,-97.822``                       
                                      |
        
+--------------------------+-------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
-       | maxRevalDurationDays     | regex_revalidate.config | This 
:ref:`Parameter <parameters>` sets the maximum duration, in days, for which a 
content invalidation job may run. This is          |
-       |                          |                         | **extremely** 
important, as there is currently no way to delete a content invalidation job 
once it has been created. Furthermore,     |
-       |                          |                         | while there is 
no restriction placed on creating multiple Parameters_ with this 
:ref:`parameter-name` and `Config File`_ -            |
-       |                          |                         | potentially with 
differing :ref:`Values <parameter-value>` - this is **EXTREMELY DISCOURAGED as 
any** :ref:`Parameter <parameters>`   |
+       | maxRevalDurationDays     | regex_revalidate.config | This 
:ref:`Parameter <parameters>` sets the maximum duration, in days, for which a 
:term:`Content Invalidation Job` may run.          |
+       |                          |                         | Furthermore, 
while there is no restriction placed on creating multiple Parameters_ with this 
:ref:`parameter-name` and `Config File`  |
+       |                          |                         | - potentially 
with differing :ref:`Values <parameter-value>` - this is **EXTREMELY 
DISCOURAGED as any** :ref:`Parameter <parameters>` |
        |                          |                         | **that has both 
that** :ref:`parameter-name` **and** `Config File`_ **might be used when 
generating any given**                       |
        |                          |                         | 
`regex_revalidate.config`_ **file for any given** :term:`cache server` **and 
whenever such** Parameters_ **exist, the actual maximum  |
-       |                          |                         | duration for 
content invalidation jobs is undefined, and CAN and WILL differ from server to 
server, and configuration file to         |
-       |                          |                         | configuration 
file.**                                                                         
                                        |
+       |                          |                         | duration for** 
:term:`Content Invalidation Jobs` **is undefined, and CAN and WILL differ from 
server to server, and configuration     |
+       |                          |                         | file to 
configuration file.**                                                           
                                              |
        
+--------------------------+-------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
 
 
@@ -708,6 +707,15 @@ header
 
        .. caution:: If a single :ref:`Profile <profiles>` has multiple 
"header" Parameters for the same `Config File`_ with different :ref:`Values 
<parameter-value>`, the actual header is undefined (but will be one of those 
Parameters' :ref:`Values <parameter-value>`).
 
+.. _parameter-name-refetch_enabled:
+
+refetch_enabled
+       When a Parameter by this Name exists, and has the `Config File`_ value 
of exactly "global", then its Value_ *may* be used by Traffic Ops to decide 
whether or not the "REFETCH" :ref:`job-invalidation-type` of :term:`Content 
Invalidation Jobs` are allowed to be created. The Value_ "true" 
(case-insensitive) indicates that such :term:`Content Invalidation Jobs` 
*should* be allowed, while all other :ref:`Values <parameter-value>` indicate 
they should not.
+
+       .. note:: Any leading or trailing whitespace in the Value_ of these 
Parameters is ignored.
+
+       .. caution:: There is no limit to the number of these Parameters that 
may exist, and no association to any existing Profiles_ is considered when 
choosing which Parameter to use. If more than one Parameter with the Name 
``refetch_enabled`` exists with the `Config File`_ "global", then the actual 
Value_ used to determine if "REFETCH" :ref:`job-invalidation-type` of 
:term:`Content Invalidation Jobs` are allowed to be created is undefined (but 
will be the Value_ of one of said Parameters).  [...]
+
 .. _parameter-secure:
 
 Secure
diff --git a/docs/source/tools/atstccfg.rst b/docs/source/tools/atstccfg.rst
index 5fb35fb..25ffafd 100644
--- a/docs/source/tools/atstccfg.rst
+++ b/docs/source/tools/atstccfg.rst
@@ -150,7 +150,7 @@ Options
 
 .. option:: -y, --revalidate-only
 
-       When given, :program:`atstccfg` will only emit files relevant for 
updating content invalidation jobs. for Apache Traffic Server implementations, 
this limits the output to be only files named ``regex_revalidate.config``. Has 
no effect if :option:`--get-data` or 
:option:`--set-queue-status`/:option:`--set-reval-status` is/are used.
+       When given, :program:`atstccfg` will only emit files relevant for 
updating :term:`Content Invalidation Jobs`. for Apache Traffic Server 
implementations, this limits the output to be only files named 
``regex_revalidate.config``. Has no effect if :option:`--get-data` or 
:option:`--set-queue-status`/:option:`--set-reval-status` is/are used.
 
 Environment Variables
 ---------------------
diff --git a/lib/go-tc/invalidationjobs.go b/lib/go-tc/invalidationjobs.go
index a1d1488..f58b3fa 100644
--- a/lib/go-tc/invalidationjobs.go
+++ b/lib/go-tc/invalidationjobs.go
@@ -463,8 +463,12 @@ func (job *UserInvalidationJobInput) Validate(tx *sql.Tx) 
error {
        return nil
 }
 
-const REFRESH = "REFRESH"
-const REFETCH = "REFETCH"
+// These are the allowed values for the InvalidationType of an
+// InvalidationJobCreateV4/InvalidationJobV4.
+const (
+       REFRESH = "REFRESH"
+       REFETCH = "REFETCH"
+)
 
 // InvalidationJobsResponse is the type of a response from Traffic Ops to a
 // request made to its /jobs API endpoint for v 4.0+
@@ -511,18 +515,16 @@ type InvalidationJobV40 struct {
        StartTime        time.Time `json:"startTime"`
 }
 
+// String implements the fmt.Stringer interface by providing a textual
+// representation of the InvalidationJobV4.
 func (job InvalidationJobV4) String() string {
-
-       ID := strconv.FormatUint(job.ID, 10)
-       TTLHours := strconv.FormatUint(uint64(job.TTLHours), 10)
-       StartTime := job.StartTime.String()
-
-       return 
fmt.Sprintf("{\nID:\t\t\t\t\t%s,\nAssetURL:\t\t\t%s,\nCreatedBy:\t\t\t%s,\nDeliveryService:\t%s,\nTTLHours:\t\t\t%s,\nInvalidationType:\t%s,\nStartTime:\t\t\t%s,\n}",
-               ID,
+       return fmt.Sprintf(`InvalidationJobV4{ID: %d, AssetURL: "%s", 
CreatedBy: "%s", DeliveryService: "%s", TTLHours: %d, InvalidationType: "%s", 
StartTime: "%s"}`,
+               job.ID,
                job.AssetURL,
                job.CreatedBy,
                job.DeliveryService,
-               TTLHours,
+               job.TTLHours,
                job.InvalidationType,
-               StartTime)
+               job.StartTime.Format(time.RFC3339),
+       )
 }
diff --git a/lib/go-tc/invalidationjobs_test.go 
b/lib/go-tc/invalidationjobs_test.go
index 864992d..652315c 100644
--- a/lib/go-tc/invalidationjobs_test.go
+++ b/lib/go-tc/invalidationjobs_test.go
@@ -22,6 +22,7 @@ package tc
 import (
        "fmt"
        "testing"
+       "time"
 
        "github.com/apache/trafficcontrol/lib/go-util"
 )
@@ -66,3 +67,19 @@ func ExampleInvalidationJobInput_TTLHours_number() {
        fmt.Println(ttl)
        // Output: 2
 }
+
+func ExampleInvalidationJobV4_String() {
+       t, _ := time.Parse(time.RFC3339, "2021-11-08T01:02:03Z")
+       j := InvalidationJobV4{
+               AssetURL:         "https://example.com/.*";,
+               CreatedBy:        "noone",
+               DeliveryService:  "demo1",
+               ID:               5,
+               InvalidationType: REFETCH,
+               StartTime:        t,
+               TTLHours:         72,
+       }
+
+       fmt.Println(j)
+       // Output: InvalidationJobV4{ID: 5, AssetURL: "https://example.com/.*";, 
CreatedBy: "noone", DeliveryService: "demo1", TTLHours: 72, InvalidationType: 
"REFETCH", StartTime: "2021-11-08T01:02:03Z"}
+}

Reply via email to