Project

Profile

Help

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

amacdona@redhat.com, 04/02/2018 07:38 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 152 amacdona@redhat.com
  - Update all mutable repo fields (asynchronous) \[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 152 amacdona@redhat.com
As an authenticated user, when viewing a repository, I can discover a URL to the latest version of a repository. \[done\]\[[3235](https://pulp.plan.io/issues/3235)\]
54 130 daviddavis
55 149 dkliban@redhat.com
## Remotes
56 51 bmbouter
57 149 dkliban@redhat.com
note: Remote attributes will commonly be available on remotes, but aren't guaranteed to be used by all remotes.
58 51 bmbouter
59 149 dkliban@redhat.com
As an authenticated user, I can CRUD an remote
60 18 dkliban@redhat.com
61 149 dkliban@redhat.com
  - Create an remote
62
  - Read an remote
63 152 amacdona@redhat.com
  - Update all mutable remote fields (asynchronous)
64 149 dkliban@redhat.com
  - Delete an remote (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 48 amacdona@redhat.com
  - ssl_ca_certificate (str) \[optional\] String containing a PEM encoded CA certificate used to validate the server certificate presented by the external source.
75 1 bmbouter
  - ssl_client_certificate (str) \[optional\] Contains a PEM encoded client certificate used for authentication.
76 135 bmbouter
  - 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 1 bmbouter
  - proxy_url (str) \[optional\] Contains the proxy URL. Format: scheme://user:password@host:port.
79 136 daviddavis
  - 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
  - name (str) \[required\] Contains the name.
82 149 dkliban@redhat.com
  - last_updated (datetime) \[read-only\] Contains the datetime of the last remote update.
83
  - last_synced (datetime) \[read-only\] Contains the datetime of the last remote sync.
84 50 bmbouter
85 151 dkliban@redhat.com
<span style="color:red;">As an authenticated user, I can define a default remote on a repo via href to be used whenever a new repo version is created.</span>
86 130 daviddavis
87 52 bmbouter
## Publishers
88 51 bmbouter
89
note: Publisher attributes will commonly be available on publishers, but aren't guaranteed to be used by all publishers.
90 47 bmbouter
91 18 dkliban@redhat.com
As an authenticated user, I can CRUD a publisher
92
93
  - Create a publisher
94 1 bmbouter
  - Read a publisher
95 152 amacdona@redhat.com
  - Update all mutable publisher fields (asynchronous)
96 50 bmbouter
  - Delete a publisher (asynchronous)
97 1 bmbouter
98 113 bmbouter
As an authenticated user, I have filters on the Publisher list: \[[3081](https://pulp.plan.io/issues/3081)\]
99 109 amacdona@redhat.com
100
  - id: (id_in_list) \# id equality is not necessary, objects are referenced by id
101
  - name: (equality, name_in_list)
102
103 50 bmbouter
As an authenticated user I can configure the following attributes on a Publisher:
104
105 1 bmbouter
  - relative_path (str) \[optional\] The (relative) path component of the published url.
106 152 amacdona@redhat.com
  - name (str) \[required\] contains the name.
107 109 amacdona@redhat.com
  - last_published (datetime) \[read-only\] When the last successful publis%{color:red}h occurred.
108 50 bmbouter
  - last_updated (datetime) \[read-only\] The datetime of the last publisher update.
109 1 bmbouter
  - <span style="color:red;">auto_publish(bool) - ??? consider adding auto-publish feature to MVP</span>
110
111 123 bmbouter
## Distributions
112 1 bmbouter
113 123 bmbouter
As an authenticated user, I can CRUD Distributions:
114 1 bmbouter
115 123 bmbouter
  - Create a Distribution.
116
  - Read a Distribution
117
  - List Distributions
118
  - Update all mutable Distribution fields (synchronous)  
119
    \- base path  
120
    \- http  
121
    \- https
122
  - Delete an Distribution (synchronous)
123
124 151 dkliban@redhat.com
<span style="color:red;">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)\]</span>
125 123 bmbouter
126
As an authenticated user, I can create or update a distribution that is not associated with any publication (NULL)
127
128
As an authenticated user, I can create or update a distribution that is not associated with any publisher (NULL)
129
130
As a user, I can update a Distribution to distribute a specific Publication
131
132 151 dkliban@redhat.com
<span style="color:red;">As a user, I want a newly created publication to be automatically served by the content as defined by distributions.</span>
133 123 bmbouter
134 150 dkliban@redhat.com
As a user, I can see the full urls my base path is served at
135 123 bmbouter
136 151 dkliban@redhat.com
<span style="color:red;">As an authenticated user, I have filters on the Distribution list: \[[3082](https://pulp.plan.io/issues/3082)\]</span>
137 109 amacdona@redhat.com
138 1 bmbouter
  - name: (equality, name_in_list) 
139
  - base_path: (equality, substring, base_path_in_list)
140
141
## Publications
142
143 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)\]
144 1 bmbouter
145 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)\]
146 130 daviddavis
147 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)\]
148 130 daviddavis
149
As an authenticated user, I can read Publication(s)
150
151
  - Read a Publication - id, created datetime, list of distribution hrefs, repo version
152 120 bmbouter
  - List all Publications - ordered by created datetime in descending order
153
154 130 daviddavis
As an authenticated user, I can delete publications.  
155
\- asynchronously with a lock on the repository version.  
156
\- prevented if associated with a distribution.  
157
\- single object only.
158
159 120 bmbouter
As an authenticated user, I can list publications and I have enough information to choose which ones to delete.
160
161
  - choose by created (older ones or perhaps latest)
162
  - choose not associated to a distribution.
163
  - does not imply filtering
164
165
As an authenticated user, I can list publications and i have enough information to select a publication to be associated with a distribution.
166
167
  - choose by created (latest or just by publish date)  
168
    \- manual promotion. "My rawhide publication has been tested and now I want to promote it to stable".  
169
    \- rollback to an earlier publication.
170
  - does not imply filtering
171 109 amacdona@redhat.com
172 72 mhrivnak
As an authenticated user, I can determine if and how a publication is distributed.
173 1 bmbouter
174 144 dkliban@redhat.com
## Exporters
175 134 bmbouter
176 144 dkliban@redhat.com
<span style="color:black;">As a plugin writer, I can contribute an exporter that is discovered by core</span>  
177
<span style="color:black;">As a plugin writer, I have docs on how to create a discoverable exporter</span>  
178
<span style="color:black;">As a plugin writer, I can contribute an exporter that uses a publication.</span>
179 134 bmbouter
180 66 mhrivnak
## Sync and Publish
181 19 bmbouter
182
As an authenticated user, I can trigger an importer to sync. \[done\]
183
184
  - I can follow the progress of all syncs. (Syncs are asynchronous.)
185 151 dkliban@redhat.com
  - <span style="color:red;">I cannot pass "sync" options. \[DOES THIS PRODUCE AN ERROR??\]</span>
186
  - <span style="color:red;">Auto-publish is not included as an importer property. \[SEEMS LIKE AN ANTI-REQUIREMENT\]</span>
187 71 mhrivnak
188 70 mhrivnak
As an authenticated user, I can trigger a publisher to publish. \[done\]
189 1 bmbouter
190 102 bmbouter
  - I can follow the progress of all publishes. (Publishes are asynchronous.)
191 151 dkliban@redhat.com
  - <span style="color:red;">I cannot pass "publish" options. \[DOES THIS PRODUCE AN ERROR??\]</span>
192 99 bmbouter
193 113 bmbouter
## Content Manipulation
194 99 bmbouter
195
#### Uploading Artifacts
196
197
As an authenticated user, I can create an Artifact by uploading a file. \[done\]
198 113 bmbouter
199 99 bmbouter
As an authenticated user, I can specify a size and/or digest to validate the uploaded file. \[done\]
200
201 1 bmbouter
#### Creating Content Units
202 99 bmbouter
203 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\]
204 101 bmbouter
205 1 bmbouter
#### Simple Copy
206 126 amacdona@redhat.com
207 136 daviddavis
As an authenticated user, I can search (synchronous call) a repository version's content using filtering.
208 101 bmbouter
209 151 dkliban@redhat.com
  - note: In a separate call (async), I can add_content_units or remove_content_units to another repository's latest version.
210 101 bmbouter
211
#### Complex Copy
212
213 136 daviddavis
As a plugin writer I can provide a rich search features with arbitrary viewsets. e.g. depsolving, versioning, etc
214 101 bmbouter
215
Examples of specific plugin use cases motivating the above general viewset
216
217 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.
218 101 bmbouter
  - As an authenticated user, I can add bunch of dependencies and store n versions back for each RPM.
219 1 bmbouter
  - As an authenticated user, I can use depsolving and versioning copy features together
220 71 mhrivnak
  - As an authenticated user, I can copy a puppet module and all of it's dependencies from one repository to another. 
221 95 bmbouter
  - As an authenticated user, I can depsolve units to be added to a destination repo based on an errata
222 1 bmbouter
223 127 bmbouter
#### Delete
224 1 bmbouter
225 127 bmbouter
As an authenticated user, I can delete a specific content unit
226
227
  - If the content unit is still in at least one repository version the delete fails
228
  - 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.
229 151 dkliban@redhat.com
  - <span style="color:red;">Content unit deletion needs to be race condition free. For example: cannot delete a content unit during (for example)  
230
 \- sync that may be assuming the content exits.  
231
 \- copy operation</span>
232 127 bmbouter
233
<!-- end list -->
234 1 bmbouter
235 112 bmbouter
  - As a user, I know that files (Artifacts) associated with the Content unit are not removed by this call (docs)
236
237
#### Filtering
238 1 bmbouter
239 151 dkliban@redhat.com
<span style="color:red;">As an authenticated user, I can filter Content by repository version information when plugin writers have provided such a filter</span>
240 112 bmbouter
241 130 daviddavis
As an authenticated user, I can filter content by repository version
242 112 bmbouter
243 1 bmbouter
As an authenticated user, I can filter content by type
244
245 151 dkliban@redhat.com
<span style="color:red;">As an authenticated user, I can filter content on plugin specific attributes when plugin writers have provided such a filter</span>
246 112 bmbouter
247 129 daviddavis
## Versioned Repositories
248 1 bmbouter
249
#### CRD
250 129 daviddavis
251
As an authenticated user, I can create a new repository version. \[[3173](https://pulp.plan.io/issues/3173)\]
252
253 137 daviddavis
As an authenticated user, I can list versions for a particular repository. \[done\]
254 129 daviddavis
255 136 daviddavis
  - Pagination is supported
256
257 140 daviddavis
As an authenticated user, I can filter repository versions by: \[[3238](https://pulp.plan.io/issues/3238)\]
258 129 daviddavis
259
  - number (equality, lt/lte, gt/gte)
260
  - content id (equality, content_in_list)
261 136 daviddavis
  - created datetime (range)
262 133 amacdona@redhat.com
263 138 daviddavis
As an authenticated user, I can delete any repository version. \[[3219](https://pulp.plan.io/issues/3219)\]
264 1 bmbouter
265 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\]
266 129 daviddavis
267
#### Repository Version Content
268
269 139 daviddavis
As a user, I know content sets for repository versions are immutable. \[done\]
270 129 daviddavis
271 139 daviddavis
As an authenticated user, I can list the content in a particular repository version \[done\]
272 40 bmbouter
273 1 bmbouter
  - All fields are included
274
  - Pagination is supported
275 43 bmbouter
276 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)\]
277 129 daviddavis
278 130 daviddavis
  - I can follow the progress. (adding/removing are asynchronous).
279 136 daviddavis
  - can add and remove together in a single call
280 130 daviddavis
281 152 amacdona@redhat.com
<span style="color:red;">As a user, I have docs that when a new RepositoryVersion is created, add_many and remove_many are performed without executing any Plugin.</span>
282 43 bmbouter
283 95 bmbouter
## Orphan Content Units and Artifacts
284 43 bmbouter
285 151 dkliban@redhat.com
<span style="color:red;">As an authenticated user, I can cause an action that cleans up **both** orphaned content units and orphaned artifacts.</span>
286 95 bmbouter
287 1 bmbouter
  - I cannot specify the units specifically (all types).
288 22 bmbouter
  - I can follow the progress of all cleanups. (Cleanups are asynchronous.)
289
290 76 mhrivnak
## Task Management
291
292 22 bmbouter
As an authenticated user, I can list all tasks
293 76 mhrivnak
294 146 daviddavis
  - <span style="color:orange;">Filtering support on \['state', 'id'\]</span>
295 22 bmbouter
  - <span style="color:orange;">This does not include associated progress reports</span>
296
297
As an authenticated user, I can see a detail view for a specific task \[done\]
298 76 mhrivnak
299 1 bmbouter
  - all attributes of a task
300
  - all associated progress reports
301
302 77 mhrivnak
As an authenticated user, I can cancel a task \[done\]
303
304 1 bmbouter
  - don't dare to use the DELETE verb!
305
306 114 daviddavis
As an authenticated user, I can delete tasks.
307 110 daviddavis
308 147 daviddavis
As an authenticated user, I can filter tasks by: \[[3144](https://pulp.plan.io/issues/3144)\]
309 110 daviddavis
310
  - state (equality, state_in_list)
311
  - started_at(started_in_range)
312
  - finished_at(finished_in_range)
313 78 mhrivnak
  - worker (equality)
314 1 bmbouter
  - parent (equality)
315
316 121 bmbouter
## Status
317 42 dkliban@redhat.com
318 80 mhrivnak
As an unauthenticated user I can view the status of Pulp workers and resource managers. \[done\]
319 46 bmbouter
320 28 bmbouter
As an unauthenticated user I can view the status of the web server's connection to the database and message broker. \[done\]
321 110 daviddavis
322 115 daviddavis
As an unauthenticated user I can view the versions of core and each installed plugin.
323 110 daviddavis
324 115 daviddavis
## Workers
325 110 daviddavis
326
As an authenticated user, I can filter workers by: \[[3143](https://pulp.plan.io/issues/3143)\]
327
328 116 daviddavis
  - last_heartbeat (range)
329 1 bmbouter
  - name (substring)
330 83 mhrivnak
  - gracefully_stopped (equality)
331 1 bmbouter
332 83 mhrivnak
## Plugin API
333 28 bmbouter
334 83 mhrivnak
As a plugin writer, I have a plugin API that is semantically versioned at 0.x separate from the REST API \[done\]
335 28 bmbouter
336 83 mhrivnak
As a plugin writer, I can report progress with a message and state \[done\]
337 28 bmbouter
338 83 mhrivnak
As a plugin writer, I can report progress with an optional suffix \[done\]
339 28 bmbouter
340 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\]
341 28 bmbouter
342 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\]
343 1 bmbouter
344 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\]
345 1 bmbouter
346 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>
347 28 bmbouter
348 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>
349 28 bmbouter
350
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\]
351
352 83 mhrivnak
As a plugin writer, I can interact with and create Artifacts \[done\]
353 1 bmbouter
354 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\]
355 1 bmbouter
356 112 bmbouter
As a plugin writer, I can use the plugin API to query content units/artifacts associated with a repository. \[done\]
357
358
As a plugin writer, I can add and remove content units to and from a repository. \[done\]
359
360
As a plugin writer, I have documentation that shows how I can add filters to filter content responsibly.
361
362 136 daviddavis
As a plugin writer, I have documentation on how to write a filter for my Content that can use the RepositoryVersion manager.
363 1 bmbouter
364 136 daviddavis
  - note: This will allow users to filter content by repository version
365 134 bmbouter
366 106 bmbouter
## Plugin Writer "live APIs"
367
368 1 bmbouter
As a plugin writer, I can provide a Live API with arbitrary views and viewsets.  
369 106 bmbouter
As a plugin writer, I have documentation on what URLs I should -not use for my views and viewsets
370 1 bmbouter
371 108 bmbouter
Here are some concrete use cases driving the very Live API use cases above:
372 1 bmbouter
373 108 bmbouter
~~~
374
# Concrete user use cases:
375
    As an authenticated user, I can use the puppet client to fetch content from Pulp using the Forge API
376 1 bmbouter
    As an authenticated user I can use the docker client to fetch content from Pulp using the Docker v1 API
377 113 bmbouter
    As an authenticated user I can use the docker client to fetch content from Pulp using the Docker v2 API
378 108 bmbouter
379
# Concrete plugin writer use cases
380
    As a puppet plugin developer, I can provide a viewset which handles the server side of the puppet Forge v3 API
381
    As a docker plugin developer, I can provide a viewset which handles the server side of the docker v1 API
382
    As a docker plugin developer, I can provide a viewset which handles the server side of the docker v2 API
383 117 bmbouter
~~~
384 1 bmbouter
385 134 bmbouter
## Plugin Writer Versioned Repositories
386
387
As a plugin writer writing sync code, I have a reference to the pre-saved repository version object that core created for me
388
389
  - As a plugin writer, I have exclusive access to a repository version while sync is running.
390
391 136 daviddavis
As a plugin writer, I know the new RepositoryVersion will automatically have all the content from the previous version.
392 134 bmbouter
393 136 daviddavis
As a plugin writer, I can add and remove content from the repository version I was given.
394 134 bmbouter
395 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.
396 134 bmbouter
397
As a plugin writer, I have exclusive access to a repository version while my code is running.
398
399 136 daviddavis
As a plugin writer, I have docs telling me that a repository version content set is immutable.
400 134 bmbouter
401
## Plugin Writer Publishing
402
403
As a plugin writer, I am assured that a repository version will be fully constructed and not deleted while publish code is running.
404
405
## Plugin Storage
406
407
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\]
408
409 113 bmbouter
## Webserver Deployment
410 106 bmbouter
411 132 bmbouter
As a system administrator, I can deploy all Pulp web applications on one process  
412
As a system administrator, I can deploy the Pulp REST API exclusively in one process  
413
As a system administrator, I can deploy the Pulp content serving view exclusively in one process
414 113 bmbouter
415 132 bmbouter
As a system administrator, I can deploy all Pulp web applications inside a virtualenv.  
416
As a system administrator, I can deploy all Pulp web applications without root permissions.
417 93 bizhang
418 1 bmbouter
## CLI
419 26 bmbouter
420
We will use coreapi-cli to generate a one to one mapping of cli commands to rest api schema #3068  
421
<span style="color:orange;">We will have a wrapper for coreapi-cli. This wrapper will handle parallel progress reporting</span>
422
423
## Download API
424
425
As a plugin writer, I can download files via
426
427
  - http://
428 27 bmbouter
  - https://
429
  - file://
430 26 bmbouter
431
As a plugin writer, I can configure a downloader with:
432
433
  - Basic Auth
434
  - SSL Cert Client Auth
435
  - 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.
436
437
As a plugin writer, I can provide arbitrary behaviors for customized downloaders
438
439
  - For example token authentication in the docker plugin
440
441
As a plugin writer, I can have connection pooling/reuse
442
443
As a plugin writer, I have proxy settings
444
445
  - proxy url (containing basic auth info)
446
447 113 bmbouter
As a plugin writer, I can have great logs
448 26 bmbouter
449
As an authenticated user, I have documentation about how to use something for bandwidth limiting
450
451
As a plugin writer, I can configure the validation mechanisms used at download time
452
453 1 bmbouter
  - checksum validation - minimum (md5, sha1, sha256, sha512)
454
  - size validation
455
456 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>
457
458 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>
459 26 bmbouter
460 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.
461 26 bmbouter
462
As a plugin writer I can manage the catalog by using ChangeSets
463 1 bmbouter
464
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.
465
466 118 bmbouter
As a plugin writer, I can fetch content myself (but I am not encouraged to do so) with code I write
467
468 1 bmbouter
As a plugin writer, I can CRUD content units
469
470 86 mhrivnak
## Migrations only involving Pulp 3
471 1 bmbouter
472 87 mhrivnak
Users can run "pulp-manager migrate" to migrate the database and adjust state in other locations (filesystem, message broker, ...). \[done\]
473 1 bmbouter
474
## Web Server Integration
475 122 jortel@redhat.com
476 1 bmbouter
As a user, I can have content efficiently served to me by Apache by Pulp using the X-SEND response headers. \[done\]  
477 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\]
478 105 bmbouter
479 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)\]  
480
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)\]
481 87 mhrivnak
482 89 mhrivnak
## Glossary
483 88 mhrivnak
484 131 bmbouter
Add (Content Unit): An operation causing a new repository version to contain a content unit(s)
485 130 daviddavis
486 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.
487 1 bmbouter
488
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.
489
490 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.
491 1 bmbouter
492
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:
493
494
  - the base path of the repository publication (required)
495
  - serving via http (default=False)
496
  - serving via https (default=True)
497
  - relationship w/ a Publisher for auto-distribution (should be allowed to be NULL)
498
  - relationship with Publication (should be allowed to be NULL)
499 134 bmbouter
500 145 dkliban@redhat.com
Exporter: An Exporter exports a Publication out of Pulp. e.g. rsync exporter exports content to a remote server
501 132 bmbouter
502
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)
503 131 bmbouter
504
Orphan Artifact: An Artifact that is associated with 0 Content Units and 0 Publications
505
506
Orphan Content (unit): A content unit that is a member of 0 repository versions
507
508
Remove (content unit): An operation causing a new repository version to not contain a content unit(s)
509
510
Repository - A named collection of repository versions.
511
512
Repository Version - An immutable set of content which is versioned by a sequential number.