Index: go/src/infra/tools/cipd/remote.go |
diff --git a/go/src/infra/tools/cipd/remote.go b/go/src/infra/tools/cipd/remote.go |
index 7bb25f8e8f62f5a883967f4344721fe613e1f786..cf306402dc7360110b795b2bc0bd4648aa4e7c4c 100644 |
--- a/go/src/infra/tools/cipd/remote.go |
+++ b/go/src/infra/tools/cipd/remote.go |
@@ -182,6 +182,46 @@ func (r *remoteImpl) finalizeUpload(sessionID string) (finished bool, err error) |
return |
} |
+func (r *remoteImpl) resolveVersion(packageName, version string) (pin common.Pin, err error) { |
+ if err = common.ValidatePackageName(packageName); err != nil { |
+ return |
+ } |
+ if err = common.ValidateInstanceVersion(version); err != nil { |
+ return |
+ } |
+ var reply struct { |
+ Status string `json:"status"` |
+ ErrorMessage string `json:"error_message"` |
+ InstanceID string `json:"instance_id"` |
+ } |
+ params := url.Values{} |
+ params.Add("package_name", packageName) |
+ params.Add("version", version) |
+ err = r.makeRequest("repo/v1/instance/resolve?"+params.Encode(), "GET", nil, &reply) |
+ if err != nil { |
+ return |
+ } |
+ switch reply.Status { |
+ case "SUCCESS": |
+ if common.ValidateInstanceID(reply.InstanceID) != nil { |
+ err = fmt.Errorf("Backend returned invalid instance ID: %s", reply.InstanceID) |
+ } else { |
+ pin = common.Pin{PackageName: packageName, InstanceID: reply.InstanceID} |
+ } |
+ case "PACKAGE_NOT_FOUND": |
+ err = fmt.Errorf("Package '%s' is not registered", packageName) |
+ case "INSTANCE_NOT_FOUND": |
+ err = fmt.Errorf("Package '%s' doesn't have instance with version '%s'", packageName, version) |
+ case "AMBIGUOUS_VERSION": |
+ err = fmt.Errorf("More than one instance of package '%s' match version '%s'", packageName, version) |
+ case "ERROR": |
+ err = errors.New(reply.ErrorMessage) |
+ default: |
+ err = fmt.Errorf("Unexpected backend response: %s", reply.Status) |
+ } |
+ return |
+} |
+ |
func (r *remoteImpl) registerInstance(pin common.Pin) (*registerInstanceResponse, error) { |
endpoint, err := instanceEndpoint(pin) |
if err != nil { |
@@ -249,7 +289,7 @@ func (r *remoteImpl) fetchInstance(pin common.Pin) (*fetchInstanceResponse, erro |
registeredTs: ts, |
}, nil |
case "PACKAGE_NOT_FOUND": |
- return nil, fmt.Errorf("Package '%s' is not registered or you do not have permission to fetch it", pin.PackageName) |
+ return nil, fmt.Errorf("Package '%s' is not registered", pin.PackageName) |
case "INSTANCE_NOT_FOUND": |
return nil, fmt.Errorf("Package '%s' doesn't have instance '%s'", pin.PackageName, pin.InstanceID) |
case "ERROR": |