Chromium Code Reviews| Index: appengine/swarming/server/lease_management.py |
| diff --git a/appengine/swarming/server/lease_management.py b/appengine/swarming/server/lease_management.py |
| index 2c3e87d9b66e87d5d40f38f94c5de2459d4146a5..fa8d8413125571c77a8a479256fe1102388221a3 100644 |
| --- a/appengine/swarming/server/lease_management.py |
| +++ b/appengine/swarming/server/lease_management.py |
| @@ -71,6 +71,8 @@ class MachineLease(ndb.Model): |
| lease_duration_secs = ndb.IntegerProperty(indexed=False) |
| # DateTime indicating lease expiration time. |
| lease_expiration_ts = ndb.DateTimeProperty() |
| + # Lease ID assigned by Machine Provider. |
| + lease_id = ndb.StringProperty(indexed=False) |
| # ndb.Key for the MachineType this MachineLease is created for. |
| machine_type = ndb.KeyProperty() |
| # machine_provider.Dimensions describing the machine. |
| @@ -231,13 +233,15 @@ def clear_lease_request(key, request_id): |
| @ndb.transactional |
| -def log_lease_fulfillment(key, request_id, hostname, lease_expiration_ts): |
| +def log_lease_fulfillment( |
| + key, request_id, hostname, lease_expiration_ts, lease_id): |
| """Logs lease fulfillment. |
| Args: |
| request_id: ID of the request being fulfilled. |
| hostname: Hostname of the machine fulfilling the request. |
| lease_expiration_ts: UTC seconds since epoch when the lease expires. |
| + lease_id: ID of the lease assigned by Machine Provider. |
| """ |
| machine_lease = key.get() |
| if not machine_lease: |
| @@ -254,12 +258,14 @@ def log_lease_fulfillment(key, request_id, hostname, lease_expiration_ts): |
| return |
| if (hostname == machine_lease.hostname |
| - and lease_expiration_ts == machine_lease.lease_expiration_ts): |
| + and lease_expiration_ts == machine_lease.lease_expiration_ts |
| + and lease_id == machine_lease.lease_id): |
| return |
| machine_lease.hostname = hostname |
| machine_lease.lease_expiration_ts = datetime.datetime.utcfromtimestamp( |
| lease_expiration_ts) |
| + machine_lease.lease_id = lease_id |
| machine_lease.put() |
| @@ -370,8 +376,8 @@ def handle_lease_request_response(machine_lease, response): |
| machine_lease.client_request_id, |
| response['hostname'], |
| int(response['lease_expiration_ts']), |
| + response['request_hash'], |
| ) |
| - # TODO(smut): Create BotInfo, associate lease information. |
| elif state == machine_provider.LeaseRequestState.DENIED: |
| logging.warning( |
| 'Request denied: %s\nRequest ID: %s', |
| @@ -420,9 +426,31 @@ def manage_lease(key): |
| # Manage a leased machine. |
| if machine_lease.lease_expiration_ts: |
| + assert machine_lease.hostname, key |
| + bot_info = bot_management.get_info_key(machine_lease.hostname).get() |
| + if not (bot_info and bot_info.lease_id and bot_info.lease_expiration_ts): |
| + bot_management.bot_event( |
| + event_type='bot_leased', |
| + bot_id=machine_lease.hostname, |
| + external_ip=None, |
| + authenticated_as=None, |
| + dimensions={ |
|
M-A Ruel
2016/10/06 23:37:28
I guess it's fine to not put any (?)
In that case
smut
2016/10/06 23:48:50
Done.
It looks kind of funny in the UI if this is
|
| + 'id': [machine_lease.hostname], |
| + # datetime_to_timestamp returns microseconds. |
| + 'lease_expiration_ts': [utils.datetime_to_timestamp( |
| + machine_lease.lease_expiration_ts) / 1000 / 1000], |
| + }, |
| + state=None, |
| + version=None, |
| + quarantined=False, |
| + task_id='', |
| + task_name=None, |
| + lease_id=machine_lease.lease_id, |
| + lease_expiration_ts=machine_lease.lease_expiration_ts, |
| + ) |
| + |
| if machine_lease.lease_expiration_ts <= utils.utcnow(): |
| logging.info('MachineLease expired: %s', key) |
| - assert machine_lease.hostname, key |
| clear_lease_request(key, machine_lease.client_request_id) |
| return |