Project

Profile

Help

Pulp 3 Minimum Viable Product » History » Sprint/Milestone 145

dkliban@redhat.com, 02/12/2018 08:22 PM

1 1 bmbouter
# Pulp 3.0.0 Minimum Viable Product (MVP)
2
3 21 bmbouter
<span style="color:red;">Lines highlighted in red need more attention.</span>
4 20 bmbouter
5 37 bmbouter
## Overall Guarantees
6
7 57 mhrivnak
  - This is not a direct replacement for Pulp 2.
8
  - This is the minimum required for a 3.0.0 beta and GA.
9
  - All REST API calls will update the DB using transactions as necessary to ensure data integrity.
10 37 bmbouter
11 59 bmbouter
## Legend
12
13
\[done\] means merged and documented  
14
\[in-progress\] means started but not fully done  
15
If there is no label the effort has not yet been started
16
17 1 bmbouter
## Authentication
18
19 59 bmbouter
As an authenticated user I can manage user(s). \[done\]
20 17 semyers
21
  - Add a user
22
  - View user(s)
23 58 mhrivnak
  - Update any user detail
24 1 bmbouter
  - Delete a user
25
26 135 bmbouter
As an API user, I can authenticate any API call with Basic auth \[done\]
27 1 bmbouter
28 110 daviddavis
As an authenticated user, I can filter users by: \[[3142](https://pulp.plan.io/issues/3142)\]
29
30
  - username: (equality, username_in_list)
31
32 1 bmbouter
## Repositories
33
34 18 dkliban@redhat.com
As an authenticated user, I can list all repos.
35
36 60 bmbouter
  - All fields are included \[done\]
37
  - Pagination is supported \[done\]
38 1 bmbouter
39 112 bmbouter
As an authenticated user I can use filters on Repositories list: \[[3079](https://pulp.plan.io/issues/3079)\]
40 109 amacdona@redhat.com
41
  - id: (id_in_list) \# id equality is not necessary, v3/repositories/\<UUID\>/
42
  - name: (equality, name_in_list)
43
44 18 dkliban@redhat.com
As an authenticated user, I can CRUD a repository
45
46 60 bmbouter
  - Create a repo \[done\]
47
  - Read a repo \[done\]
48
  - Update all mutable repo fields \[done\]
49 130 daviddavis
  - Delete a repo (asynchronous)
50 112 bmbouter
51 1 bmbouter
As an authenticated user, I can see the number of content unit types with counts for each \[done\]\[[3059](https://pulp.plan.io/issues/3059)\]
52
53 140 daviddavis
As an authenticated user, when viewing a repository, I can discover a URL to the latest version of a repository. \[[3235](https://pulp.plan.io/issues/3235)\]
54 130 daviddavis
55 51 bmbouter
## Importers
56
57
note: Importer attributes will commonly be available on importers, but aren't guaranteed to be used by all importers.
58
59 18 dkliban@redhat.com
As an authenticated user, I can CRUD an importer
60
61
  - Create an importer
62 1 bmbouter
  - Read an importer
63
  - Update all mutable importer fields
64
  - Delete an importer (asynchronous)
65 18 dkliban@redhat.com
66
As an authenticated user, I have filters on the Importer list: \[[3080](https://pulp.plan.io/issues/3080)\]
67 21 bmbouter
68 1 bmbouter
  - id: (id_in_list) \# id equality is not necessary, objects are referenced by id
69 113 bmbouter
  - name: (equality, name_in_list)
70 109 amacdona@redhat.com
71
As an authenticated user I can configure the following attributes on an Importer: \[done\]
72
73
  - validate (bool) \[optional: defaults to True\]: If true, the plugin will validate imported content.
74 64 mhrivnak
  - ssl_ca_certificate (str) \[optional\] String containing a PEM encoded CA certificate used to validate the server certificate presented by the external source.
75 47 bmbouter
  - ssl_client_certificate (str) \[optional\] Contains a PEM encoded client certificate used for authentication.
76 48 amacdona@redhat.com
  - ssl_client_key (str) \[optional\] Contains a PEM encoded private key used for authentication.
77
  - ssl_validation (bool) \[optional: defaults to True\]: If true, SSL peer validation must be performed.
78
  - proxy_url (str) \[optional\] Contains the proxy URL. Format: scheme://user:password@host:port.
79
  - username (str) \[optional\] Contains the username to be used for authentication when syncing.
80 63 mhrivnak
  - password (str) \[optional\] Contains the password to be used for authentication when syncing.
81 1 bmbouter
  - %{color:orange}download_policy (str) \[optional\] Contains the downloading policy name. This is a choice of three options:  
82 135 bmbouter
    \- immediate (default) - Downloading occurs during sync. The sync task does not complete until downloading is done.  
83
    \- background - Downloading is started by the sync but occurs in the background. The sync task completes before downloading is complete.
84
  - feed_url (str) \[optional\] Contains the URL of an external content source. This is optional.
85 1 bmbouter
  - <span style="color:orange;">sync mode: (str) \[optional\]. It has two choices 'additive' and 'mirror':  
86 136 daviddavis
 \- additive (default) - all remote content is added to the latest repo version on sync. During sync no content is removed from the latest repo version.  
87 63 mhrivnak
 \- mirror - the local content will mirror the remote content exactly, removing local content if not also present in the remote content.</span>
88 1 bmbouter
  - name (str) \[required\] Contains the name.
89
  - last_updated (datetime) \[read-only\] Contains the datetime of the last importer update.
90 50 bmbouter
  - last_synced (datetime) \[read-only\] Contains the datetime of the last importer sync.
91
92 130 daviddavis
As an authenticated user, I can define a default importer on a repo via href to be used whenever a new repo version is created.
93
94 52 bmbouter
## Publishers
95 51 bmbouter
96
note: Publisher attributes will commonly be available on publishers, but aren't guaranteed to be used by all publishers.
97 47 bmbouter
98 18 dkliban@redhat.com
As an authenticated user, I can CRUD a publisher
99
100
  - Create a publisher
101 1 bmbouter
  - Read a publisher
102
  - Update all mutable publisher fields
103 50 bmbouter
  - Delete a publisher (asynchronous)
104 1 bmbouter
105 113 bmbouter
As an authenticated user, I have filters on the Publisher list: \[[3081](https://pulp.plan.io/issues/3081)\]
106 109 amacdona@redhat.com
107
  - id: (id_in_list) \# id equality is not necessary, objects are referenced by id
108
  - name: (equality, name_in_list)
109
110 50 bmbouter
As an authenticated user I can configure the following attributes on a Publisher:
111
112 1 bmbouter
  - relative_path (str) \[optional\] The (relative) path component of the published url.
113 50 bmbouter
  - name - (str) \[required\] contains the name.
114 109 amacdona@redhat.com
  - last_published (datetime) \[read-only\] When the last successful publis%{color:red}h occurred.
115 50 bmbouter
  - last_updated (datetime) \[read-only\] The datetime of the last publisher update.
116 1 bmbouter
  - <span style="color:red;">auto_publish(bool) - ??? consider adding auto-publish feature to MVP</span>
117
118 123 bmbouter
## Distributions
119 1 bmbouter
120 123 bmbouter
As an authenticated user, I can CRUD Distributions:
121 1 bmbouter
122 123 bmbouter
  - Create a Distribution.
123
  - Read a Distribution
124
  - List Distributions
125
  - Update all mutable Distribution fields (synchronous)  
126
    \- base path  
127
    \- http  
128
    \- https
129
  - Delete an Distribution (synchronous)
130
131
As a user, my distribution base paths don't conflict and my create/update is rejected identifying the conflicting distributions \[[2987](https://pulp.plan.io/issues/2987)\]
132
133
As an authenticated user, I can create or update a distribution that is not associated with any publication (NULL)
134
135
As an authenticated user, I can create or update a distribution that is not associated with any publisher (NULL)
136
137
As a user, I can update a Distribution to distribute a specific Publication
138
139
As a user, I want a newly created publication to be automatically served by the content as defined by distributions.
140
141
As a user, I can see the full urls my base path is served at (one for http and one for https depending on what is on)
142
143 109 amacdona@redhat.com
As an authenticated user, I have filters on the Distribution list: \[[3082](https://pulp.plan.io/issues/3082)\]
144
145 1 bmbouter
  - name: (equality, name_in_list) 
146
  - base_path: (equality, substring, base_path_in_list)
147
148
## Publications
149
150 141 daviddavis
As an authenticated user, when creating a Publication, I can post a repo version href to be published. \[[3221](https://pulp.plan.io/issues/3221)\]
151 1 bmbouter
152 142 daviddavis
As an authenticated user, I can publish a repository's latest version by posting a repository href to be published. \[[3223](https://pulp.plan.io/issues/3223)\]
153 130 daviddavis
154 140 daviddavis
As an authenticated user, I can view which repository version was used to create a particular publication. \[[3237](https://pulp.plan.io/issues/3237)\]
155 130 daviddavis
156
As an authenticated user, I can read Publication(s)
157
158
  - Read a Publication - id, created datetime, list of distribution hrefs, repo version
159 120 bmbouter
  - List all Publications - ordered by created datetime in descending order
160
161 130 daviddavis
As an authenticated user, I can delete publications.  
162
\- asynchronously with a lock on the repository version.  
163
\- prevented if associated with a distribution.  
164
\- single object only.
165
166 120 bmbouter
As an authenticated user, I can list publications and I have enough information to choose which ones to delete.
167
168
  - choose by created (older ones or perhaps latest)
169
  - choose not associated to a distribution.
170
  - does not imply filtering
171
172
As an authenticated user, I can list publications and i have enough information to select a publication to be associated with a distribution.
173
174
  - choose by created (latest or just by publish date)  
175
    \- manual promotion. "My rawhide publication has been tested and now I want to promote it to stable".  
176
    \- rollback to an earlier publication.
177
  - does not imply filtering
178 109 amacdona@redhat.com
179 72 mhrivnak
As an authenticated user, I can determine if and how a publication is distributed.
180 1 bmbouter
181 144 dkliban@redhat.com
## Exporters
182 134 bmbouter
183 144 dkliban@redhat.com
<span style="color:black;">As a plugin writer, I can contribute an exporter that is discovered by core</span>  
184
<span style="color:black;">As a plugin writer, I have docs on how to create a discoverable exporter</span>  
185
<span style="color:black;">As a plugin writer, I can contribute an exporter that uses a publication.</span>
186 134 bmbouter
187 66 mhrivnak
## Sync and Publish
188 19 bmbouter
189
As an authenticated user, I can trigger an importer to sync. \[done\]
190
191
  - I can follow the progress of all syncs. (Syncs are asynchronous.)
192
  - I cannot pass "sync" options.
193 68 mhrivnak
  - Auto-publish is not included as an importer property.
194 71 mhrivnak
195 70 mhrivnak
As an authenticated user, I can trigger a publisher to publish. \[done\]
196 1 bmbouter
197 102 bmbouter
  - I can follow the progress of all publishes. (Publishes are asynchronous.)
198 29 bmbouter
  - I cannot pass "publish" options.
199 99 bmbouter
200 113 bmbouter
## Content Manipulation
201 99 bmbouter
202
#### Uploading Artifacts
203
204
As an authenticated user, I can create an Artifact by uploading a file. \[done\]
205 113 bmbouter
206 99 bmbouter
As an authenticated user, I can specify a size and/or digest to validate the uploaded file. \[done\]
207
208 1 bmbouter
#### Creating Content Units
209 99 bmbouter
210 1 bmbouter
As an authenticated user, I can create a content unit by providing the content type (in the URL), references to Artifacts, and the metadata supplied in the POST body. \[done\]
211 101 bmbouter
212 1 bmbouter
#### Simple Copy
213 126 amacdona@redhat.com
214 136 daviddavis
As an authenticated user, I can search (synchronous call) a repository version's content using filtering.
215 101 bmbouter
216 136 daviddavis
  - note: In a separate call (async), I can add_many or remove_many to another repository's latest version.
217 101 bmbouter
218
#### Complex Copy
219
220 136 daviddavis
As a plugin writer I can provide a rich search features with arbitrary viewsets. e.g. depsolving, versioning, etc
221 101 bmbouter
222
Examples of specific plugin use cases motivating the above general viewset
223
224 1 bmbouter
  - As an authenticated user, I can add an Errata from one repository to another repository along with packages mentioned in the Errata and all their dependencies that are present in the source repository.
225 101 bmbouter
  - As an authenticated user, I can add bunch of dependencies and store n versions back for each RPM.
226 1 bmbouter
  - As an authenticated user, I can use depsolving and versioning copy features together
227 71 mhrivnak
  - As an authenticated user, I can copy a puppet module and all of it's dependencies from one repository to another. 
228 95 bmbouter
  - As an authenticated user, I can depsolve units to be added to a destination repo based on an errata
229 1 bmbouter
230 127 bmbouter
#### Delete
231 1 bmbouter
232 127 bmbouter
As an authenticated user, I can delete a specific content unit
233
234
  - If the content unit is still in at least one repository version the delete fails
235
  - Error message saying that the unit is in use by a repo version and a link to the filter to return all of the repo versions.
236
  - Content unit deletion needs to be race condition free. For example: cannot delete a content unit during (for example)  
237
    \- sync that may be assuming the content exits.  
238
    \- copy operation
239
240
<!-- end list -->
241 1 bmbouter
242 112 bmbouter
  - As a user, I know that files (Artifacts) associated with the Content unit are not removed by this call (docs)
243
244
#### Filtering
245 1 bmbouter
246 130 daviddavis
As an authenticated user, I can filter Content by repository version information when plugin writers have provided such a filter
247 112 bmbouter
248 130 daviddavis
As an authenticated user, I can filter content by repository version
249 112 bmbouter
250 1 bmbouter
As an authenticated user, I can filter content by type
251
252 112 bmbouter
As an authenticated user, I can filter content on plugin specific attributes when plugin writers have provided such a filter
253
254 129 daviddavis
## Versioned Repositories
255 1 bmbouter
256
#### CRD
257 129 daviddavis
258
As an authenticated user, I can create a new repository version. \[[3173](https://pulp.plan.io/issues/3173)\]
259
260 137 daviddavis
As an authenticated user, I can list versions for a particular repository. \[done\]
261 129 daviddavis
262 136 daviddavis
  - Pagination is supported
263
264 140 daviddavis
As an authenticated user, I can filter repository versions by: \[[3238](https://pulp.plan.io/issues/3238)\]
265 129 daviddavis
266
  - number (equality, lt/lte, gt/gte)
267
  - content id (equality, content_in_list)
268 136 daviddavis
  - created datetime (range)
269 133 amacdona@redhat.com
270 138 daviddavis
As an authenticated user, I can delete any repository version. \[[3219](https://pulp.plan.io/issues/3219)\]
271 1 bmbouter
272 138 daviddavis
As an authenticated user, I can view content that was added or removed in a particular repository version (as compared to the previous version). \[done\]
273 129 daviddavis
274
#### Repository Version Content
275
276 139 daviddavis
As a user, I know content sets for repository versions are immutable. \[done\]
277 129 daviddavis
278 139 daviddavis
As an authenticated user, I can list the content in a particular repository version \[done\]
279 40 bmbouter
280 1 bmbouter
  - All fields are included
281
  - Pagination is supported
282 43 bmbouter
283 139 daviddavis
As an authenticated user, I can create a new version by adding or removing content to the latest version. \[[3234](https://pulp.plan.io/issues/3234)\]
284 129 daviddavis
285 130 daviddavis
  - I can follow the progress. (adding/removing are asynchronous).
286 136 daviddavis
  - can add and remove together in a single call
287 130 daviddavis
288 136 daviddavis
As a user, I have docs that when a new RepositoryVersion is created, add_many and remove_many are performed before any Plugin code is executed.
289 43 bmbouter
290 95 bmbouter
## Orphan Content Units and Artifacts
291 43 bmbouter
292 95 bmbouter
As an authenticated user, I can cause an action that cleans up **both** orphaned content units and orphaned artifacts.
293
294 1 bmbouter
  - I cannot specify the units specifically (all types).
295 22 bmbouter
  - I can follow the progress of all cleanups. (Cleanups are asynchronous.)
296
297 76 mhrivnak
## Task Management
298
299 22 bmbouter
As an authenticated user, I can list all tasks
300 76 mhrivnak
301 22 bmbouter
  - <span style="color:orange;">Filtering support on \['state', 'id', 'group'\]</span>
302
  - <span style="color:orange;">This does not include associated progress reports</span>
303
304
As an authenticated user, I can see a detail view for a specific task \[done\]
305 76 mhrivnak
306 1 bmbouter
  - all attributes of a task
307
  - all associated progress reports
308
309 77 mhrivnak
As an authenticated user, I can cancel a task \[done\]
310
311 1 bmbouter
  - don't dare to use the DELETE verb!
312
313 114 daviddavis
As an authenticated user, I can delete tasks.
314 110 daviddavis
315
As an authenticated user, I can filter tags by: \[[3144](https://pulp.plan.io/issues/3144)\]
316
317
  - state (equality, state_in_list)
318
  - started_at(started_in_range)
319
  - finished_at(finished_in_range)
320 78 mhrivnak
  - worker (equality)
321 1 bmbouter
  - parent (equality)
322
323
## Task Group
324
325 134 bmbouter
<span style="color:red;">As an authenticated user, I can know the total count and done count of all tasks in a group</span>  
326
<span style="color:red;">As an authenticated user, I cannot delete or modify a task group, I can only interact act directly on the related tasks</span>  
327
<span style="color:red;">As an authenticated user, I can have the hrefs of the tasks grouped by state (done, running, errored, unstarted, etc).</span>
328 1 bmbouter
329 121 bmbouter
## Status
330 42 dkliban@redhat.com
331 80 mhrivnak
As an unauthenticated user I can view the status of Pulp workers and resource managers. \[done\]
332 46 bmbouter
333 28 bmbouter
As an unauthenticated user I can view the status of the web server's connection to the database and message broker. \[done\]
334 110 daviddavis
335 115 daviddavis
As an unauthenticated user I can view the versions of core and each installed plugin.
336 110 daviddavis
337 115 daviddavis
## Workers
338 110 daviddavis
339
As an authenticated user, I can filter workers by: \[[3143](https://pulp.plan.io/issues/3143)\]
340
341 116 daviddavis
  - last_heartbeat (range)
342 1 bmbouter
  - name (substring)
343 83 mhrivnak
  - gracefully_stopped (equality)
344 1 bmbouter
345 83 mhrivnak
## Plugin API
346 28 bmbouter
347 83 mhrivnak
As a plugin writer, I have a plugin API that is semantically versioned at 0.x separate from the REST API \[done\]
348 28 bmbouter
349 83 mhrivnak
As a plugin writer, I can report progress with a message and state \[done\]
350 28 bmbouter
351 83 mhrivnak
As a plugin writer, I can report progress with an optional suffix \[done\]
352 28 bmbouter
353 83 mhrivnak
As a plugin writer, I can report progress with a total count of things to do an the current count of things done \[done\]
354 28 bmbouter
355 83 mhrivnak
As a plugin writer, non-fatal exceptions on the Task and are included in the Task detail. non_fatal exceptions do not cause the Task to be marked as failed, but may be interpreted by the user as not fully successful. \[done\]
356 1 bmbouter
357 28 bmbouter
As a plugin writer, the working directory is set before Task work is done and cleaned up afterwards. I should not need to interact with the file system outside of the working dir. \[done\]
358 1 bmbouter
359 84 bmbouter
<span style="color:red;">As a plugin writer, I can provide a subclassed Importer. The importer's responsibility is to synchronize the content of a Pulp repository with the content of a remote repository. (a circular import problem needs to be discussed and may cause this to change) \[done\]</span>
360 28 bmbouter
361 83 mhrivnak
<span style="color:red;">As a plugin writer, I can provide a subclassed Publisher. The publisher's responsibility is to publish content. (a circular import problem needs to be discussed and may cause this to change) \[done\]</span>
362 28 bmbouter
363
As a plugin writer, I can define unit types by subclassing Content models to provide concrete content unit types to be manged by the platform. \[done\]
364
365 83 mhrivnak
As a plugin writer, I can interact with and create Artifacts \[done\]
366 1 bmbouter
367 8 Ichimonji10
As a plugin writer, my app will be discovered by Pulp's app via an entry point provided by the plugin writer \[done\]
368 1 bmbouter
369 112 bmbouter
As a plugin writer, I can use the plugin API to query content units/artifacts associated with a repository. \[done\]
370
371
As a plugin writer, I can add and remove content units to and from a repository. \[done\]
372
373
As a plugin writer, I have documentation that shows how I can add filters to filter content responsibly.
374
375 136 daviddavis
As a plugin writer, I have documentation on how to write a filter for my Content that can use the RepositoryVersion manager.
376 1 bmbouter
377 136 daviddavis
  - note: This will allow users to filter content by repository version
378 134 bmbouter
379 106 bmbouter
## Plugin Writer "live APIs"
380
381 1 bmbouter
As a plugin writer, I can provide a Live API with arbitrary views and viewsets.  
382 106 bmbouter
As a plugin writer, I have documentation on what URLs I should -not use for my views and viewsets
383 1 bmbouter
384 108 bmbouter
Here are some concrete use cases driving the very Live API use cases above:
385 1 bmbouter
386 108 bmbouter
~~~
387
# Concrete user use cases:
388
    As an authenticated user, I can use the puppet client to fetch content from Pulp using the Forge API
389 1 bmbouter
    As an authenticated user I can use the docker client to fetch content from Pulp using the Docker v1 API
390 113 bmbouter
    As an authenticated user I can use the docker client to fetch content from Pulp using the Docker v2 API
391 108 bmbouter
392
# Concrete plugin writer use cases
393
    As a puppet plugin developer, I can provide a viewset which handles the server side of the puppet Forge v3 API
394
    As a docker plugin developer, I can provide a viewset which handles the server side of the docker v1 API
395
    As a docker plugin developer, I can provide a viewset which handles the server side of the docker v2 API
396 117 bmbouter
~~~
397 1 bmbouter
398 134 bmbouter
## Plugin Writer Versioned Repositories
399
400
As a plugin writer writing sync code, I have a reference to the pre-saved repository version object that core created for me
401
402
  - As a plugin writer, I have exclusive access to a repository version while sync is running.
403
404 136 daviddavis
As a plugin writer, I know the new RepositoryVersion will automatically have all the content from the previous version.
405 134 bmbouter
406 136 daviddavis
As a plugin writer, I can add and remove content from the repository version I was given.
407 134 bmbouter
408 136 daviddavis
As a plugin writer, I have docs to know when I need to create a new repository version myself. e.g. when performing a complex copy operation like depsolving.
409 134 bmbouter
410
As a plugin writer, I have exclusive access to a repository version while my code is running.
411
412 136 daviddavis
As a plugin writer, I have docs telling me that a repository version content set is immutable.
413 134 bmbouter
414
## Plugin Writer Publishing
415
416
As a plugin writer, I am assured that a repository version will be fully constructed and not deleted while publish code is running.
417
418
## Plugin Storage
419
420
As a plugin writer, the plugin API provides an API that returns a fully qualified path to a shared storage location used to store content. \["3182"https://pulp.plan.io/issues/3182\]
421
422 113 bmbouter
## Webserver Deployment
423 106 bmbouter
424 132 bmbouter
As a system administrator, I can deploy all Pulp web applications on one process  
425
As a system administrator, I can deploy the Pulp REST API exclusively in one process  
426
As a system administrator, I can deploy the Pulp content serving view exclusively in one process
427 113 bmbouter
428 132 bmbouter
As a system administrator, I can deploy all Pulp web applications inside a virtualenv.  
429
As a system administrator, I can deploy all Pulp web applications without root permissions.
430 93 bizhang
431 1 bmbouter
## CLI
432 26 bmbouter
433
We will use coreapi-cli to generate a one to one mapping of cli commands to rest api schema #3068  
434
<span style="color:orange;">We will have a wrapper for coreapi-cli. This wrapper will handle parallel progress reporting</span>
435
436
## Download API
437
438
As a plugin writer, I can download files via
439
440
  - http://
441 27 bmbouter
  - https://
442
  - file://
443 26 bmbouter
444
As a plugin writer, I can configure a downloader with:
445
446
  - Basic Auth
447
  - SSL Cert Client Auth
448
  - Custom CAs will be configured via a "trust store" either on the system or similar. Pulp will not do anything to read/load/manage CAs directly.
449
450
As a plugin writer, I can provide arbitrary behaviors for customized downloaders
451
452
  - For example token authentication in the docker plugin
453
454
As a plugin writer, I can have connection pooling/reuse
455
456
As a plugin writer, I have proxy settings
457
458
  - proxy url (containing basic auth info)
459
460 113 bmbouter
As a plugin writer, I can have great logs
461 26 bmbouter
462
As an authenticated user, I have documentation about how to use something for bandwidth limiting
463
464
As a plugin writer, I can configure the validation mechanisms used at download time
465
466 1 bmbouter
  - checksum validation - minimum (md5, sha1, sha256, sha512)
467
  - size validation
468
469 26 bmbouter
<span style="color:red;">As a plugin writer, I expect units that are missing from the remote repository to not be created in Pulp when using the immediate download policy.</span>
470
471 1 bmbouter
<span style="color:red;">As a plugin writer, I expect units that are missing from the remote repository to be created in Pulp when using background or on_demand download policies.</span>
472 26 bmbouter
473 27 bmbouter
As a plugin writer, the plugin API provides tooling whereby I can provide the content to be added and removed from the repository. This tooling supports both immediate and deferred downloading.
474 26 bmbouter
475
As a plugin writer I can manage the catalog by using ChangeSets
476 1 bmbouter
477
As a plugin writer, the plugin can participate in adding content for cases where the decision to add additional content is based content that has been downloaded.
478
479 118 bmbouter
As a plugin writer, I can fetch content myself (but I am not encouraged to do so) with code I write
480
481 1 bmbouter
As a plugin writer, I can CRUD content units
482
483 86 mhrivnak
## Migrations only involving Pulp 3
484 1 bmbouter
485 87 mhrivnak
Users can run "pulp-manager migrate" to migrate the database and adjust state in other locations (filesystem, message broker, ...). \[done\]
486 1 bmbouter
487
## Web Server Integration
488 122 jortel@redhat.com
489 1 bmbouter
As a user, I can have content efficiently served to me by Apache by Pulp using the X-SEND response headers. \[done\]  
490 122 jortel@redhat.com
As a user, I can have content efficiently served to me by Nginx by Pulp using the X-Accel-Redirect response headers. \[done\]
491 105 bmbouter
492 132 bmbouter
As a user, I can have an Ansible role to install Apache which enables Apache integration for Pulp and configures Apache to serve Pulp. \[[2921](https://pulp.plan.io/issues/2921)\]  
493
As a user, I can have an Ansible role to install Nginx which enables Nginx integration for Pulp and configures Nginx to serve Pulp. \[[2922](https://pulp.plan.io/issues/2922)\]
494 87 mhrivnak
495 89 mhrivnak
## Glossary
496 88 mhrivnak
497 131 bmbouter
Add (Content Unit): An operation causing a new repository version to contain a content unit(s)
498 130 daviddavis
499 119 bmbouter
Applicability - A plugin defined term meaning when a package update available in a repository is applicable to a given consumer as determined by the Consumer Profile.
500 1 bmbouter
501
Artifact - A file associated with one content (unit). Artifacts are not shared between content (units). Create a content unit using an uploaded file ID as the source for its metadata. Create Artifacts associated with the content unit using an uploaded file ID for each; commit as a single transaction.
502
503 131 bmbouter
Content (unit) - A single piece of content manged by Pulp. Each file associated with a content (unit) is called an Artifact. Each content (unit) may have zero or many Artifacts.
504 1 bmbouter
505
Distribution: Where and how the content app serves a Publication. i.e. http vs https and base path component of the URL. A Distribution defines:
506
507
  - the base path of the repository publication (required)
508
  - serving via http (default=False)
509
  - serving via https (default=True)
510
  - relationship w/ a Publisher for auto-distribution (should be allowed to be NULL)
511
  - relationship with Publication (should be allowed to be NULL)
512 134 bmbouter
513 145 dkliban@redhat.com
Exporter: An Exporter exports a Publication out of Pulp. e.g. rsync exporter exports content to a remote server
514 132 bmbouter
515
Live API: a viewset endpoint contributed by plugin. For examples see the [associated MVP section](https://pulp.plan.io/projects/pulp/wiki/Pulp_3\_Minimum_Viable_Product#Plugin-Writer-live-APIs)
516 131 bmbouter
517
Orphan Artifact: An Artifact that is associated with 0 Content Units and 0 Publications
518
519
Orphan Content (unit): A content unit that is a member of 0 repository versions
520
521
Remove (content unit): An operation causing a new repository version to not contain a content unit(s)
522
523
Repository - A named collection of repository versions.
524
525
Repository Version - An immutable set of content which is versioned by a sequential number.