Skip to content

Commit f220a36

Browse files
committed
Merge pull request #1331 from dhermes/expand-default-project
Updating default project to also use App Engine and Compute Engine.
2 parents 9e16599 + 4b23559 commit f220a36

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

gcloud/_helpers.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,12 @@ def _get_production_project():
188188
def _determine_default_project(project=None):
189189
"""Determine default project ID explicitly or implicitly as fall-back.
190190
191-
In implicit case, currently only supports enviroment variable but will
192-
support App Engine, Compute Engine and other environments in the future.
191+
In implicit case, supports three environments. In order of precedence, the
192+
implicit environments are:
193193
194-
Local environment variable used is:
195-
- GCLOUD_PROJECT
194+
* GCLOUD_PROJECT environment variable
195+
* Google App Engine application ID
196+
* Google Compute Engine project ID (from metadata server)
196197
197198
:type project: string
198199
:param project: Optional. The project name to use as default.
@@ -203,6 +204,12 @@ def _determine_default_project(project=None):
203204
if project is None:
204205
project = _get_production_project()
205206

207+
if project is None:
208+
project = _app_engine_id()
209+
210+
if project is None:
211+
project = _compute_engine_id()
212+
206213
return project
207214

208215

gcloud/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import six
1818

19-
from gcloud._helpers import _get_production_project
19+
from gcloud._helpers import _determine_default_project
2020
from gcloud.connection import Connection
2121
from gcloud.credentials import get_credentials
2222
from gcloud.credentials import get_for_service_account_json
@@ -137,8 +137,7 @@ class _ClientProjectMixin(object):
137137
"""
138138

139139
def __init__(self, project=None):
140-
if project is None:
141-
project = _get_production_project()
140+
project = _determine_default_project(project)
142141
if project is None:
143142
raise ValueError('Project was not passed and could not be '
144143
'determined from the environment.')

gcloud/test__helpers.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ def _callFUT(self, project=None):
214214
from gcloud._helpers import _determine_default_project
215215
return _determine_default_project(project=project)
216216

217-
def _determine_default_helper(self, prod=None, project=None):
217+
def _determine_default_helper(self, prod=None, gae=None, gce=None,
218+
project=None):
218219
from gcloud._testing import _Monkey
219220
from gcloud import _helpers
220221

@@ -224,8 +225,18 @@ def prod_mock():
224225
_callers.append('prod_mock')
225226
return prod
226227

228+
def gae_mock():
229+
_callers.append('gae_mock')
230+
return gae
231+
232+
def gce_mock():
233+
_callers.append('gce_mock')
234+
return gce
235+
227236
patched_methods = {
228237
'_get_production_project': prod_mock,
238+
'_app_engine_id': gae_mock,
239+
'_compute_engine_id': gce_mock,
229240
}
230241

231242
with _Monkey(_helpers, **patched_methods):
@@ -236,7 +247,7 @@ def prod_mock():
236247
def test_no_value(self):
237248
project, callers = self._determine_default_helper()
238249
self.assertEqual(project, None)
239-
self.assertEqual(callers, ['prod_mock'])
250+
self.assertEqual(callers, ['prod_mock', 'gae_mock', 'gce_mock'])
240251

241252
def test_explicit(self):
242253
PROJECT = object()
@@ -250,6 +261,18 @@ def test_prod(self):
250261
self.assertEqual(project, PROJECT)
251262
self.assertEqual(callers, ['prod_mock'])
252263

264+
def test_gae(self):
265+
PROJECT = object()
266+
project, callers = self._determine_default_helper(gae=PROJECT)
267+
self.assertEqual(project, PROJECT)
268+
self.assertEqual(callers, ['prod_mock', 'gae_mock'])
269+
270+
def test_gce(self):
271+
PROJECT = object()
272+
project, callers = self._determine_default_helper(gce=PROJECT)
273+
self.assertEqual(project, PROJECT)
274+
self.assertEqual(callers, ['prod_mock', 'gae_mock', 'gce_mock'])
275+
253276

254277
class Test__millis(unittest2.TestCase):
255278

gcloud/test_client.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,38 +149,39 @@ def test_ctor_defaults(self):
149149
CREDENTIALS = object()
150150
FUNC_CALLS = []
151151

152-
def mock_get_proj():
153-
FUNC_CALLS.append('_get_production_project')
152+
def mock_determine_proj(project):
153+
FUNC_CALLS.append((project, '_determine_default_project'))
154154
return PROJECT
155155

156156
def mock_get_credentials():
157157
FUNC_CALLS.append('get_credentials')
158158
return CREDENTIALS
159159

160160
with _Monkey(client, get_credentials=mock_get_credentials,
161-
_get_production_project=mock_get_proj):
161+
_determine_default_project=mock_determine_proj):
162162
client_obj = self._makeOne()
163163

164164
self.assertTrue(client_obj.project is PROJECT)
165165
self.assertTrue(isinstance(client_obj.connection, _MockConnection))
166166
self.assertTrue(client_obj.connection.credentials is CREDENTIALS)
167-
self.assertEqual(FUNC_CALLS,
168-
['_get_production_project', 'get_credentials'])
167+
self.assertEqual(
168+
FUNC_CALLS,
169+
[(None, '_determine_default_project'), 'get_credentials'])
169170

170171
def test_ctor_missing_project(self):
171172
from gcloud._testing import _Monkey
172173
from gcloud import client
173174

174175
FUNC_CALLS = []
175176

176-
def mock_get_proj():
177-
FUNC_CALLS.append('_get_production_project')
177+
def mock_determine_proj(project):
178+
FUNC_CALLS.append((project, '_determine_default_project'))
178179
return None
179180

180-
with _Monkey(client, _get_production_project=mock_get_proj):
181+
with _Monkey(client, _determine_default_project=mock_determine_proj):
181182
self.assertRaises(ValueError, self._makeOne)
182183

183-
self.assertEqual(FUNC_CALLS, ['_get_production_project'])
184+
self.assertEqual(FUNC_CALLS, [(None, '_determine_default_project')])
184185

185186
def test_ctor_w_invalid_project(self):
186187
CREDENTIALS = object()

0 commit comments

Comments
 (0)