https://pulp.plan.io/https://pulp.plan.io/favicon.ico2018-01-16T14:23:43ZPulpPulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=239482018-01-16T14:23:43Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Tracker</strong> changed from <i>Issue</i> to <i>Story</i></li><li><strong>% Done</strong> set to <i>0</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=239682018-01-16T18:28:09Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/23968/diff?detail_id=24428">diff</a>)</li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=239992018-01-17T20:41:03Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Parent issue</strong> set to <i>#3209</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=240362018-01-18T13:12:43Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Copied to</strong> <i><a class="issue tracker-3 status-11 priority-6 priority-default closed child" href="/issues/3295">Story #3295</a>: As a plugin writer, I have a tool that helps me write tasks that create Publications</i> added</li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=240892018-01-19T00:04:06Zdaviddavis
<ul></ul><p>+1 to this task. We should also use these tools internally for <a class="issue tracker-3 status-11 priority-6 priority-default closed child" title="Story: As an authenticated user, I can create a new version by adding or removing content to the latest ... (CLOSED - CURRENTRELEASE)" href="https://pulp.plan.io/issues/3234">#3234</a>.</p> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=241182018-01-19T23:39:27Zjortel@redhat.comjortel@redhat.com
<ul></ul><p>This might be a good fit for the Facade[1] design pattern. The goal is to provide the plugin writer a <em>domain</em> object that can be <em>safely</em> used like a RepositoryVersion but encapsulates the complexity of managing them. By doing so we avoid adding methods that manage other models on the RepositoryVersion model goes against django best practices. And, provides an intuitive and appropriate place for the context manger.</p>
<p>The plugin API could include something like this in a module named repository.py (see similar domain object in tasking.py).</p>
<pre><code class="python syntaxhl" data-language="python"><span class="kn">from</span> <span class="nn">contextlib</span> <span class="kn">import</span> <span class="n">suppress</span>
<span class="kn">from</span> <span class="nn">gettext</span> <span class="kn">import</span> <span class="n">gettext</span>
<span class="kn">from</span> <span class="nn">pulpcore.app</span> <span class="kn">import</span> <span class="n">models</span>
<span class="kn">from</span> <span class="nn">pulpcore.plugin.tasking</span> <span class="kn">import</span> <span class="n">Task</span>
<span class="k">class</span> <span class="nc">RepositoryVersion</span><span class="p">:</span>
<span class="o">@</span><span class="nb">classmethod</span>
<span class="k">def</span> <span class="nf">latest</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">repository</span><span class="p">):</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">repository</span><span class="p">.</span><span class="n">versions</span><span class="p">.</span><span class="n">exclude</span><span class="p">(</span><span class="n">complete</span><span class="o">=</span><span class="bp">False</span><span class="p">).</span><span class="n">latest</span><span class="p">()</span>
<span class="k">return</span> <span class="n">RepositoryVersionFacade</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="o">@</span><span class="nb">classmethod</span>
<span class="k">def</span> <span class="nf">create</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">repository</span><span class="p">):</span>
<span class="k">with</span> <span class="n">transaction</span><span class="p">.</span><span class="n">atomic</span><span class="p">():</span>
<span class="n">version</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">RepositoryVersion</span><span class="p">(</span>
<span class="n">repository</span><span class="o">=</span><span class="n">repository</span><span class="p">,</span>
<span class="n">number</span><span class="o">=</span><span class="n">repository</span><span class="p">.</span><span class="n">last_version</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">repository</span><span class="p">.</span><span class="n">last_version</span> <span class="o">=</span> <span class="n">version</span><span class="p">.</span><span class="n">number</span>
<span class="n">repository</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">version</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
<span class="n">resource</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">CreatedResource</span><span class="p">(</span><span class="n">content_object</span><span class="o">=</span><span class="n">version</span><span class="p">)</span>
<span class="n">resource</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">version</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_model</span> <span class="o">=</span> <span class="n">model</span>
<span class="o">@</span><span class="nb">property</span>
<span class="k">def</span> <span class="nf">content</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># moved from RepositoryVersion model.
</span> <span class="n">associations</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">RepositoryContent</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span>
<span class="n">repository</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">repository</span><span class="p">,</span>
<span class="n">version_added__number__lte</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">number</span><span class="p">).</span><span class="n">exclude</span><span class="p">(</span>
<span class="n">version_removed__number__lte</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">number</span><span class="p">)</span>
<span class="n">content_model</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">_repository</span><span class="p">.</span><span class="n">content</span><span class="p">.</span><span class="n">model</span>
<span class="k">return</span> <span class="n">content_model</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span><span class="n">version_memberships__in</span><span class="o">=</span><span class="n">associations</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">add_content</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="c1"># moved from RepositoryVersion model.
</span> <span class="k">assert</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">complete</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s">'Complete repository version is immutable.'</span><span class="p">)</span>
<span class="k">with</span> <span class="n">suppress</span><span class="p">(</span><span class="n">IntegrityError</span><span class="p">):</span>
<span class="n">association</span> <span class="o">=</span> <span class="n">RepositoryContent</span><span class="p">(</span>
<span class="n">repository</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">repository</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">,</span>
<span class="n">version_added</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">)</span>
<span class="n">association</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">remove_content</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">):</span>
<span class="c1"># moved from RepositoryVersion model.
</span> <span class="k">assert</span> <span class="ow">not</span> <span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">complete</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s">'Complete repository version is immutable.'</span><span class="p">)</span>
<span class="n">q_set</span> <span class="o">=</span> <span class="n">models</span><span class="p">.</span><span class="n">RepositoryContent</span><span class="p">.</span><span class="n">objects</span><span class="p">.</span><span class="nb">filter</span><span class="p">(</span>
<span class="n">repository</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">repository</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="n">content</span><span class="p">,</span>
<span class="n">version_removed</span><span class="o">=</span><span class="bp">None</span><span class="p">)</span>
<span class="n">q_set</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">version_removed</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">complete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">complete</span> <span class="o">=</span> <span class="bp">True</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">save</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">with</span> <span class="n">transaction</span><span class="p">.</span><span class="n">atomic</span><span class="p">():</span>
<span class="n">models</span><span class="p">.</span><span class="n">CreatedResource</span><span class="p">.</span><span class="n">objcets</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="n">content_object</span><span class="o">=</span><span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">_model</span><span class="p">.</span><span class="n">delete</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">__enter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span>
<span class="k">def</span> <span class="nf">__exit__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">traceback</span><span class="p">):</span>
<span class="k">if</span> <span class="n">exc_value</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">delete</span><span class="p">()</span>
<span class="c1"># List content on latest version.
</span><span class="n">latest_version</span> <span class="o">=</span> <span class="n">RepositoryVersion</span><span class="p">.</span><span class="n">latest</span><span class="p">(</span><span class="n">repository</span><span class="p">)</span>
<span class="k">for</span> <span class="n">content</span> <span class="ow">in</span> <span class="n">latest_version</span><span class="p">.</span><span class="n">content</span><span class="p">():</span>
<span class="p">...</span>
<span class="c1"># Create new version.
</span><span class="k">with</span> <span class="n">RepositoryVersion</span><span class="p">.</span><span class="n">create</span><span class="p">(</span><span class="n">repository</span><span class="p">)</span> <span class="k">as</span> <span class="n">created_version</span><span class="p">:</span>
<span class="n">changeset</span> <span class="o">=</span> <span class="n">ChangeSet</span><span class="p">(</span><span class="n">created_version</span><span class="p">,</span> <span class="p">...)</span>
</code></pre>
<p>[1] <a href="https://en.wikipedia.org/wiki/Facade_pattern" class="external">https://en.wikipedia.org/wiki/Facade_pattern</a></p> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=242042018-01-23T21:23:33Zamacdona@redhat.comaustin@redhat.com
<ul></ul><p>I'd like this to also include CreatedResource.</p>
<p>Since RepositoryVersions should always be created in a Task, it will always need a CreatedResource. Also, if things go badly, the CreatedResource needs to be cleaned up at the same time as the RepositoryVersion.</p> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=242252018-01-24T16:48:44Zjortel@redhat.comjortel@redhat.com
<ul><li><strong>Groomed</strong> changed from <i>No</i> to <i>Yes</i></li><li><strong>Tags</strong> <i>Pulp 3</i> added</li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=242262018-01-24T17:52:23Zamacdona@redhat.comaustin@redhat.com
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/24226/diff?detail_id=24709">diff</a>)</li><li><strong>Sprint/Milestone</strong> set to <i>53</i></li><li><strong>Sprint Candidate</strong> changed from <i>No</i> to <i>Yes</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=242282018-01-25T13:03:04Zbizhangbizhang@redhat.com
<ul><li><strong>Status</strong> changed from <i>NEW</i> to <i>ASSIGNED</i></li><li><strong>Assignee</strong> set to <i>bizhang</i></li></ul><p>PR: <a href="https://github.com/pulp/pulp/pull/3285" class="external">https://github.com/pulp/pulp/pull/3285</a><br>
<a href="https://github.com/pulp/pulp_file/pull/32" class="external">https://github.com/pulp/pulp_file/pull/32</a></p> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=242882018-01-29T19:11:46Zbizhangbizhang@redhat.com
<ul><li><strong>Status</strong> changed from <i>ASSIGNED</i> to <i>MODIFIED</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=263982018-03-08T23:31:50Zbmbouterbmbouter@redhat.com
<ul><li><strong>Sprint</strong> set to <i>Sprint 31</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=264052018-03-08T23:32:06Zbmbouterbmbouter@redhat.com
<ul><li><strong>Sprint/Milestone</strong> deleted (<del><i>53</i></del>)</li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=415622019-04-25T16:46:03Zdaviddavis
<ul><li><strong>Sprint/Milestone</strong> set to <i>3.0.0</i></li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=426952019-04-26T20:36:50Zbmbouterbmbouter@redhat.com
<ul><li><strong>Tags</strong> deleted (<del><i>Pulp 3</i></del>)</li></ul> Pulp - Story #3285: As a plugin writer, I have a tool that helps me write tasks that create RepositoryVersionshttps://pulp.plan.io/issues/3285?journal_id=507902019-12-13T17:25:27Zbmbouterbmbouter@redhat.com
<ul><li><strong>Status</strong> changed from <i>MODIFIED</i> to <i>CLOSED - CURRENTRELEASE</i></li></ul>