Project

Profile

Help

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

bmbouter, 12/14/2017 09:00 PM
Removing JWT, Consumer Profile Applicability, and lazy downloading

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