← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~cjwatson/launchpad:schema-explicit-versions-bugs into launchpad:master

 

Colin Watson has proposed merging ~cjwatson/launchpad:schema-explicit-versions-bugs into launchpad:master.

Commit message:
Set explicit webservice versions for lp.bugs

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~cjwatson/launchpad/+git/launchpad/+merge/423611

`lp._schema_circular_imports` has historically grandparented in explicit webservice version declarations for exports that predated the requirement for explicit version declarations.  It's long past time to deal with these properly, so start by moving the declarations for entries and collections under `lp.bugs` to the proper places.

Comparing the WADL files before and after this change is difficult since they don't have a stable sort order, but they stay the same size which is a good indication that the set of exported items hasn't changed.
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~cjwatson/launchpad:schema-explicit-versions-bugs into launchpad:master.
diff --git a/lib/lp/_schema_circular_imports.py b/lib/lp/_schema_circular_imports.py
index 6bf443b..cbac27d 100644
--- a/lib/lp/_schema_circular_imports.py
+++ b/lib/lp/_schema_circular_imports.py
@@ -24,8 +24,6 @@ from lp.bugs.interfaces.bug import (
     IBug,
     IFrontPageBugAddForm,
     )
-from lp.bugs.interfaces.bugactivity import IBugActivity
-from lp.bugs.interfaces.bugattachment import IBugAttachment
 from lp.bugs.interfaces.bugbranch import IBugBranch
 from lp.bugs.interfaces.bugnomination import IBugNomination
 from lp.bugs.interfaces.bugsubscriptionfilter import IBugSubscriptionFilter
@@ -38,11 +36,8 @@ from lp.bugs.interfaces.bugtracker import (
     IBugTracker,
     IBugTrackerComponent,
     IBugTrackerComponentGroup,
-    IBugTrackerSet,
     )
 from lp.bugs.interfaces.bugwatch import IBugWatch
-from lp.bugs.interfaces.cve import ICve
-from lp.bugs.interfaces.malone import IMaloneApplication
 from lp.bugs.interfaces.structuralsubscription import (
     IStructuralSubscription,
     IStructuralSubscriptionTarget,
@@ -774,69 +769,6 @@ patch_entry_explicit_version(IBranchSubscription, 'beta')
 patch_operations_explicit_version(
     IBranchSubscription, 'beta', "canBeUnsubscribedByUser")
 
-# IBug
-patch_entry_explicit_version(IBug, 'beta')
-patch_operations_explicit_version(
-    IBug, 'beta', "addAttachment", "addNomination", "addTask", "addWatch",
-    "canBeNominatedFor", "getNominationFor",
-    "getNominations", "isExpirable", "isUserAffected",
-    "linkCVE", "markAsDuplicate",
-    "markUserAffected", "newMessage", "setCommentVisibility", "setPrivate",
-    "setSecurityRelated", "subscribe", "unlinkCVE",
-    "unsubscribe", "unsubscribeFromDupes")
-
-# IBugActivity
-patch_entry_explicit_version(IBugActivity, 'beta')
-
-# IBugAttachment
-patch_entry_explicit_version(IBugAttachment, 'beta')
-patch_operations_explicit_version(
-    IBugAttachment, 'beta', "removeFromBug")
-
-# IBugBranch
-patch_entry_explicit_version(IBugBranch, 'beta')
-
-# IBugNomination
-patch_entry_explicit_version(IBugNomination, 'beta')
-patch_operations_explicit_version(
-    IBugNomination, 'beta', "approve", "canApprove", "decline")
-
-# IBugSubscriptionFilter
-patch_entry_explicit_version(IBugSubscriptionFilter, 'beta')
-patch_operations_explicit_version(
-    IBugSubscriptionFilter, 'beta', "delete")
-
-# IBugTarget
-patch_entry_explicit_version(IBugTarget, 'beta')
-
-# IBugTask
-patch_entry_explicit_version(IBugTask, 'beta')
-patch_operations_explicit_version(
-    IBugTask, 'beta', "findSimilarBugs", "transitionToAssignee",
-    "transitionToImportance", "transitionToMilestone", "transitionToStatus",
-    "transitionToTarget")
-
-# IBugTracker
-patch_entry_explicit_version(IBugTracker, 'beta')
-patch_operations_explicit_version(
-    IBugTracker, 'beta', "addRemoteComponentGroup",
-    "getAllRemoteComponentGroups", "getRemoteComponentGroup")
-
-# IBugTrackerComponent
-patch_entry_explicit_version(IBugTrackerComponent, 'beta')
-
-# IBugTrackerComponentGroup
-patch_entry_explicit_version(IBugTrackerComponentGroup, 'beta')
-patch_operations_explicit_version(
-    IBugTrackerComponentGroup, 'beta', "addComponent")
-
-# IBugTrackerSet
-patch_operations_explicit_version(
-    IBugTrackerSet, 'beta', "ensureBugTracker", "getByName", "queryByBaseURL")
-
-# IBugWatch
-patch_entry_explicit_version(IBugWatch, 'beta')
-
 # IBuilder
 patch_entry_explicit_version(IBuilder, 'beta')
 patch_reference_property(IBuilder, 'current_build', IBuildFarmJob)
@@ -868,9 +800,6 @@ patch_entry_explicit_version(ICountry, 'beta')
 patch_operations_explicit_version(
     ICountrySet, 'beta', "getByCode", "getByName")
 
-# ICve
-patch_entry_explicit_version(ICve, 'beta')
-
 # IDistribution
 patch_operations_explicit_version(
     IDistribution, 'beta', "getArchive", "getCountryMirror",
@@ -908,9 +837,6 @@ patch_entry_explicit_version(IDistroSeriesDifferenceComment, 'beta')
 # IGPGKey
 patch_entry_explicit_version(IGPGKey, 'beta')
 
-# IHasBugs
-patch_entry_explicit_version(IHasBugs, 'beta')
-
 # IHasMilestones
 patch_entry_explicit_version(IHasMilestones, 'beta')
 
@@ -929,9 +855,6 @@ patch_entry_explicit_version(ILanguage, 'beta')
 # ILanguageSet
 patch_operations_explicit_version(ILanguageSet, 'beta', "getAllLanguages")
 
-# IMaloneApplication
-patch_operations_explicit_version(IMaloneApplication, 'beta', "createBug")
-
 # IMessage
 patch_entry_explicit_version(IMessage, 'beta')
 
@@ -1027,14 +950,6 @@ patch_operations_explicit_version(
 # ISourcePackageRecipeBuild
 patch_entry_explicit_version(ISourcePackageRecipeBuild, 'beta')
 
-# IStructuralSubscription
-patch_entry_explicit_version(IStructuralSubscription, 'beta')
-patch_operations_explicit_version(
-    IStructuralSubscription, 'beta', "delete", "newBugFilter")
-
-# IStructuralSubscriptionTarget
-patch_entry_explicit_version(IStructuralSubscriptionTarget, 'beta')
-
 # ITeam
 patch_entry_explicit_version(ITeam, 'beta')
 
diff --git a/lib/lp/bugs/interfaces/bug.py b/lib/lp/bugs/interfaces/bug.py
index 3a9becf..fd3f047 100644
--- a/lib/lp/bugs/interfaces/bug.py
+++ b/lib/lp/bugs/interfaces/bug.py
@@ -247,7 +247,7 @@ class IBugView(Interface):
                 "Expiration may happen when the bug permits expiration, "
                 "and a bugtask cannot be confirmed."),
             readonly=True),
-        ('devel', dict(exported=False)), exported=True)
+        ('devel', dict(exported=False)), as_of="beta", exported=True)
     subscriptions = exported(
         doNotSnapshot(CollectionField(
             title=_('Subscriptions'),
@@ -545,6 +545,7 @@ class IBugView(Interface):
     @operation_parameters(
         target=Reference(schema=Interface, title=_('Target')))
     @export_read_operation()
+    @operation_for_version("beta")
     def canBeNominatedFor(target):
         """Can this bug nominated for this target?
 
@@ -557,6 +558,7 @@ class IBugView(Interface):
         target=Reference(schema=Interface, title=_('Target')))
     @operation_returns_entry(Interface)
     @export_read_operation()
+    @operation_for_version("beta")
     def getNominationFor(target):
         """Return the IBugNomination for the target.
 
@@ -574,6 +576,7 @@ class IBugView(Interface):
             required=False))
     @operation_returns_collection_of(Interface)  # IBugNomination
     @export_read_operation()
+    @operation_for_version("beta")
     def getNominations(target=None, nominations=None):
         """Return a list of all IBugNominations for this bug.
 
@@ -615,6 +618,7 @@ class IBugView(Interface):
 
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def isUserAffected(user):
         """Is :user: marked as affected by this bug?"""
 
@@ -641,6 +645,7 @@ class IBugView(Interface):
             title=_('Number of days of inactivity for which to check.'),
             required=False))
     @export_read_operation()
+    @operation_for_version("beta")
     def isExpirable(days_old=None):
         """Is this bug eligible for expiration and was it last updated
         more than X days ago?
@@ -702,6 +707,7 @@ class IBugAppend(Interface):
         comment=Text(), filename=TextLine(), is_patch=Bool(),
         content_type=TextLine(), description=Text())
     @export_factory_operation(IBugAttachment, [])
+    @operation_for_version("beta")
     def addAttachment(owner, data, comment, filename, is_patch=False,
                       content_type=None, description=None, from_api=False):
         """Attach a file to this bug.
@@ -737,6 +743,7 @@ class IBugAppend(Interface):
         bugtracker='bug_tracker', remotebug='remote_bug')
     @export_factory_operation(
         IBugWatch, ['bugtracker', 'remotebug'])
+    @operation_for_version("beta")
     def addWatch(bugtracker, remotebug, owner):
         """Create a new watch for this bug on the given remote bug and bug
         tracker, owned by the person given as the owner.
@@ -794,6 +801,7 @@ class IBugAppend(Interface):
             required=False, default=True))
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def markUserAffected(user, affected=True):
         """Mark :user: as affected by this bug."""
 
@@ -804,6 +812,7 @@ class IBugAppend(Interface):
         visible=Bool(title=_('Show this comment?'), required=True))
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def setCommentVisibility(user, comment_number, visible):
         """Set the visible attribute on a bug comment.  This is restricted
         to Launchpad admins, and will return a HTTP Error 401: Unauthorized
@@ -833,6 +842,7 @@ class IBugAppend(Interface):
         content=copy_field(IMessage['content']))
     @call_with(owner=REQUEST_USER)
     @export_factory_operation(IMessage, [])
+    @operation_for_version("beta")
     def newMessage(owner, subject, content):
         """Create a new message, and link it to this object."""
 
@@ -843,6 +853,7 @@ class IBugAppend(Interface):
             title=_('Level')))
     @call_with(subscribed_by=REQUEST_USER, suppress_notify=False)
     @export_write_operation()
+    @operation_for_version("beta")
     def subscribe(person, subscribed_by, suppress_notify=True, level=None):
         """Subscribe `person` to the bug.
 
@@ -857,6 +868,7 @@ class IBugAppend(Interface):
         person=Reference(IPerson, title=_('Person'), required=False))
     @call_with(unsubscribed_by=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def unsubscribe(person, unsubscribed_by):
         """Remove this person's subscription to this bug."""
 
@@ -864,6 +876,7 @@ class IBugAppend(Interface):
         person=Reference(IPerson, title=_('Person'), required=False))
     @call_with(unsubscribed_by=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def unsubscribeFromDupes(person, unsubscribed_by):
         """Remove this person's subscription from all dupes of this bug."""
 
@@ -875,6 +888,7 @@ class IBugEdit(Interface):
         target=Reference(schema=Interface, title=_('Target')))
     @call_with(owner=REQUEST_USER)
     @export_factory_operation(Interface, [])
+    @operation_for_version("beta")
     def addNomination(owner, target):
         """Nominate a bug for an IDistroSeries or IProductSeries.
 
@@ -888,6 +902,7 @@ class IBugEdit(Interface):
     @call_with(owner=REQUEST_USER)
     @operation_parameters(target=copy_field(IBugTask['target']))
     @export_factory_operation(IBugTask, [])
+    @operation_for_version("beta")
     def addTask(owner, target):
         """Create a new bug task on this bug.
 
@@ -936,12 +951,14 @@ class IBugEdit(Interface):
     @call_with(user=REQUEST_USER)
     @operation_parameters(cve=Reference(ICve, title=_('CVE'), required=True))
     @export_write_operation()
+    @operation_for_version("beta")
     def linkCVE(cve, user, check_permissions=True):
         """Ensure that this CVE is linked to this bug."""
 
     @call_with(user=REQUEST_USER)
     @operation_parameters(cve=Reference(ICve, title=_('CVE'), required=True))
     @export_write_operation()
+    @operation_for_version("beta")
     def unlinkCVE(cve, user, check_permissions=True):
         """Ensure that any links between this bug and the given CVE are
         removed.
@@ -951,6 +968,7 @@ class IBugEdit(Interface):
     @operation_parameters(private=copy_field(IBugPublic['private']))
     @call_with(who=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def setPrivate(private, who):
         """Set bug privacy.
 
@@ -965,6 +983,7 @@ class IBugEdit(Interface):
         security_related=copy_field(IBugView['security_related']))
     @call_with(who=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def setSecurityRelated(security_related, who):
         """Set bug security.
 
@@ -990,6 +1009,7 @@ class IBugEdit(Interface):
     @mutator_for(IBugView['duplicateof'])
     @operation_parameters(duplicate_of=copy_field(IBugView['duplicateof']))
     @export_write_operation()
+    @operation_for_version("beta")
     def markAsDuplicate(duplicate_of):
         """Mark this bug as a duplicate of another."""
 
@@ -1054,7 +1074,7 @@ class IBugModerate(Interface):
         """
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBug(IBugPublic, IBugView, IBugAppend, IBugEdit, IBugModerate,
            IHasLinkedBranches):
     """The core bug entry."""
diff --git a/lib/lp/bugs/interfaces/bugactivity.py b/lib/lp/bugs/interfaces/bugactivity.py
index 3b7dd2a..bf230f8 100644
--- a/lib/lp/bugs/interfaces/bugactivity.py
+++ b/lib/lp/bugs/interfaces/bugactivity.py
@@ -29,7 +29,7 @@ from lp.services.fields import (
     )
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugActivity(Interface):
     """A log of all things that have happened to a bug."""
 
diff --git a/lib/lp/bugs/interfaces/bugattachment.py b/lib/lp/bugs/interfaces/bugattachment.py
index 25ee2af..64944f9 100644
--- a/lib/lp/bugs/interfaces/bugattachment.py
+++ b/lib/lp/bugs/interfaces/bugattachment.py
@@ -20,6 +20,7 @@ from lazr.restful.declarations import (
     export_write_operation,
     exported,
     exported_as_webservice_entry,
+    operation_for_version,
     REQUEST_USER,
     )
 from lazr.restful.fields import Reference
@@ -115,11 +116,12 @@ class IBugAttachmentEdit(Interface):
 
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def removeFromBug(user):
         """Remove the attachment from the bug."""
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugAttachment(IBugAttachmentView, IBugAttachmentEdit):
     """A file attachment to an IBug.
 
diff --git a/lib/lp/bugs/interfaces/bugbranch.py b/lib/lp/bugs/interfaces/bugbranch.py
index 78fdab1..a06ba8b 100644
--- a/lib/lp/bugs/interfaces/bugbranch.py
+++ b/lib/lp/bugs/interfaces/bugbranch.py
@@ -26,7 +26,7 @@ from lp.registry.interfaces.person import IPerson
 from lp.services.fields import BugField
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugBranch(IHasBug):
     """A branch linked to a bug."""
 
diff --git a/lib/lp/bugs/interfaces/bugnomination.py b/lib/lp/bugs/interfaces/bugnomination.py
index 34ce08e..de818b4 100644
--- a/lib/lp/bugs/interfaces/bugnomination.py
+++ b/lib/lp/bugs/interfaces/bugnomination.py
@@ -25,6 +25,7 @@ from lazr.restful.declarations import (
     export_write_operation,
     exported,
     exported_as_webservice_entry,
+    operation_for_version,
     REQUEST_USER,
     )
 from lazr.restful.fields import (
@@ -96,7 +97,7 @@ class BugNominationStatus(DBEnumeratedType):
         """)
 
 
-@exported_as_webservice_entry(publish_web_link=False)
+@exported_as_webservice_entry(as_of="beta", publish_web_link=False)
 class IBugNomination(IHasBug, IHasOwner):
     """A nomination for a bug to be fixed in a specific series.
 
@@ -139,6 +140,7 @@ class IBugNomination(IHasBug, IHasOwner):
 
     @call_with(approver=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def approve(approver):
         """Approve this bug for fixing in a series.
 
@@ -154,6 +156,7 @@ class IBugNomination(IHasBug, IHasOwner):
 
     @call_with(decliner=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def decline(decliner):
         """Decline this bug for fixing in a series.
 
@@ -178,6 +181,7 @@ class IBugNomination(IHasBug, IHasOwner):
 
     @call_with(person=REQUEST_USER)
     @export_read_operation()
+    @operation_for_version("beta")
     def canApprove(person):
         """Is this person allowed to approve the nomination?"""
 
diff --git a/lib/lp/bugs/interfaces/bugsubscriptionfilter.py b/lib/lp/bugs/interfaces/bugsubscriptionfilter.py
index 3192bff..f415434 100644
--- a/lib/lp/bugs/interfaces/bugsubscriptionfilter.py
+++ b/lib/lp/bugs/interfaces/bugsubscriptionfilter.py
@@ -141,6 +141,7 @@ class IBugSubscriptionFilterMethodsProtected(Interface):
     """Methods of `IBugSubscriptionFilter` that require launchpad.Edit."""
 
     @export_destructor_operation()
+    @operation_for_version("beta")
     def delete():
         """Delete this bug subscription filter.
 
@@ -148,7 +149,7 @@ class IBugSubscriptionFilterMethodsProtected(Interface):
         structural subscription."""
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugSubscriptionFilter(
     IBugSubscriptionFilterAttributes, IBugSubscriptionFilterMethodsProtected,
     IBugSubscriptionFilterMethodsPublic):
diff --git a/lib/lp/bugs/interfaces/bugtarget.py b/lib/lp/bugs/interfaces/bugtarget.py
index 3714799..df016a6 100644
--- a/lib/lp/bugs/interfaces/bugtarget.py
+++ b/lib/lp/bugs/interfaces/bugtarget.py
@@ -151,7 +151,7 @@ BUG_POLICY_DEFAULT_TYPES = {
     }
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IHasBugs(Interface):
     """An entity which has a collection of bug tasks."""
 
@@ -210,7 +210,7 @@ class IHasExpirableBugs(Interface):
     """Marker interface for entities supporting querying expirable bugs"""
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugTarget(IHasBugs):
     """An entity on which a bug can be reported.
 
diff --git a/lib/lp/bugs/interfaces/bugtask.py b/lib/lp/bugs/interfaces/bugtask.py
index c50af90..d228e16 100644
--- a/lib/lp/bugs/interfaces/bugtask.py
+++ b/lib/lp/bugs/interfaces/bugtask.py
@@ -400,7 +400,7 @@ class IBugTaskDelete(Interface):
         """
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugTask(IHasBug, IBugTaskDelete):
     """A bug needing fixing in a particular product or package."""
 
@@ -621,6 +621,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
     @operation_returns_collection_of(Interface)  # Actually IBug.
     @call_with(user=REQUEST_USER, limit=10)
     @export_read_operation()
+    @operation_for_version("beta")
     def findSimilarBugs(user, limit=10):
         """Return the list of possible duplicates for this BugTask."""
 
@@ -688,6 +689,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
     @operation_parameters(new_milestone=copy_field(milestone))
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def transitionToMilestone(new_milestone, user):
         """Set the BugTask milestone.
 
@@ -700,6 +702,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
     @operation_parameters(new_importance=copy_field(importance))
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def transitionToImportance(new_importance, user):
         """Set the BugTask importance.
 
@@ -724,6 +727,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
         new_status=copy_field(status))
     @call_with(user=REQUEST_USER)
     @export_write_operation()
+    @operation_for_version("beta")
     def transitionToStatus(new_status, user):
         """Perform a workflow transition to the new_status.
 
@@ -752,6 +756,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
     @mutator_for(assignee)
     @operation_parameters(assignee=copy_field(assignee))
     @export_write_operation()
+    @operation_for_version("beta")
     def transitionToAssignee(assignee, validate=True):
         """Perform a workflow transition to the given assignee.
 
@@ -771,6 +776,7 @@ class IBugTask(IHasBug, IBugTaskDelete):
     @operation_parameters(
         target=copy_field(target))
     @export_write_operation()
+    @operation_for_version("beta")
     def transitionToTarget(target, user):
         """Convert the bug task to a different bug target."""
 
diff --git a/lib/lp/bugs/interfaces/bugtracker.py b/lib/lp/bugs/interfaces/bugtracker.py
index 28b2d82..ec492a2 100644
--- a/lib/lp/bugs/interfaces/bugtracker.py
+++ b/lib/lp/bugs/interfaces/bugtracker.py
@@ -214,7 +214,7 @@ SINGLE_PRODUCT_BUGTRACKERTYPES = [
     ]
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugTracker(Interface):
     """A remote bug system.
 
@@ -394,11 +394,13 @@ class IBugTracker(Interface):
             title="The name of the remote component group", required=True))
     @operation_returns_entry(Interface)
     @export_write_operation()
+    @operation_for_version("beta")
     def addRemoteComponentGroup(component_group_name):
         """Adds a new component group to the bug tracker"""
 
     @export_read_operation()
     @operation_returns_collection_of(Interface)
+    @operation_for_version("beta")
     def getAllRemoteComponentGroups():
         """Return collection of all component groups for this bug tracker"""
 
@@ -408,6 +410,7 @@ class IBugTracker(Interface):
             required=True))
     @operation_returns_entry(Interface)
     @export_read_operation()
+    @operation_for_version("beta")
     def getRemoteComponentGroup(component_group_name):
         """Retrieve a given component group registered with the bug tracker.
 
@@ -460,6 +463,7 @@ class IBugTrackerSet(Interface):
         name=TextLine(title="The bug tracker name", required=True))
     @operation_returns_entry(IBugTracker)
     @export_read_operation()
+    @operation_for_version("beta")
     def getByName(name, default=None):
         """Get a BugTracker by its name.
 
@@ -482,6 +486,7 @@ class IBugTrackerSet(Interface):
             title="The base URL of the bug tracker", required=True))
     @operation_returns_entry(IBugTracker)
     @export_read_operation()
+    @operation_for_version("beta")
     def queryByBaseURL(baseurl):
         """Return one or None BugTracker's by baseurl"""
 
@@ -493,6 +498,7 @@ class IBugTrackerSet(Interface):
         IBugTracker,
         ['baseurl', 'bugtrackertype', 'title', 'summary',
          'contactdetails', 'name'])
+    @operation_for_version("beta")
     def ensureBugTracker(baseurl, owner, bugtrackertype,
         title=None, summary=None, contactdetails=None, name=None):
         """Make sure that there is a bugtracker for the given base url.
@@ -547,7 +553,7 @@ class IBugTrackerAliasSet(Interface):
         """Query IBugTrackerAliases by BugTracker."""
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugTrackerComponent(Interface):
     """The software component in the remote bug tracker.
 
@@ -591,7 +597,7 @@ class IBugTrackerComponent(Interface):
         Reference(title=_('Component Group'), schema=Interface))
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugTrackerComponentGroup(Interface):
     """A collection of components in a remote bug tracker.
 
@@ -616,6 +622,7 @@ class IBugTrackerComponentGroup(Interface):
             title="The name of the remote software component to be added",
             required=True))
     @export_write_operation()
+    @operation_for_version("beta")
     def addComponent(component_name):
         """Adds a component to be tracked as part of this component group"""
 
diff --git a/lib/lp/bugs/interfaces/bugwatch.py b/lib/lp/bugs/interfaces/bugwatch.py
index bab2f26..92ae61d 100644
--- a/lib/lp/bugs/interfaces/bugwatch.py
+++ b/lib/lp/bugs/interfaces/bugwatch.py
@@ -146,7 +146,7 @@ BUG_WATCH_ACTIVITY_SUCCESS_STATUSES = [
     ]
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IBugWatch(IHasBug):
     """A bug on a remote system."""
 
diff --git a/lib/lp/bugs/interfaces/cve.py b/lib/lp/bugs/interfaces/cve.py
index 3a860da..fd71267 100644
--- a/lib/lp/bugs/interfaces/cve.py
+++ b/lib/lp/bugs/interfaces/cve.py
@@ -75,7 +75,7 @@ class CveStatus(DBEnumeratedType):
         """)
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class ICve(Interface):
     """A single CVE database entry."""
 
diff --git a/lib/lp/bugs/interfaces/malone.py b/lib/lp/bugs/interfaces/malone.py
index 02ff851..2a184a4 100644
--- a/lib/lp/bugs/interfaces/malone.py
+++ b/lib/lp/bugs/interfaces/malone.py
@@ -74,6 +74,7 @@ class IMaloneApplication(ILaunchpadApplication, IHasBugs):
     @export_factory_operation(
         IBug, ['title', 'description', 'tags', 'information_type',
                'security_related', 'private'])
+    @operation_for_version("beta")
     def createBug(owner, title, description, target, information_type=None,
                   tags=None, security_related=None, private=None):
         """Create a bug (with an appropriate bugtask) and return it.
diff --git a/lib/lp/bugs/interfaces/structuralsubscription.py b/lib/lp/bugs/interfaces/structuralsubscription.py
index c4b7a01..e44b832 100644
--- a/lib/lp/bugs/interfaces/structuralsubscription.py
+++ b/lib/lp/bugs/interfaces/structuralsubscription.py
@@ -89,15 +89,17 @@ class IStructuralSubscriptionRestricted(Interface):
     """The restricted parts of a subscription to a Launchpad structure."""
 
     @export_factory_operation(Interface, [])
+    @operation_for_version("beta")
     def newBugFilter():
         """Returns a new `BugSubscriptionFilter` for this subscription."""
 
     @export_destructor_operation()
+    @operation_for_version("beta")
     def delete():
         """Delete this structural subscription filter."""
 
 
-@exported_as_webservice_entry(publish_web_link=False)
+@exported_as_webservice_entry(publish_web_link=False, as_of="beta")
 class IStructuralSubscription(
     IStructuralSubscriptionPublic, IStructuralSubscriptionRestricted):
     """A subscription to a Launchpad structure."""
@@ -230,7 +232,7 @@ class IStructuralSubscriptionTargetWrite(Interface):
         """
 
 
-@exported_as_webservice_entry()
+@exported_as_webservice_entry(as_of="beta")
 class IStructuralSubscriptionTarget(IStructuralSubscriptionTargetRead,
                                     IStructuralSubscriptionTargetWrite):
     """A Launchpad Structure allowing users to subscribe to it."""