Skip to content

Commit

Permalink
Fix get_version() to match the latest run-time environment.
Browse files Browse the repository at this point in the history
Closes issue google#76.
  • Loading branch information
EranGabber committed Jul 5, 2015
1 parent 2cd1165 commit 7047bcc
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 28 deletions.
6 changes: 2 additions & 4 deletions collector/collector_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,10 +316,8 @@ def test_version(self):
self.assertTrue(result.get('success'))
version = result.get('version')
self.assertTrue(isinstance(version, types.StringTypes))
# TODO(eran): restore this test once the /version endpoint is fixed.
# self.assertEqual(
# 'kubernetes/cluster-insight ac933439ec5a 2015-03-28T17:23:41', version)
self.assertEqual('_unknown_', version)
self.assertEqual(
'kubernetes/cluster-insight ac933439ec5a 2015-03-28T17:23:41', version)

def test_minions_status(self):
"""Test the '/minions_status' endpoint."""
Expand Down
11 changes: 10 additions & 1 deletion collector/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,16 @@ def _do_compute_graph(gs, input_queue, output_queue, output_format):
assert utilities.valid_string(output_format)

g = ContextGraph()
g.set_version(docker.get_version(gs))
try:
version = docker.get_version(gs)
except Exception as e:
exc_type, value, _ = sys.exc_info()
msg = ('get_version() failed with exception %s: %s' %
(exc_type, value))
gs.logger_error(msg)
version = '_unknown_'

g.set_version(version)
g.set_relations_to_timestamps(gs.get_relations_to_timestamps())

# Nodes
Expand Down
42 changes: 33 additions & 9 deletions collector/docker.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"""

import json
import os
import re
import sys
import time
Expand Down Expand Up @@ -681,9 +682,6 @@ def get_version(gs):
CollectorError: in case of any error to compute the running image
information.
"""
return '_unknown_'
# TODO(eran): fix the error
# could not find an entry for \"cpu:/docker/...\" in /proc/self/cgroup
version, timestamp_secs = gs.get_version_cache().lookup('')
if timestamp_secs is not None:
assert utilities.valid_string(version)
Expand All @@ -709,17 +707,41 @@ def get_version(gs):
gs.logger_exception(msg)
raise collector_error.CollectorError(msg)

# The file must contain an entry for 'cpu:/docker/...'.
m = re.search(r'\b[0-9]+:cpu:/docker/([0-9a-fA-F]+)\b', cgroup)
# The file must contain an entry for '\d+:cpu:/...'.
m = re.search(r'\b\d+:cpu:/([0-9a-fA-F]+)\b', cgroup)
if not m:
msg = 'could not find an entry for "cpu:/docker/..." in %s' % fname
gs.logger_error(msg)
raise collector_error.CollectorError(msg)

hex_container_id = m.group(1)
if gs.get_testing():
# This pod name is guaranteed to match a pod in the testdata directory.
my_pod_name = 'kube-dns-bqw5e'
else:
my_pod_name = os.uname()[1]
assert utilities.valid_string(my_pod_name)

# Find my node name from my pod.
my_node_name = None
for pod in kubernetes.get_pods(gs):
assert utilities.is_wrapped_object(pod, 'Pod')
if pod['id'] == my_pod_name:
my_node_name = utilities.get_attribute(
pod, ['properties', 'spec', 'nodeName'])
break

if not utilities.valid_string(my_node_name):
msg = ('could not find pod %s or this pod does not contain a valid '
'node name' % my_pod_name)
gs.logger_error(msg)
raise collector_error.CollectorError(msg)

# inspect the running container.
url = 'http://localhost:{port}/containers/{container_id}/json'.format(
port=gs.get_docker_port(), container_id=hex_container_id)
# Must specify an explicit host name (not "localhost").
url = 'http://{host}:{port}/containers/{container_id}/json'.format(
host=my_node_name, port=gs.get_docker_port(),
container_id=hex_container_id)
container = fetch_data(gs, url, 'container-' + hex_container_id[:12])

# Fetch the image symbolic name and hex ID from the container information.
Expand All @@ -735,8 +757,10 @@ def get_version(gs):
raise collector_error.CollectorError(msg)

# Fetch image information.
url = 'http://localhost:{port}/images/{image_id}/json'.format(
port=gs.get_docker_port(), image_id=hex_image_id)
# Must specify an explicit host name (not "localhost").
url = 'http://{host}:{port}/images/{image_id}/json'.format(
host=my_node_name, port=gs.get_docker_port(),
image_id=hex_image_id)
image = fetch_data(gs, url, 'image-' + hex_image_id[:12])

# Fetch the image creation timestamp.
Expand Down
9 changes: 3 additions & 6 deletions collector/docker_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,7 @@ def get_response(req, cache=None):
requests.codes.ok,
{'Content-Type': 'application/json'})

except Exception as e:
app.logger.error(e, exc_info=True)
except:
exc_type, value, _ = sys.exc_info()
msg = ('Failed to retrieve %s with exception %s: %s' %
(req, exc_type, value))
Expand Down Expand Up @@ -167,8 +166,7 @@ def fill_cache(cache):
app.logger.error('invalid response format from "/containers/json"')
return

except Exception as e:
app.logger.error(e, exc_info=True)
except:
exc_type, value, _ = sys.exc_info()
msg = ('Failed to fetch /containers/json with exception %s: %s' %
(exc_type, value))
Expand Down Expand Up @@ -196,8 +194,7 @@ def fill_cache(cache):
cache.update(req, json.dumps(result))
app.logger.info('caching result of request=%s', req)

except Exception as e:
app.logger.error(e, exc_info=True)
except:
exc_type, value, _ = sys.exc_info()
msg = ('Failed to fetch %s with exception %s: %s' %
(req, exc_type, value))
Expand Down
16 changes: 8 additions & 8 deletions collector/testdata/proc-self-cgroup.txt
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
10:net_prio:/
9:perf_event:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
8:blkio:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
9:perf_event:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
8:blkio:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
7:net_cls:/
6:freezer:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
5:devices:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
4:memory:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
3:cpuacct:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
2:cpu:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
1:cpuset:/docker/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
6:freezer:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
5:devices:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
4:memory:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
3:cpuacct:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
2:cpu:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00
1:cpuset:/21bef774fd5e952dc07d9b81b96fd0b5d2b0b0cfdeb68e6262eb8f74c3555a00

0 comments on commit 7047bcc

Please sign in to comment.