gcloud 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. data.tar.gz.sig +2 -3
  2. data/CHANGELOG +4 -0
  3. data/LICENSE +674 -0
  4. data/Manifest +111 -0
  5. data/README.md +4 -3
  6. data/bin/gcutil +53 -0
  7. data/gcloud.gemspec +4 -3
  8. data/packages/gcutil-1.7.1/CHANGELOG +197 -0
  9. data/packages/gcutil-1.7.1/LICENSE +202 -0
  10. data/packages/gcutil-1.7.1/VERSION +1 -0
  11. data/packages/gcutil-1.7.1/gcutil +53 -0
  12. data/packages/gcutil-1.7.1/lib/google_api_python_client/LICENSE +23 -0
  13. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/__init__.py +1 -0
  14. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/discovery.py +743 -0
  15. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/errors.py +123 -0
  16. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/ext/__init__.py +0 -0
  17. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/http.py +1443 -0
  18. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/mimeparse.py +172 -0
  19. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/model.py +385 -0
  20. data/packages/gcutil-1.7.1/lib/google_api_python_client/apiclient/schema.py +303 -0
  21. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/__init__.py +1 -0
  22. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/anyjson.py +32 -0
  23. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/appengine.py +528 -0
  24. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/client.py +1139 -0
  25. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/clientsecrets.py +105 -0
  26. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/crypt.py +244 -0
  27. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/django_orm.py +124 -0
  28. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/file.py +107 -0
  29. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/locked_file.py +343 -0
  30. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/multistore_file.py +379 -0
  31. data/packages/gcutil-1.7.1/lib/google_api_python_client/oauth2client/tools.py +174 -0
  32. data/packages/gcutil-1.7.1/lib/google_api_python_client/uritemplate/__init__.py +147 -0
  33. data/packages/gcutil-1.7.1/lib/google_apputils/LICENSE +202 -0
  34. data/packages/gcutil-1.7.1/lib/google_apputils/google/__init__.py +3 -0
  35. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/__init__.py +3 -0
  36. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/app.py +356 -0
  37. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/appcommands.py +783 -0
  38. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/basetest.py +1260 -0
  39. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/datelib.py +421 -0
  40. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/debug.py +60 -0
  41. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/file_util.py +181 -0
  42. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/resources.py +67 -0
  43. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/run_script_module.py +217 -0
  44. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/setup_command.py +159 -0
  45. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/shellutil.py +49 -0
  46. data/packages/gcutil-1.7.1/lib/google_apputils/google/apputils/stopwatch.py +204 -0
  47. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/__init__.py +0 -0
  48. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/auth_helper.py +140 -0
  49. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/auth_helper_test.py +149 -0
  50. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/auto_auth.py +130 -0
  51. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/auto_auth_test.py +75 -0
  52. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/basic_cmds.py +128 -0
  53. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/basic_cmds_test.py +111 -0
  54. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/command_base.py +1808 -0
  55. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/command_base_test.py +1651 -0
  56. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/compute/v1beta13.json +2851 -0
  57. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/compute/v1beta14.json +3361 -0
  58. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/disk_cmds.py +342 -0
  59. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/disk_cmds_test.py +474 -0
  60. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/firewall_cmds.py +344 -0
  61. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/firewall_cmds_test.py +231 -0
  62. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/flags_cache.py +274 -0
  63. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/gcutil +89 -0
  64. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/gcutil_logging.py +69 -0
  65. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/image_cmds.py +262 -0
  66. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/image_cmds_test.py +172 -0
  67. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/instance_cmds.py +1506 -0
  68. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/instance_cmds_test.py +1904 -0
  69. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/kernel_cmds.py +91 -0
  70. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/kernel_cmds_test.py +56 -0
  71. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/machine_type_cmds.py +106 -0
  72. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/machine_type_cmds_test.py +59 -0
  73. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/metadata.py +96 -0
  74. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/metadata_lib.py +357 -0
  75. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/metadata_test.py +84 -0
  76. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/mock_api.py +420 -0
  77. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/mock_metadata.py +58 -0
  78. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/move_cmds.py +824 -0
  79. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/move_cmds_test.py +307 -0
  80. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/network_cmds.py +178 -0
  81. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/network_cmds_test.py +133 -0
  82. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/operation_cmds.py +181 -0
  83. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/operation_cmds_test.py +196 -0
  84. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/path_initializer.py +38 -0
  85. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/project_cmds.py +173 -0
  86. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/project_cmds_test.py +111 -0
  87. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/scopes.py +61 -0
  88. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/scopes_test.py +50 -0
  89. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/snapshot_cmds.py +276 -0
  90. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/snapshot_cmds_test.py +260 -0
  91. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/ssh_keys.py +266 -0
  92. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/ssh_keys_test.py +128 -0
  93. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/table_formatter.py +563 -0
  94. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/thread_pool.py +188 -0
  95. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/thread_pool_test.py +88 -0
  96. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/utils.py +208 -0
  97. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/utils_test.py +193 -0
  98. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/version.py +17 -0
  99. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/version_checker.py +246 -0
  100. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/version_checker_test.py +271 -0
  101. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/zone_cmds.py +151 -0
  102. data/packages/gcutil-1.7.1/lib/google_compute_engine/gcutil/zone_cmds_test.py +60 -0
  103. data/packages/gcutil-1.7.1/lib/httplib2/LICENSE +21 -0
  104. data/packages/gcutil-1.7.1/lib/httplib2/httplib2/__init__.py +1630 -0
  105. data/packages/gcutil-1.7.1/lib/httplib2/httplib2/cacerts.txt +714 -0
  106. data/packages/gcutil-1.7.1/lib/httplib2/httplib2/iri2uri.py +110 -0
  107. data/packages/gcutil-1.7.1/lib/httplib2/httplib2/socks.py +438 -0
  108. data/packages/gcutil-1.7.1/lib/iso8601/LICENSE +20 -0
  109. data/packages/gcutil-1.7.1/lib/iso8601/iso8601/__init__.py +1 -0
  110. data/packages/gcutil-1.7.1/lib/iso8601/iso8601/iso8601.py +102 -0
  111. data/packages/gcutil-1.7.1/lib/iso8601/iso8601/test_iso8601.py +111 -0
  112. data/packages/gcutil-1.7.1/lib/python_gflags/AUTHORS +2 -0
  113. data/packages/gcutil-1.7.1/lib/python_gflags/LICENSE +28 -0
  114. data/packages/gcutil-1.7.1/lib/python_gflags/gflags.py +2862 -0
  115. data/packages/gcutil-1.7.1/lib/python_gflags/gflags2man.py +544 -0
  116. data/packages/gcutil-1.7.1/lib/python_gflags/gflags_validators.py +187 -0
  117. metadata +118 -5
  118. metadata.gz.sig +0 -0
@@ -0,0 +1,274 @@
1
+ # Copyright 2012 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Cache of previously used flag values."""
16
+
17
+ from __future__ import with_statement
18
+
19
+
20
+
21
+ import copy
22
+ import os
23
+
24
+ import gflags as flags
25
+ from gcutil import gcutil_logging
26
+
27
+ FLAGS = flags.FLAGS
28
+ LOGGER = gcutil_logging.LOGGER
29
+
30
+ flags.DEFINE_bool(
31
+ 'cache_flag_values',
32
+ False,
33
+ 'If true, cache all specified flag values in the file specified '
34
+ 'by the "cached_flags_file" flag.')
35
+ flags.DEFINE_string(
36
+ 'cached_flags_file',
37
+ '.gcutil.flags',
38
+ 'File storing a cache of gcutil flag values. If the name does not '
39
+ 'contain a path separator it will be searched in the current working '
40
+ 'directory and up to "/", as well as the user\'s home directory. '
41
+ 'The first matching file will be used and no merging is done upstream. '
42
+ 'Use the "cache_flag_values" flag to persist the current flags.')
43
+
44
+
45
+ class FlagsCache(object):
46
+ """File based cache of values for flags with user-specific defaults."""
47
+
48
+ def __init__(self, cache_file_name=None, open_function=open, os_module=os):
49
+ """Constructor.
50
+
51
+ Args:
52
+ cache_file_name: (str) optional path of the flags cache file (default
53
+ is FLAGS.cached_flags_file).
54
+ open_function: (function) used to open a file (overriden in tests).
55
+ os_module: (module) used to perform OS operations (overriden in testsa).
56
+ """
57
+ self._open = open_function
58
+ self._os = os_module
59
+ self.cache_file_path = FlagsCache._FindFlagsCacheFile(
60
+ cache_file_name or FLAGS.cached_flags_file, self._os)
61
+ if self._os.path.exists(self.cache_file_path):
62
+ LOGGER.debug('Found flag cache file: %s', self.cache_file_path)
63
+ with self._open(self.cache_file_path) as cache_file:
64
+ self.cache_string = cache_file.read()
65
+ else:
66
+ self.cache_string = ''
67
+
68
+ self._serialized_flags = None
69
+
70
+ @staticmethod
71
+ def _FindFlagsCacheFile(name, os_module):
72
+ """Returns the full path to the flags cache file.
73
+
74
+ If the name contains a file separator or a user expander ('~'), then
75
+ its full expanded path is returned. Otherwise name is searched in
76
+ the current working directory and recursively up, as well as in the
77
+ user's home directory. If an existing flags cache file cannot be found,
78
+ then the full path to the config file in the user's home directory is
79
+ returned so that it can be optionally created.
80
+
81
+ Args:
82
+ name: (string) the name of the file to search.
83
+ os_module: (module) used to perform OS operations.
84
+ Returns:
85
+ (string) the path to an existing or expected cache flag file, or the
86
+ empty string if name is None or empty.
87
+ """
88
+ if not name:
89
+ return ''
90
+
91
+ name = os_module.path.expanduser(name)
92
+
93
+ if os_module.path.isdir(name):
94
+ gcutil_flags = '.gcutil.flags'
95
+ return os_module.path.join(name, gcutil_flags)
96
+ elif os_module.path.dirname(name):
97
+ # name contains a path separator.
98
+ return os_module.path.realpath(name)
99
+
100
+ # Search for the flags cache file up the directory path.
101
+ directory = os_module.path.realpath(os_module.getcwd())
102
+ while directory:
103
+ filename = os_module.path.join(directory, name)
104
+ if os_module.path.exists(filename):
105
+ return filename
106
+ parent = os_module.path.dirname(directory)
107
+ if parent == directory:
108
+ directory = None
109
+ else:
110
+ directory = parent
111
+
112
+ # Use the flags cache file in the home directory.
113
+ return os_module.path.realpath(os_module.path.expanduser(
114
+ os_module.path.join('~', name)))
115
+
116
+ @staticmethod
117
+ def _GetCacheableFlagValues(flag_values):
118
+ """Get the subset of flags that are appropriate to cache.
119
+
120
+ All non-duplicate flags excluding --cache_flag_values and
121
+ --cached_flags_file are eligible for caching.
122
+
123
+ Args:
124
+ flag_values: The superset FlagValues object.
125
+ Returns:
126
+ A subset FlagValues object that contains only the cacheable flags.
127
+ """
128
+ cacheable_flag_values = flags.FlagValues()
129
+ for name, flag in flag_values.FlagDict().iteritems():
130
+ # We only process the flag if seen by its full name (not short_name).
131
+ if (name == flag.name and
132
+ not name in ['cache_flag_values', 'cached_flags_file'] and
133
+ not name in cacheable_flag_values and
134
+ not flag.short_name in cacheable_flag_values):
135
+ cacheable_flag_values[name] = flag
136
+
137
+ return cacheable_flag_values
138
+
139
+ @staticmethod
140
+ def _GetCachedFlagValues(flag_values, cache_string):
141
+ """Get the values for cacheable flags from the given cache string.
142
+
143
+ Any flags in the parsed_flags argument will be omitted regardless of
144
+ whether or not they are in the cache_string. This allows cached and
145
+ parsed flags to be combined without conflict.
146
+
147
+ Args:
148
+ flag_values: A FlagValues instance defining the cacheable flags.
149
+ cache_string: The contents of the cache as a newline delimited string.
150
+ Returns:
151
+ A FlagValues instance containing the flags present in the cache.
152
+ """
153
+ # We don't want to inadvertantly overwrite the parsed members of the
154
+ # cacheable_flags, so we make a deep copy of it before appending.
155
+ flag_values_copy = copy.deepcopy(flag_values)
156
+
157
+ # Clear flags to load cache into clean state.
158
+ for _, flag in flag_values_copy.FlagDict().iteritems():
159
+ flag.present = 0
160
+ flag.value = None
161
+
162
+ cached_flag_values = flags.FlagValues()
163
+ cached_flag_values.AppendFlagValues(flag_values_copy)
164
+ undefok = []
165
+ cache_entries = cache_string.split('\n')
166
+ while cache_entries:
167
+ try:
168
+ argv = (['dummy_command', '--undefok=\'%s\'' % ','.join(undefok)] +
169
+ cache_entries)
170
+ cache_entries = cached_flag_values(argv)[2:]
171
+ except flags.UnrecognizedFlagError, err:
172
+ undefok.append(err.flagname)
173
+ return cached_flag_values
174
+
175
+ @staticmethod
176
+ def _UnifyProjectFlags(flags, warn=False):
177
+ """Unifies --project and --project_id flags in the flag value set.
178
+
179
+ Args:
180
+ flags: A FlagValues instance with the flags to unify.
181
+ warn: If True, log warning if project_id is encountered.
182
+ """
183
+ if 'project_id' in flags and 'project' in flags:
184
+ project_id = flags['project_id']
185
+ project = flags['project']
186
+ if project_id.present:
187
+ if not project.present:
188
+ if warn:
189
+ LOGGER.warning('--project_id is deprecated, please use --project')
190
+ project.present = project_id.present
191
+ project.value = project_id.value
192
+ elif warn:
193
+ LOGGER.warning('--project_id and --project provided. '
194
+ '--project_id is deprecated, using value of '
195
+ '--project.')
196
+ project_id.present = 0
197
+ project_id.value = None
198
+
199
+ @staticmethod
200
+ def _ApplyCachedFlags(cacheable, cached):
201
+ """Applies cached values to the flags in cacheable flag set.
202
+
203
+ Only flags that are not themselves present are updated with the
204
+ cached value. Returns flags whose value is present, either by
205
+ user specifying them at command line (cacheable) or by having been
206
+ loaded from cache (cached).
207
+
208
+ Args:
209
+ cacheable: flags whose value can be cached (and whose values will be
210
+ updated from cache if value not present)
211
+ cache: flags loaded from the cache.
212
+
213
+ Returns:
214
+ FlagValues object which contains all present flags
215
+ """
216
+ canonical = flags.FlagValues()
217
+ for name, flag in cacheable.FlagDict().iteritems():
218
+ if flag.name == name:
219
+ if not flag.present:
220
+ cached_flag = cached[name]
221
+ if cached_flag.present:
222
+ LOGGER.debug('Flag override from cache file: %s -> %s',
223
+ repr(name), repr(cached_flag.value))
224
+ flag.present = cached_flag.present
225
+ flag.value = cached_flag.value
226
+
227
+ if flag.present:
228
+ canonical[name] = flag
229
+ return canonical
230
+
231
+ def UpdateCacheFile(self, update_cache=None):
232
+ """Updates the flags cache file.
233
+
234
+ This method assumes that SynchronizeFlags() has been called. If
235
+ the assumption is violated, this method will produce a DEBUG log
236
+ message and return.
237
+
238
+ Args:
239
+ update_cache: If True, updates the cache file. This is for testing.
240
+ """
241
+ if self._serialized_flags is None:
242
+ LOGGER.debug('Flags cache cannot be updated before synchronizing flags.')
243
+ return
244
+
245
+ if update_cache or FLAGS.cache_flag_values:
246
+ with self._open(self.cache_file_path, 'w') as cache_file:
247
+ cache_file.write(self._serialized_flags)
248
+
249
+ def SynchronizeFlags(self, flag_values=None):
250
+ """Synchronize the given FlagValues instance with this cache.
251
+
252
+ This updates the FlagValues instance with values for any unparsed flags if
253
+ they have an entry in the cache.
254
+
255
+ Args:
256
+ flag_values: The FlagValues instance to synchronized. If not specified,
257
+ then the global FlagValues instance is used.
258
+ Returns:
259
+ The synchronized FlagValues instance.
260
+ """
261
+ if not flag_values:
262
+ flag_values = FLAGS
263
+ # update_cache will be set to a boolean value, so we have to explicitly
264
+ # check if it is None rather than relying on the implicit false behavior.
265
+
266
+ cacheable = FlagsCache._GetCacheableFlagValues(flag_values)
267
+ cached = FlagsCache._GetCachedFlagValues(cacheable, self.cache_string)
268
+
269
+ FlagsCache._UnifyProjectFlags(cacheable, True)
270
+ FlagsCache._UnifyProjectFlags(cached)
271
+
272
+ canonical = FlagsCache._ApplyCachedFlags(cacheable, cached)
273
+ self._serialized_flags = canonical.FlagsIntoString()
274
+ return flag_values
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/python
2
+ #
3
+ # Copyright 2012 Google Inc. All Rights Reserved.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ """Command line tool for interacting with Google Compute Engine.
18
+
19
+ Please refer to http://developers.google.com/compute/docs/gcutil/tips for
20
+ more information about gcutil usage.
21
+ """
22
+
23
+
24
+
25
+ import path_initializer
26
+ path_initializer.InitializeSysPath()
27
+
28
+ import atexit
29
+ import logging
30
+ import os
31
+ import sys
32
+
33
+
34
+ from google.apputils import appcommands
35
+ import gflags as flags
36
+
37
+ from gcutil import basic_cmds
38
+ from gcutil import disk_cmds
39
+ from gcutil import firewall_cmds
40
+ from gcutil import image_cmds
41
+ from gcutil import instance_cmds
42
+ from gcutil import kernel_cmds
43
+ from gcutil import machine_type_cmds
44
+ from gcutil import move_cmds
45
+ from gcutil import network_cmds
46
+ from gcutil import operation_cmds
47
+ from gcutil import project_cmds
48
+ from gcutil import snapshot_cmds
49
+ from gcutil import version_checker
50
+ from gcutil import zone_cmds
51
+
52
+
53
+ FLAGS = flags.FLAGS
54
+
55
+ # This utility will often be run in a VM and the local web server
56
+ # behavior can be annoying there.
57
+ FLAGS.SetDefault('auth_local_webserver', False)
58
+
59
+
60
+ def main(unused_argv):
61
+ # The real work is performed by the appcommands.Run() method, which
62
+ # first invokes this method, and then runs the specified command.
63
+
64
+ # Set up early logging configuration
65
+ format_string = '%(levelname)s: %(message)s'
66
+ logging.basicConfig(stream=sys.stderr, format=format_string)
67
+
68
+ # Next, register all the commands.
69
+ basic_cmds.AddCommands()
70
+ disk_cmds.AddCommands()
71
+ firewall_cmds.AddCommands()
72
+ image_cmds.AddCommands()
73
+ instance_cmds.AddCommands()
74
+ kernel_cmds.AddCommands()
75
+ machine_type_cmds.AddCommands()
76
+ move_cmds.AddCommands()
77
+ network_cmds.AddCommands()
78
+ operation_cmds.AddCommands()
79
+ project_cmds.AddCommands()
80
+ snapshot_cmds.AddCommands()
81
+ zone_cmds.AddCommands()
82
+
83
+
84
+ # Registers the version checker.
85
+ vc = version_checker.VersionChecker()
86
+ atexit.register(vc.CheckForNewVersion)
87
+
88
+ if __name__ == '__main__':
89
+ appcommands.Run()
@@ -0,0 +1,69 @@
1
+ # Copyright 2012 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Common code for logging across gcutil."""
16
+
17
+ import logging
18
+
19
+ import gflags as flags
20
+
21
+ FLAGS = flags.FLAGS
22
+
23
+ _LOG_ROOT = 'gcutil-logs'
24
+ LOGGER = logging.getLogger(_LOG_ROOT)
25
+
26
+ CRITICAL = logging.CRITICAL
27
+ FATAL = logging.FATAL
28
+ ERROR = logging.ERROR
29
+ WARNING = logging.WARNING
30
+ WARN = logging.WARN
31
+ INFO = logging.INFO
32
+ DEBUG = logging.DEBUG
33
+
34
+ _LOG_LEVELS = (DEBUG, INFO, WARNING, ERROR, CRITICAL)
35
+ _LOG_LEVEL_NAMES = tuple(map(logging.getLevelName, _LOG_LEVELS))
36
+
37
+
38
+ flags.DEFINE_enum(
39
+ 'log_level',
40
+ logging.getLevelName(logging.INFO),
41
+ _LOG_LEVEL_NAMES,
42
+ 'Logging output level for core Google Compute Engine messages. '
43
+ 'For logging output from other libraries, use library_log_level.')
44
+ flags.DEFINE_enum(
45
+ 'library_log_level',
46
+ logging.getLevelName(logging.WARN),
47
+ _LOG_LEVEL_NAMES,
48
+ 'Logging output level for libraries.')
49
+
50
+
51
+ def SetupLogging():
52
+ """Set up a logger that will have its own logging level."""
53
+ gc_handler = logging.StreamHandler()
54
+ gc_handler.setFormatter(logging.Formatter('%(levelname)s: %(message)s'))
55
+ LOGGER.addHandler(gc_handler)
56
+ LOGGER.propagate = False
57
+
58
+ log_level_map = dict(
59
+ [(logging.getLevelName(level), level) for level in _LOG_LEVELS])
60
+
61
+ # Update library_log_level to INFO if user wants to see
62
+ # dump_request_response.
63
+ if FLAGS.dump_request_response:
64
+ if (not FLAGS['library_log_level'].present and
65
+ not logging.getLogger().isEnabledFor(logging.INFO)):
66
+ FLAGS.library_log_level = 'INFO'
67
+
68
+ LOGGER.setLevel(log_level_map[FLAGS.log_level])
69
+ logging.getLogger().setLevel(log_level_map[FLAGS.library_log_level])
@@ -0,0 +1,262 @@
1
+ # Copyright 2012 Google Inc. All Rights Reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """Commands for interacting with Google Compute Engine machine images."""
16
+
17
+
18
+
19
+
20
+
21
+ from google.apputils import appcommands
22
+ import gflags as flags
23
+
24
+ from gcutil import command_base
25
+
26
+
27
+ FLAGS = flags.FLAGS
28
+
29
+
30
+
31
+ class ImageCommand(command_base.GoogleComputeCommand):
32
+ """Base command for working with the images collection."""
33
+
34
+ default_sort_field = 'name'
35
+ summary_fields = (('name', 'name'),
36
+ ('description', 'description'),
37
+ ('creation-time', 'creationTimestamp'),
38
+ ('kernel', 'preferredKernel'))
39
+
40
+ detail_fields = (('name', 'name'),
41
+ ('description', 'description'),
42
+ ('creation-time', 'creationTimestamp'),
43
+ ('kernel', 'preferredKernel'))
44
+
45
+ resource_collection_name = 'images'
46
+
47
+ def __init__(self, name, flag_values):
48
+ super(ImageCommand, self).__init__(name, flag_values)
49
+
50
+ def SetApi(self, api):
51
+ """Set the Google Compute Engine API for the command.
52
+
53
+ Args:
54
+ api: The Google Compute Engine API used by this command.
55
+
56
+ Returns:
57
+ None.
58
+ """
59
+ self._images_api = api.images()
60
+ self._kernels_api = api.kernels()
61
+
62
+
63
+ class AddImage(ImageCommand):
64
+ """Create a new machine image.
65
+
66
+ The root_source_tarball parameter must point to a tar file of the
67
+ contents of the desired root directory stored in Google Storage.
68
+ """
69
+
70
+ positional_args = '<image-name> <root-source-tarball>'
71
+
72
+ def __init__(self, name, flag_values):
73
+ super(AddImage, self).__init__(name, flag_values)
74
+ flags.DEFINE_string('description',
75
+ '',
76
+ 'Image description',
77
+ flag_values=flag_values)
78
+ flags.DEFINE_string('preferred_kernel',
79
+ None,
80
+ 'Kernel name',
81
+ flag_values=flag_values)
82
+
83
+ def Handle(self, image_name, root_source_tarball):
84
+ """Add the specified image.
85
+
86
+ Args:
87
+ image_name: The name of the image to add.
88
+ root_source_tarball: Tarball in Google Storage containing the
89
+ desired root directory for the resulting image.
90
+
91
+ Returns:
92
+ The result of inserting the image.
93
+ """
94
+
95
+ # Accept gs:// URLs.
96
+ if root_source_tarball.startswith('gs://'):
97
+ root_source_tarball = ('http://storage.googleapis.com/' +
98
+ root_source_tarball[len('gs://'):])
99
+
100
+ image_resource = {
101
+ 'kind': self._GetResourceApiKind('image'),
102
+ 'name': self.DenormalizeResourceName(image_name),
103
+ 'description': self._flags.description,
104
+ 'sourceType': 'RAW',
105
+ 'rawDisk': {
106
+ 'source': root_source_tarball,
107
+ 'containerType': 'TAR'
108
+ }
109
+ }
110
+
111
+ if self._flags.preferred_kernel:
112
+ image_resource['preferredKernel'] = self.NormalizeGlobalResourceName(
113
+ self._project, 'kernels', self._flags.preferred_kernel)
114
+ elif self._IsUsingAtLeastApiVersion('v1beta14'):
115
+ kernel = self._PromptForKernel()
116
+ image_resource['preferredKernel'] = kernel['selfLink']
117
+ image_request = self._images_api.insert(project=self._project,
118
+ body=image_resource)
119
+ return image_request.execute()
120
+
121
+
122
+ class GetImage(ImageCommand):
123
+ """Get a machine image."""
124
+
125
+ positional_args = '<image-name>'
126
+
127
+ def __init__(self, name, flag_values):
128
+ super(GetImage, self).__init__(name, flag_values)
129
+
130
+ def Handle(self, image_name):
131
+ """GSet the specified image.
132
+
133
+ Args:
134
+ image_name: The name of the image to get.
135
+
136
+ Returns:
137
+ The result of getting the image.
138
+ """
139
+ image_request = self._images_api.get(
140
+ project=self._project,
141
+ image=self.DenormalizeResourceName(image_name))
142
+
143
+ return image_request.execute()
144
+
145
+
146
+ class DeleteImage(ImageCommand):
147
+ """Delete one or more machine images.
148
+
149
+ If multiple image names are specified, the images will be deleted in parallel.
150
+ """
151
+
152
+ positional_args = '<image-name-1> ... <image-name-n>'
153
+ safety_prompt = 'Delete image'
154
+
155
+ def __init__(self, name, flag_values):
156
+ super(DeleteImage, self).__init__(name, flag_values)
157
+
158
+ def Handle(self, *image_names):
159
+ """Delete the specified images.
160
+
161
+ Args:
162
+ *image_names: The names of the images to delete.
163
+
164
+ Returns:
165
+ Tuple (results, exceptions) - results of deleting the images.
166
+ """
167
+ requests = []
168
+ for name in image_names:
169
+ requests.append(self._images_api.delete(
170
+ project=self._project,
171
+ image=self.DenormalizeResourceName(name)))
172
+ results, exceptions = self.ExecuteRequests(requests)
173
+ return (self.MakeListResult(results, 'operationList'), exceptions)
174
+
175
+
176
+ class ListImages(ImageCommand, command_base.GoogleComputeListCommand):
177
+ """List the images for a project."""
178
+
179
+ def ListFunc(self):
180
+ """Returns the function for listing images."""
181
+ return self._images_api.list
182
+
183
+
184
+ class Deprecate(ImageCommand):
185
+ """Sets the deprecation status for an image."""
186
+
187
+ positional_args = '<image-name>'
188
+
189
+ def __init__(self, name, flag_values):
190
+ super(Deprecate, self).__init__(name, flag_values)
191
+ flags.DEFINE_enum('state',
192
+ None,
193
+ ['DEPRECATED', 'OBSOLETE', 'DELETED'],
194
+ 'The new deprecation state for this image. '
195
+ 'Valid values are DEPRECATED, OBSOLETE, and '
196
+ 'DELETED. DEPRECATED resources will generate '
197
+ 'a warning when new uses occur, OBSOLETE '
198
+ 'and DELETED resources generate an error on '
199
+ 'new uses.',
200
+ flag_values=flag_values)
201
+ flags.DEFINE_string('replacement',
202
+ None,
203
+ 'A valid full URL to a compute engine image. '
204
+ 'Users of the deprecated image will be advised '
205
+ 'to switch to this replacement.',
206
+ flag_values=flag_values)
207
+ flags.DEFINE_string('deprecated_on',
208
+ None,
209
+ 'A valid RFC 3339 full-date or date-time on which '
210
+ 'the state of this resource became or will become '
211
+ 'DEPRECATED. For example: 2020-01-02T00:00:00Z for '
212
+ 'midnight on January 2nd, 2020.',
213
+ flag_values=flag_values)
214
+ flags.DEFINE_string('obsolete_on',
215
+ None,
216
+ 'A valid RFC 3339 full-date or date-time on which '
217
+ 'the state of this resource became or will become '
218
+ 'OBSOLETE. For example: 2020-01-02T00:00:00Z for '
219
+ 'midnight on January 2nd, 2020.',
220
+ flag_values=flag_values)
221
+ flags.DEFINE_string('deleted_on',
222
+ None,
223
+ 'A valid RFC 3339 full-date or date-time on which '
224
+ 'the state of this resource became or will become '
225
+ 'DELETED. For example: 2020-01-02T00:00:00Z for '
226
+ 'midnight on January 2nd, 2020.',
227
+ flag_values=flag_values)
228
+
229
+ def _BuildRequest(self, image_name):
230
+ """Build a request to set deprecation status for the given image."""
231
+ deprecation_status = {
232
+ 'state': self._flags.state,
233
+ 'replacement': self.NormalizeGlobalResourceName(
234
+ self._project, 'images', self._flags.replacement),
235
+ 'deprecated': self._flags.deprecated_on,
236
+ 'obsolete': self._flags.obsolete_on,
237
+ 'deleted': self._flags.deleted_on,
238
+ }
239
+ return self._images_api.deprecate(
240
+ project=self._project,
241
+ image=self.DenormalizeResourceName(image_name),
242
+ body=deprecation_status)
243
+
244
+ def Handle(self, image_name):
245
+ """Sets deprecation status on an image.
246
+
247
+ Args:
248
+ image_name: the name of the image for which deprecation will be set.
249
+
250
+ Returns:
251
+ An operation resource.
252
+ """
253
+ set_deprecation_request = self._BuildRequest(image_name)
254
+ return set_deprecation_request.execute()
255
+
256
+
257
+ def AddCommands():
258
+ appcommands.AddCmd('addimage', AddImage)
259
+ appcommands.AddCmd('getimage', GetImage)
260
+ appcommands.AddCmd('deleteimage', DeleteImage)
261
+ appcommands.AddCmd('listimages', ListImages)
262
+ appcommands.AddCmd('deprecateimage', Deprecate)