| Index: go/src/infra/tools/cipd/client.go
|
| diff --git a/go/src/infra/tools/cipd/client.go b/go/src/infra/tools/cipd/client.go
|
| index ab4b763ebd32efb2a9ab04909176abea2caa0fc6..29bbf580dabee743849e4d114f561168a2100688 100644
|
| --- a/go/src/infra/tools/cipd/client.go
|
| +++ b/go/src/infra/tools/cipd/client.go
|
| @@ -276,6 +276,23 @@ func (client *Client) UploadToCAS(sha1 string, data io.ReadSeeker, session *Uplo
|
| }
|
| }
|
|
|
| +// ResolveVersion converts an instance ID, a tag or a ref into a concrete Pin
|
| +// by contacting the backend.
|
| +func (client *Client) ResolveVersion(packageName, version string) (common.Pin, error) {
|
| + if err := common.ValidatePackageName(packageName); err != nil {
|
| + return common.Pin{}, err
|
| + }
|
| + // Is it instance ID already? Don't bother calling the backend.
|
| + if common.ValidateInstanceID(version) == nil {
|
| + return common.Pin{PackageName: packageName, InstanceID: version}, nil
|
| + }
|
| + if err := common.ValidateInstanceVersion(version); err != nil {
|
| + return common.Pin{}, err
|
| + }
|
| + client.Log.Infof("cipd: resolving version %q of %q...", version, packageName)
|
| + return client.remote.resolveVersion(packageName, version)
|
| +}
|
| +
|
| // RegisterInstance makes the package instance available for clients by
|
| // uploading it to the storage and registering it in the package repository.
|
| // 'instance' is a package instance to register.
|
| @@ -414,10 +431,8 @@ func (client *Client) FetchAndDeployInstance(root string, pin common.Pin) error
|
| // by EnsurePackages function. It is a text file where each line has a form:
|
| // <package name> <desired version>. Whitespaces are ignored. Lines that start
|
| // with '#' are ignored. Version can be specified as instance ID, tag or ref.
|
| -// Will resolve tags and refs to concrete instance IDs.
|
| +// Will resolve tags and refs to concrete instance IDs by calling the backend.
|
| func (client *Client) ProcessEnsureFile(r io.Reader) ([]common.Pin, error) {
|
| - // TODO(vadimsh): Resolve tags to instance IDs.
|
| -
|
| lineNo := 0
|
| makeError := func(msg string) error {
|
| return fmt.Errorf("Failed to parse desired state (line %d): %s", lineNo, msg)
|
| @@ -450,13 +465,17 @@ func (client *Client) ProcessEnsureFile(r io.Reader) ([]common.Pin, error) {
|
| if err != nil {
|
| return nil, makeError(err.Error())
|
| }
|
| - err = common.ValidateInstanceID(tokens[1])
|
| + err = common.ValidateInstanceVersion(tokens[1])
|
| if err != nil {
|
| return nil, makeError(err.Error())
|
| }
|
|
|
| // Good enough.
|
| - out = append(out, common.Pin{PackageName: tokens[0], InstanceID: tokens[1]})
|
| + pin, err := client.ResolveVersion(tokens[0], tokens[1])
|
| + if err != nil {
|
| + return nil, err
|
| + }
|
| + out = append(out, pin)
|
| }
|
|
|
| return out, nil
|
| @@ -565,6 +584,8 @@ type remote interface {
|
| fetchACL(packagePath string) ([]PackageACL, error)
|
| modifyACL(packagePath string, changes []PackageACLChange) error
|
|
|
| + resolveVersion(packageName, version string) (common.Pin, error)
|
| +
|
| initiateUpload(sha1 string) (*UploadSession, error)
|
| finalizeUpload(sessionID string) (bool, error)
|
| registerInstance(pin common.Pin) (*registerInstanceResponse, error)
|
|
|