[amber] add API for opening TUF repos not configured as sources

Bug: PKG-631
Change-Id: Ie1f5253054d341f1da379cfcbdea5e7bc05f88db
diff --git a/garnet/go/src/amber/control_server/control_server.go b/garnet/go/src/amber/control_server/control_server.go
index 5174c66..9a43494 100644
--- a/garnet/go/src/amber/control_server/control_server.go
+++ b/garnet/go/src/amber/control_server/control_server.go
@@ -20,10 +20,13 @@
 )
 
 type ControlServer struct {
+	*amber.ControlTransitionalBase
 	daemon    *daemon.Daemon
 	sysUpdate *sys_update.SystemUpdateMonitor
 }
 
+var _ = amber.Control((*ControlServer)(nil))
+
 type EventsImpl struct{}
 
 var _ = amber.Events(EventsImpl{})
diff --git a/sdk/fidl/fuchsia.amber/BUILD.gn b/sdk/fidl/fuchsia.amber/BUILD.gn
index b1828d8..3a3d612 100644
--- a/sdk/fidl/fuchsia.amber/BUILD.gn
+++ b/sdk/fidl/fuchsia.amber/BUILD.gn
@@ -8,4 +8,7 @@
   sources = [
     "amber.fidl",
   ]
+  deps = [
+    "//sdk/fidl/fuchsia.pkg",
+  ]
 }
diff --git a/sdk/fidl/fuchsia.amber/amber.fidl b/sdk/fidl/fuchsia.amber/amber.fidl
index 92da67a9..d0c0bd7 100644
--- a/sdk/fidl/fuchsia.amber/amber.fidl
+++ b/sdk/fidl/fuchsia.amber/amber.fidl
@@ -4,6 +4,7 @@
 
 library fuchsia.amber;
 
+using fuchsia.pkg;
 using zx;
 
 struct OAuth2Config {
@@ -185,6 +186,16 @@
     // Sent when a blob fails to write, causing one or more package installs to
     // permanently fail.
     PackagesFailed(vector<string> merkle, zx.status error, string blob_merkle);
+
+    // Opens a TUF repository specified by the provided RepositoryConfig.
+    // The repository will stay open for the life of the OpenedRepository
+    // channel.
+    //
+    // Packages in the opened repository can be accessed via
+    // OpenedRepository.GetUpdateComplete, but will not appear in calls to
+    // the global GetUpdateComplete, above.
+    [Transitional = "PKG-661"]
+    OpenRepository(fuchsia.pkg.RepositoryConfig config, request<OpenedRepository> repo) -> (zx.status result);
 };
 
 [Discoverable]
@@ -193,3 +204,20 @@
     // storage.
     -> OnOutOfSpace();
 };
+
+protocol OpenedRepository {
+    // Get an update for the package identified by 'name' which has the
+    // provided variant. The package data is sent to PackageFS which then
+    // stores the package in BlobFS. This method provides a FetchResult that
+    // will send the ultimate results.
+    GetUpdateComplete(string name, string? variant, string? merkle, request<FetchResult> result);
+};
+
+// A protocol providing results for a OpenedRepository.GetUpdateComplete call.
+// Only one event will be sent before the channel is closed.
+protocol FetchResult {
+    // Sent when the package is successfully installed and available for use.
+    -> OnSuccess(string merkle);
+    // Sent when the package fails to install for some reason.
+    -> OnError(zx.status result, string message);
+};