Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(259)

Unified Diff: client/cipd.py

Issue 2267363004: Add CIPD pin reporting to swarming. (Closed) Base URL: https://chromium.googlesource.com/external/github.com/luci/luci-py@master
Patch Set: Fix bottest Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « appengine/swarming/templates/user_task.html ('k') | client/run_isolated.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: client/cipd.py
diff --git a/client/cipd.py b/client/cipd.py
index 8881ef2ecad75d22fd150ea8733fd230e25d6854..5f329638762b03c92938f0eee597c7c6f27be478 100644
--- a/client/cipd.py
+++ b/client/cipd.py
@@ -4,11 +4,12 @@
"""Fetches CIPD client and installs packages."""
-__version__ = '0.2'
+__version__ = '0.3'
import collections
import contextlib
import hashlib
+import json
import logging
import optparse
import os
@@ -104,15 +105,19 @@ def validate_cipd_options(parser, options):
class CipdClient(object):
"""Installs packages."""
- def __init__(self, binary_path, service_url=None):
+ def __init__(self, binary_path, package_name, instance_id, service_url):
"""Initializes CipdClient.
Args:
binary_path (str): path to the CIPD client binary.
+ package_name (str): the CIPD package name for the client itself.
+ instance_id (str): the CIPD instance_id for the client itself.
service_url (str): if not None, URL of the CIPD backend that overrides
the default one.
"""
self.binary_path = binary_path
+ self.package_name = package_name
+ self.instance_id = instance_id
self.service_url = service_url
def ensure(
@@ -129,6 +134,10 @@ class CipdClient(object):
tmp_dir (str): if not None, dir for temp files.
timeout (int): if not None, timeout in seconds for this function to run.
+ Returns:
+ Pinned packages in the form of [(package_name, package_id)], which
+ correspond 1:1 with the input packages argument.
+
Raises:
Error if could not install packages or timed out.
"""
@@ -137,6 +146,10 @@ class CipdClient(object):
list_file_handle, list_file_path = tempfile.mkstemp(
dir=tmp_dir, prefix=u'cipd-ensure-list-', suffix='.txt')
+ json_out_file_handle, json_file_path = tempfile.mkstemp(
+ dir=tmp_dir, prefix=u'cipd-ensure-result-', suffix='.json')
+ os.close(json_out_file_handle)
+
try:
try:
for pkg, version in packages:
@@ -150,6 +163,7 @@ class CipdClient(object):
'-root', site_root,
'-list', list_file_path,
'-verbose', # this is safe because cipd-ensure does not print a lot
+ '-json-output', json_file_path,
]
if cache_dir:
cmd += ['-cache-dir', cache_dir]
@@ -180,8 +194,12 @@ class CipdClient(object):
raise Error(
'Could not install packages; exit code %d\noutput:%s' % (
exit_code, '\n'.join(output)))
+ with open(json_file_path) as jfile:
+ result_json = json.load(jfile)
+ return [(x['package'], x['instance_id']) for x in result_json['result']]
finally:
fs.remove(list_file_path)
+ fs.remove(json_file_path)
def get_platform():
@@ -399,7 +417,8 @@ def get_client(
with instance_cache.getfileobj(instance_id) as f:
isolateserver.putfile(f, binary_path, 0511) # -r-x--x--x
- yield CipdClient(binary_path)
+ yield CipdClient(binary_path, package_name=package_name,
+ instance_id=instance_id, service_url=service_url)
def parse_package_args(packages):
@@ -408,15 +427,14 @@ def parse_package_args(packages):
Assumes |packages| were validated by validate_cipd_options.
Returns:
- A map {path: [(package, version)]}.
+ A list of [(path, package_name, version), ...]
"""
- result = collections.defaultdict(list)
+ result = []
for pkg in packages:
path, name, version = pkg.split(':', 2)
- path = path.replace('/', os.path.sep)
if not name:
raise Error('Invalid package "%s": package name is not specified' % pkg)
if not version:
raise Error('Invalid package "%s": version is not specified' % pkg)
- result[path].append((name, version))
+ result.append((path, name, version))
return result
« no previous file with comments | « appengine/swarming/templates/user_task.html ('k') | client/run_isolated.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698