← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] ~vaishnavi-asawale/launchpad/+git/launchpad-1:move-use-fetch-service-button into launchpad:master

 

Vaishnavi Asawale has proposed merging ~vaishnavi-asawale/launchpad/+git/launchpad-1:move-use-fetch-service-button into launchpad:master.

Commit message:
Move 'Use fetch service' button from Administer recipe to Edit recipe for snaps

The user can initiate a snap build with the fetch service enabled (strict mode default)
from the Edit recipe page.

The SNAP_USE_FETCH_SERVICE_FEATURE_FLAG has been removed, as the use_fetch_service feature 
is now considered stable and unlikely to be disabled. All related tests using fixtures to 
simulate the feature flag have been updated accordingly.


Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)

For more details, see:
https://code.launchpad.net/~vaishnavi-asawale/launchpad/+git/launchpad-1/+merge/490217
-- 
Your team Launchpad code reviewers is requested to review the proposed merge of ~vaishnavi-asawale/launchpad/+git/launchpad-1:move-use-fetch-service-button into launchpad:master.
diff --git a/lib/lp/snappy/browser/snap.py b/lib/lp/snappy/browser/snap.py
index dc4d330..a65b679 100644
--- a/lib/lp/snappy/browser/snap.py
+++ b/lib/lp/snappy/browser/snap.py
@@ -77,7 +77,6 @@ from lp.snappy.browser.widgets.snaparchive import SnapArchiveWidget
 from lp.snappy.browser.widgets.storechannels import StoreChannelsWidget
 from lp.snappy.interfaces.snap import (
     SNAP_SNAPCRAFT_CHANNEL_FEATURE_FLAG,
-    SNAP_USE_FETCH_SERVICE_FEATURE_FLAG,
     CannotAuthorizeStoreUploads,
     CannotFetchSnapcraftYaml,
     CannotParseSnapcraftYaml,
@@ -550,6 +549,8 @@ class ISnapEditSchema(Interface):
     store_name = copy_field(ISnap["store_name"], required=True)
     store_channels = copy_field(ISnap["store_channels"], required=True)
 
+    use_fetch_service = copy_field(ISnap["use_fetch_service"], required=True)
+
 
 def log_oops(error, request):
     """Log an oops report without raising an error."""
@@ -941,9 +942,6 @@ class SnapAdminView(BaseSnapEditView):
             "pro_enable",
         ]
 
-        if getFeatureFlag(SNAP_USE_FETCH_SERVICE_FEATURE_FLAG):
-            fields.append("use_fetch_service")
-
         return fields
 
     @property
@@ -988,6 +986,7 @@ class SnapEditView(BaseSnapEditView, EnableProcessorsMixin):
         "store_upload",
         "store_name",
         "store_channels",
+        "use_fetch_service",
     ]
     custom_widget_store_distro_series = LaunchpadRadioWidget
     custom_widget_vcs = LaunchpadRadioWidget
diff --git a/lib/lp/snappy/browser/tests/test_snap.py b/lib/lp/snappy/browser/tests/test_snap.py
index 819d770..cd3f5af 100644
--- a/lib/lp/snappy/browser/tests/test_snap.py
+++ b/lib/lp/snappy/browser/tests/test_snap.py
@@ -61,7 +61,6 @@ from lp.snappy.browser.snap import (
 )
 from lp.snappy.interfaces.snap import (
     SNAP_SNAPCRAFT_CHANNEL_FEATURE_FLAG,
-    SNAP_USE_FETCH_SERVICE_FEATURE_FLAG,
     CannotModifySnapProcessor,
     ISnapSet,
     SnapBuildRequestStatus,
@@ -821,10 +820,6 @@ class TestSnapAdminView(BaseTestSnapView):
     def test_admin_snap(self):
         # Admins can change require_virtualized, privacy, and allow_internet.
 
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: True})
-        )
-
         login("admin@xxxxxxxxxxxxx")
         admin = self.factory.makePerson(
             member_of=[getUtility(ILaunchpadCelebrities).admin]
@@ -839,7 +834,6 @@ class TestSnapAdminView(BaseTestSnapView):
         self.assertFalse(snap.private)
         self.assertTrue(snap.allow_internet)
         self.assertFalse(snap.pro_enable)
-        self.assertFalse(snap.use_fetch_service)
 
         self.factory.makeAccessPolicy(
             pillar=project, type=InformationType.PRIVATESECURITY
@@ -852,39 +846,13 @@ class TestSnapAdminView(BaseTestSnapView):
         browser.getControl(name="field.information_type").value = private
         browser.getControl("Allow external network access").selected = False
         browser.getControl("Enable Ubuntu Pro").selected = True
-        browser.getControl("Use fetch service").selected = True
         browser.getControl("Update snap package").click()
-
-        # XXX ines-almeida 2024-03-11: Browser tests work oddly with fixtures.
-        # This ensures that the feature flag is ON during the rest of the test.
-        # Further investigation on this issue is required.
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: True})
-        )
         login_admin()
         self.assertEqual(project, snap.project)
         self.assertFalse(snap.require_virtualized)
         self.assertTrue(snap.private)
         self.assertFalse(snap.allow_internet)
         self.assertTrue(snap.pro_enable)
-        self.assertTrue(snap.use_fetch_service)
-
-    def test_admin_use_fetch_service_feature_flag(self):
-        admin = self.factory.makePerson(
-            member_of=[getUtility(ILaunchpadCelebrities).admin]
-        )
-        snap = self.factory.makeSnap(registrant=admin)
-        browser = self.getViewBrowser(snap, user=admin)
-
-        browser.getLink("Administer snap package").click()
-        self.assertFalse("Use fetch service" in browser.contents)
-
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: True})
-        )
-
-        browser.reload()
-        self.assertTrue("Use fetch service" in browser.contents)
 
     def test_admin_snap_private_without_project(self):
         # Cannot make snap private if it doesn't have a project associated.
@@ -1458,6 +1426,32 @@ class TestSnapEditView(BaseTestSnapView):
             MatchesTagText(content, "source"),
         )
 
+    def test_edit_use_fetch_service(self):
+        series = self.factory.makeUbuntuDistroSeries()
+        with admin_logged_in():
+            snappy_series = self.factory.makeSnappySeries(
+                usable_distro_series=[series]
+            )
+        login_person(self.person)
+        snap = self.factory.makeSnap(
+            registrant=self.person,
+            owner=self.person,
+            distroseries=series,
+            branch=self.factory.makeAnyBranch(),
+            store_series=snappy_series,
+        )
+        browser = self.getViewBrowser(snap, user=self.person)
+        browser.getLink("Edit snap package").click()
+        self.assertTrue("Use fetch service" in browser.contents)
+        with person_logged_in(self.person):
+            self.assertFalse(snap.use_fetch_service)
+        browser.getControl("Use fetch service").selected = True
+        browser.getControl("Update snap package").click()
+        browser = self.getViewBrowser(snap, user=self.person)
+        browser.getLink("Edit snap package").click()
+        with person_logged_in(self.person):
+            self.assertTrue(snap.use_fetch_service)
+
     def setUpSeries(self):
         """Set up {distro,snappy}series with some available processors."""
         distroseries = self.factory.makeUbuntuDistroSeries()
diff --git a/lib/lp/snappy/interfaces/snap.py b/lib/lp/snappy/interfaces/snap.py
index 684c280..4c56003 100644
--- a/lib/lp/snappy/interfaces/snap.py
+++ b/lib/lp/snappy/interfaces/snap.py
@@ -19,11 +19,11 @@ __all__ = [
     "ISnapDelete",
     "ISnapSet",
     "ISnapView",
+    "ISnapEditableAttributes",
     "MissingSnapcraftYaml",
     "NoSourceForSnap",
     "NoSuchSnap",
     "SNAP_SNAPCRAFT_CHANNEL_FEATURE_FLAG",
-    "SNAP_USE_FETCH_SERVICE_FEATURE_FLAG",
     "SnapAuthorizationBadGeneratedMacaroon",
     "SnapBuildAlreadyPending",
     "SnapBuildArchiveOwnerMismatch",
@@ -1140,6 +1140,32 @@ class ISnapEditableAttributes(IHasOwner):
         )
     )
 
+    use_fetch_service = exported(
+        Bool(
+            title=_("Use fetch service"),
+            required=True,
+            readonly=False,
+            description=_(
+                "If set, Snap builds will use the fetch-service instead "
+                "of the builder-proxy to access external resources."
+            ),
+        )
+    )
+
+    fetch_service_policy = exported(
+        Choice(
+            title=_("Fetch service policy"),
+            vocabulary=FetchServicePolicy,
+            required=False,
+            readonly=False,
+            default=FetchServicePolicy.STRICT,
+            description=_(
+                "Which policy to use when using the fetch service. Ignored if "
+                "`use_fetch_service` flag is False."
+            ),
+        )
+    )
+
     def setProject(project):
         """Set the pillar project of this snap recipe."""
 
@@ -1194,32 +1220,6 @@ class ISnapAdminAttributes(Interface):
         )
     )
 
-    use_fetch_service = exported(
-        Bool(
-            title=_("Use fetch service"),
-            required=True,
-            readonly=False,
-            description=_(
-                "If set, Snap builds will use the fetch-service instead "
-                "of the builder-proxy to access external resources."
-            ),
-        )
-    )
-
-    fetch_service_policy = exported(
-        Choice(
-            title=_("Fetch service policy"),
-            vocabulary=FetchServicePolicy,
-            required=False,
-            readonly=False,
-            default=FetchServicePolicy.STRICT,
-            description=_(
-                "Which policy to use when using the fetch service. Ignored if "
-                "`use_fetch_service` flag is False."
-            ),
-        )
-    )
-
     def subscribe(person, subscribed_by):
         """Subscribe a person to this snap recipe."""
 
@@ -1270,6 +1270,8 @@ class ISnapSet(Interface):
             "store_name",
             "store_channels",
             "project",
+            "use_fetch_service",
+            "fetch_service_policy",
         ],
     )
     @operation_for_version("devel")
diff --git a/lib/lp/snappy/model/snap.py b/lib/lp/snappy/model/snap.py
index dfe2282..acb41ab 100644
--- a/lib/lp/snappy/model/snap.py
+++ b/lib/lp/snappy/model/snap.py
@@ -125,7 +125,6 @@ from lp.services.database.stormexpr import (
     IsDistinctFrom,
     NullsLast,
 )
-from lp.services.features import getFeatureFlag
 from lp.services.job.interfaces.job import JobStatus
 from lp.services.job.model.job import Job
 from lp.services.librarian.model import LibraryFileAlias, LibraryFileContent
@@ -138,7 +137,6 @@ from lp.services.webhooks.interfaces import IWebhookSet
 from lp.services.webhooks.model import WebhookTargetMixin
 from lp.snappy.adapters.buildarch import determine_architectures_to_build
 from lp.snappy.interfaces.snap import (
-    SNAP_USE_FETCH_SERVICE_FEATURE_FLAG,
     BadMacaroon,
     BadSnapSearchContext,
     BadSnapSource,
@@ -396,7 +394,7 @@ class Snap(StormBase, WebhookTargetMixin):
 
     pro_enable = Bool(name="pro_enable", allow_none=False)
 
-    _use_fetch_service = Bool(name="use_fetch_service", allow_none=False)
+    use_fetch_service = Bool(name="use_fetch_service", allow_none=False)
 
     fetch_service_policy = DBEnum(
         enum=FetchServicePolicy,
@@ -696,17 +694,6 @@ class Snap(StormBase, WebhookTargetMixin):
     def store_channels(self, value):
         self._store_channels = value or None
 
-    @property
-    def use_fetch_service(self):
-        if getFeatureFlag(SNAP_USE_FETCH_SERVICE_FEATURE_FLAG):
-            return self._use_fetch_service
-        return None
-
-    @use_fetch_service.setter
-    def use_fetch_service(self, value):
-        if getFeatureFlag(SNAP_USE_FETCH_SERVICE_FEATURE_FLAG):
-            self._use_fetch_service = value
-
     def getAllowedInformationTypes(self, user):
         """See `ISnap`."""
         if user_has_special_snap_access(user):
diff --git a/lib/lp/snappy/templates/snap-edit.pt b/lib/lp/snappy/templates/snap-edit.pt
index ad92312..5f911e5 100644
--- a/lib/lp/snappy/templates/snap-edit.pt
+++ b/lib/lp/snappy/templates/snap-edit.pt
@@ -133,6 +133,10 @@
         <tal:widget define="widget nocall:view/widgets/processors">
           <metal:block use-macro="context/@@launchpad_form/widget_row" />
         </tal:widget>
+
+        <tal:widget define="widget nocall:view/widgets/use_fetch_service">
+          <metal:block use-macro="context/@@launchpad_form/widget_row" />
+        </tal:widget>
       </table>
     </metal:formbody>
   </div>
diff --git a/lib/lp/snappy/tests/test_snap.py b/lib/lp/snappy/tests/test_snap.py
index dba8e01..b77b02e 100644
--- a/lib/lp/snappy/tests/test_snap.py
+++ b/lib/lp/snappy/tests/test_snap.py
@@ -69,7 +69,7 @@ from lp.services.database.sqlbase import (
     flush_database_caches,
     get_transaction_timestamp,
 )
-from lp.services.features.testing import FeatureFixture, MemoryFeatureFixture
+from lp.services.features.testing import MemoryFeatureFixture
 from lp.services.job.interfaces.job import JobStatus
 from lp.services.job.runner import JobRunner
 from lp.services.log.logger import BufferLogger
@@ -80,7 +80,6 @@ from lp.services.webapp.publisher import canonical_url
 from lp.services.webapp.snapshot import notify_modified
 from lp.services.webhooks.testing import LogsScheduledWebhooks
 from lp.snappy.interfaces.snap import (
-    SNAP_USE_FETCH_SERVICE_FEATURE_FLAG,
     BadSnapSearchContext,
     CannotFetchSnapcraftYaml,
     CannotModifySnapProcessor,
@@ -1940,6 +1939,15 @@ class TestSnap(TestCaseWithFactory):
         )
         self.assertThat(recorder2, HasQueryCount.byEquality(recorder1))
 
+    def test_snap_use_fetch_service(self):
+        person = self.factory.makePerson()
+        with person_logged_in(person):
+            snap = self.factory.makeSnap(registrant=person, owner=person)
+
+            self.assertFalse(snap.use_fetch_service)
+            snap.use_fetch_service = True
+            self.assertTrue(snap.use_fetch_service)
+
 
 class TestSnapDeleteWithBuilds(TestCaseWithFactory):
     layer = LaunchpadFunctionalLayer
@@ -2353,8 +2361,6 @@ class TestSnapSet(TestCaseWithFactory):
             "allow_internet": True,
             "pro_enable": True,
             "require_virtualized": True,
-            "use_fetch_service": True,
-            "fetch_service_policy": FetchServicePolicy.PERMISSIVE,
         }
 
         for field_name, field_value in admin_fields.items():
@@ -2366,10 +2372,6 @@ class TestSnapSet(TestCaseWithFactory):
 
     def test_admins_can_update_admin_only_fields(self):
         # The admin fields can be updated by an admin
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
-
         [ref] = self.factory.makeGitRefs()
         components = self.makeSnapComponents(git_ref=ref)
         snap = getUtility(ISnapSet).new(**components)
@@ -2378,8 +2380,6 @@ class TestSnapSet(TestCaseWithFactory):
             "allow_internet": True,
             "pro_enable": True,
             "require_virtualized": True,
-            "use_fetch_service": True,
-            "fetch_service_policy": FetchServicePolicy.PERMISSIVE,
         }
 
         for field_name, field_value in admin_fields.items():
@@ -2388,26 +2388,6 @@ class TestSnapSet(TestCaseWithFactory):
                 setattr(snap, field_name, field_value)
                 self.assertEqual(field_value, getattr(snap, field_name))
 
-    def test_snap_use_fetch_service_feature_flag(self):
-        # The snap.use_fetch_service API only works when feature flag is set
-        [ref] = self.factory.makeGitRefs()
-        components = self.makeSnapComponents(git_ref=ref)
-        snap = getUtility(ISnapSet).new(**components)
-
-        # admin cannot get the actual value or set a new value to the
-        # use_fetch_service field when the feature flag is OFF
-        login_admin()
-        self.assertEqual(None, snap.use_fetch_service)
-        snap.use_fetch_service = True
-        self.assertEqual(None, snap.use_fetch_service)
-
-        # when feature flag is ON, admin can see the real value of
-        # `use_fetch_service` and opt in and out of it
-        with MemoryFeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"}):
-            self.assertFalse(snap.use_fetch_service)
-            snap.use_fetch_service = True
-            self.assertTrue(snap.use_fetch_service)
-
     def test_create_private_snap_with_open_team_as_owner_fails(self):
         components = self.makeSnapComponents()
         with admin_logged_in():
diff --git a/lib/lp/snappy/tests/test_snapbuildbehaviour.py b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
index 8a0bcf3..91ce9cf 100644
--- a/lib/lp/snappy/tests/test_snapbuildbehaviour.py
+++ b/lib/lp/snappy/tests/test_snapbuildbehaviour.py
@@ -78,7 +78,6 @@ from lp.services.statsd.tests import StatsMixin
 from lp.services.webapp import canonical_url
 from lp.snappy.interfaces.snap import (
     SNAP_SNAPCRAFT_CHANNEL_FEATURE_FLAG,
-    SNAP_USE_FETCH_SERVICE_FEATURE_FLAG,
     SnapBuildArchiveOwnerMismatch,
 )
 from lp.snappy.model.snapbuildbehaviour import (
@@ -293,9 +292,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
         without populating `proxy_url` and `revocation_endpoint`.
         """
         self.pushConfig("builddmaster", fetch_service_host=None)
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(use_fetch_service=True)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -314,9 +310,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
         the function raises a `CannotBuild` error.
         """
         self.pushConfig("builddmaster", fetch_service_mitm_certificate=None)
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
 
         snap = self.factory.makeSnap(use_fetch_service=True)
         request = self.factory.makeSnapBuildRequest(snap=snap)
@@ -338,9 +331,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
         self.pushConfig(
             "builddmaster", fetch_service_control_admin_secret=None
         )
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(use_fetch_service=True)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -357,9 +347,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
 
         `proxy_url` and `revocation_endpoint` are correctly populated.
         """
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(use_fetch_service=True)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -414,9 +401,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
 
         `proxy_url` and `revocation_endpoint` are correctly populated.
         """
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(
             use_fetch_service=True,
             fetch_service_policy=FetchServicePolicy.PERMISSIVE,
@@ -468,25 +452,9 @@ class TestAsyncSnapBuildBehaviourFetchService(
         )
 
     @defer.inlineCallbacks
-    def test_requestFetchServiceSession_flag_off(self):
-        """Create a snap build request turning off the feature flag."""
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: None})
-        )
-        snap = self.factory.makeSnap(use_fetch_service=True)
-        request = self.factory.makeSnapBuildRequest(snap=snap)
-        job = self.makeJob(snap=snap, build_request=request)
-        yield job.extraBuildArgs()
-        self.assertEqual([], self.fetch_service_api.sessions.requests)
-
-    @defer.inlineCallbacks
     def test_requestFetchServiceSession_mitm_certficate_redacted(self):
         """The `fetch_service_mitm_certificate` field in the build arguments
         is redacted in the build logs."""
-
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(use_fetch_service=True)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -524,9 +492,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
         fetch service and saved to a file; and call to end the session and
         removing resources are made.
         """
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         tem_upload_path = self.useFixture(fixtures.TempDir()).path
 
         snap = self.factory.makeSnap(use_fetch_service=True)
@@ -594,9 +559,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
     def test_endProxySession_fetch_Service_false(self):
         """When `use_fetch_service` is False, we don't make any calls to the
         fetch service API."""
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(use_fetch_service=False)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -619,9 +581,6 @@ class TestAsyncSnapBuildBehaviourFetchService(
         """When `allow_internet` is False, we don't send proxy variables to the
         buildd, and ending the session does not make calls to the fetch
         service."""
-        self.useFixture(
-            FeatureFixture({SNAP_USE_FETCH_SERVICE_FEATURE_FLAG: "on"})
-        )
         snap = self.factory.makeSnap(allow_internet=False)
         request = self.factory.makeSnapBuildRequest(snap=snap)
         job = self.makeJob(snap=snap, build_request=request)
@@ -631,7 +590,7 @@ class TestAsyncSnapBuildBehaviourFetchService(
         job._worker.proxy_info = MagicMock(
             return_value={
                 "revocation_endpoint": None,
-                "use_fetch_service": None,
+                "use_fetch_service": False,
             }
         )
 
@@ -803,10 +762,6 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
         with dbuser(config.builddmaster.dbuser):
             args = yield job.extraBuildArgs()
 
-        # XXX ines-almeida 2024-04-26: use_fetch_service is `None` because we
-        # are not setting the fetch-service feature flag 'ON' for these tests
-        # (since that's not the point of these test). Once we remove the
-        # feature flag, this will either be True or False - not None.
         self.assertThat(
             args,
             MatchesDict(
@@ -828,7 +783,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }
@@ -884,7 +839,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }
@@ -929,7 +884,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }
@@ -1005,7 +960,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }
@@ -1053,7 +1008,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }
@@ -1098,7 +1053,7 @@ class TestAsyncSnapBuildBehaviourBuilderProxy(
                     "series": Equals("unstable"),
                     "trusted_keys": Equals(expected_trusted_keys),
                     "target_architectures": Equals(["i386"]),
-                    "use_fetch_service": Is(None),
+                    "use_fetch_service": Is(False),
                     "launchpad_instance": Equals("devel"),
                     "launchpad_server_url": Equals("launchpad.test"),
                 }