xref: /aosp_15_r20/external/google-cloud-java/generation/new_client/README.md (revision 55e87721aa1bc457b326496a7ca40f3ea1a63287)
1*55e87721SMatt Gilbride# New Google Client Library Generation
2*55e87721SMatt Gilbride
3*55e87721SMatt GilbrideThe script allows you to create a new client library module in the
4*55e87721SMatt Gilbridegoogle-cloud-java monorepo.
5*55e87721SMatt Gilbride
6*55e87721SMatt Gilbride**This tool is for repository maintainers only. Not for library users.**
7*55e87721SMatt Gilbride
8*55e87721SMatt Gilbride## Prerequisites
9*55e87721SMatt Gilbride
10*55e87721SMatt GilbrideThis section is only needed for the first run of this script. If it's already
11*55e87721SMatt Gilbridedone, go to "Run client generation script" section.
12*55e87721SMatt Gilbride
13*55e87721SMatt Gilbride
14*55e87721SMatt Gilbride### Environment
15*55e87721SMatt Gilbride
16*55e87721SMatt GilbrideUse Linux environment.
17*55e87721SMatt Gilbride
18*55e87721SMatt GilbrideInstall Docker.
19*55e87721SMatt Gilbride
20*55e87721SMatt Gilbride### Ensure no Release Please "snapshot" pull request open
21*55e87721SMatt Gilbride
22*55e87721SMatt GilbrideEnsure google-cloud-java repository does not have [a pull request with "autorelease: snapshot" label](
23*55e87721SMatt Gilbridehttps://github.com/googleapis/google-cloud-java/pulls?q=is%3Apr+is%3Aopen+label%3A%22autorelease%3A+snapshot%22).
24*55e87721SMatt Gilbride
25*55e87721SMatt GilbrideIf you find one, merge it after approving it.
26*55e87721SMatt GilbrideThis is a pull request to append "-SNAPSHOT" to versions in pom.xml files in the
27*55e87721SMatt Gilbriderepostiory. It's not for an actual release.
28*55e87721SMatt Gilbride
29*55e87721SMatt GilbrideBackground: This new client library generation process creates pom.xml files with
30*55e87721SMatt Gilbridea "-SNAPSHOT" version. To have consistency with other modules, ensure the pom.xml files in
31*55e87721SMatt Gilbridethe repository has "-SNAPSHOT" versions too.
32*55e87721SMatt Gilbride
33*55e87721SMatt Gilbride
34*55e87721SMatt Gilbride### Checkout google-cloud-java repository
35*55e87721SMatt Gilbride
36*55e87721SMatt Gilbride```
37*55e87721SMatt Gilbride$ git clone https://github.com/googleapis/google-cloud-java
38*55e87721SMatt Gilbride$ git checkout main
39*55e87721SMatt Gilbride$ git pull
40*55e87721SMatt Gilbride```
41*55e87721SMatt Gilbride
42*55e87721SMatt Gilbride### Install pyenv
43*55e87721SMatt Gilbride
44*55e87721SMatt GilbrideInstall pyenv
45*55e87721SMatt Gilbride
46*55e87721SMatt Gilbride```
47*55e87721SMatt Gilbridecurl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer \
48*55e87721SMatt Gilbride| bash
49*55e87721SMatt Gilbride```
50*55e87721SMatt Gilbride
51*55e87721SMatt GilbrideAppend the following lines to `$HOME/.bashrc`.
52*55e87721SMatt Gilbride
53*55e87721SMatt Gilbride```
54*55e87721SMatt Gilbrideexport PYENV_ROOT="$HOME/.pyenv"
55*55e87721SMatt Gilbridecommand -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
56*55e87721SMatt Gilbrideeval "$(pyenv init -)"
57*55e87721SMatt Gilbrideeval "$(pyenv virtualenv-init -)"
58*55e87721SMatt Gilbride```
59*55e87721SMatt Gilbride
60*55e87721SMatt GilbrideLogout the shell and login again. You should be at the home directory.
61*55e87721SMatt Gilbride
62*55e87721SMatt GilbrideAssuming you have the following folder structure:
63*55e87721SMatt Gilbride```
64*55e87721SMatt Gilbride~ (Home)
65*55e87721SMatt Gilbride    -> IdeaProjects/
66*55e87721SMatt Gilbride        -> google-cloud-java
67*55e87721SMatt Gilbride    -> ...
68*55e87721SMatt Gilbride```
69*55e87721SMatt GilbrideYou can run these next commands in the home directory (or IdeaProjects). Otherwise, run it at `google-cloud-java`'s parent directory.
70*55e87721SMatt Gilbride
71*55e87721SMatt GilbrideConfirm pyenv installation succeeded:
72*55e87721SMatt Gilbride
73*55e87721SMatt Gilbride```
74*55e87721SMatt Gilbride~$ pyenv
75*55e87721SMatt Gilbridepyenv 2.3.4
76*55e87721SMatt GilbrideUsage: pyenv <command> [<args>]
77*55e87721SMatt Gilbride
78*55e87721SMatt GilbrideSome useful pyenv commands are:
79*55e87721SMatt Gilbride   activate    Activate virtual environment
80*55e87721SMatt Gilbride   commands    List all available pyenv commands
81*55e87721SMatt Gilbride   deactivate   Deactivate virtual environment
82*55e87721SMatt Gilbride...
83*55e87721SMatt Gilbride```
84*55e87721SMatt Gilbride
85*55e87721SMatt Gilbride### Install Python 3.9 via pyenv
86*55e87721SMatt Gilbride
87*55e87721SMatt Gilbride```
88*55e87721SMatt Gilbride~$ pyenv install 3.9.13
89*55e87721SMatt GilbrideDownloading Python-3.9.13.tar.xz...
90*55e87721SMatt Gilbride-> https://www.python.org/ftp/python/3.9.13/Python-3.9.13.tar.xz
91*55e87721SMatt GilbrideInstalling Python-3.9.13...
92*55e87721SMatt GilbrideWARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?
93*55e87721SMatt GilbrideInstalled Python-3.9.13 to /usr/local/google/home/suztomo/.pyenv/versions/3.9.13
94*55e87721SMatt Gilbride```
95*55e87721SMatt Gilbride
96*55e87721SMatt Gilbride### Install Python v3.9.13 locally
97*55e87721SMatt Gilbride
98*55e87721SMatt GilbrideRun this command
99*55e87721SMatt Gilbride
100*55e87721SMatt Gilbride```
101*55e87721SMatt Gilbride$ pyenv local 3.9.13
102*55e87721SMatt Gilbride```
103*55e87721SMatt Gilbride
104*55e87721SMatt GilbrideConfirm `python3.9` is installed:
105*55e87721SMatt Gilbride```
106*55e87721SMatt Gilbride$ which python3.9
107*55e87721SMatt Gilbride/usr/local/google/home/suztomo/.pyenv/shims/python3.9
108*55e87721SMatt Gilbride```
109*55e87721SMatt Gilbride
110*55e87721SMatt Gilbride### Install Python packages
111*55e87721SMatt Gilbride
112*55e87721SMatt GilbrideAt the root of google-cloud-java repository clone, run:
113*55e87721SMatt Gilbride
114*55e87721SMatt Gilbride```
115*55e87721SMatt Gilbride$ python3.9 -m pip install -r generation/new_client/requirements.txt
116*55e87721SMatt Gilbride```
117*55e87721SMatt Gilbride
118*55e87721SMatt Gilbride### Install GitHub CLI (Optional)
119*55e87721SMatt Gilbride
120*55e87721SMatt GilbrideInstall the GitHub CLI and login, if needed (may help with `Common Errors` below):
121*55e87721SMatt Gilbride
122*55e87721SMatt Gilbride```
123*55e87721SMatt Gilbride$ sudo apt-get install gh
124*55e87721SMatt Gilbride$ gh auth login
125*55e87721SMatt Gilbride```
126*55e87721SMatt Gilbride
127*55e87721SMatt Gilbride## Run client generation script
128*55e87721SMatt Gilbride
129*55e87721SMatt GilbrideYou will run new-client.py script with the following parameters.
130*55e87721SMatt GilbrideCollect them from the ticket before running the command.
131*55e87721SMatt Gilbride
132*55e87721SMatt Gilbride### API short name
133*55e87721SMatt Gilbride
134*55e87721SMatt GilbrideFor convenience of the subsequent commands, define a variable for API short name.
135*55e87721SMatt GilbrideGet the value from the DevRel Services page (Example: `apikeys`):
136*55e87721SMatt Gilbride
137*55e87721SMatt Gilbride### Proto path
138*55e87721SMatt Gilbride
139*55e87721SMatt GilbrideThe script takes "proto path" parameter. This is path from google3's root to the
140*55e87721SMatt Gilbridedirectory that contains versions (e.g., "v1" or "v2"). For example, if we
141*55e87721SMatt Gilbridehave
142*55e87721SMatt Gilbride
143*55e87721SMatt Gilbride> Link to protos: http://google3/google/api/apikeys/v2/apikeys.proto
144*55e87721SMatt Gilbride
145*55e87721SMatt Gilbridethen the "proto path" value we supply to the command is "google/api/apikeys".
146*55e87721SMatt Gilbride
147*55e87721SMatt Gilbride### Name pretty
148*55e87721SMatt Gilbride
149*55e87721SMatt GilbridePick name from the display name in the DevRel Services site.
150*55e87721SMatt GilbrideFor example, "API Keys API" in
151*55e87721SMatt Gilbridehttps://devrel.corp.google.com/admin/products/479.
152*55e87721SMatt Gilbride
153*55e87721SMatt Gilbride### Product Docs
154*55e87721SMatt Gilbride
155*55e87721SMatt GilbrideFind product document URL in the DevRel Services site.
156*55e87721SMatt GilbrideFor example, "https://cloud.google.com/api-keys/" in
157*55e87721SMatt Gilbridehttps://devrel.corp.google.com/admin/products/479.
158*55e87721SMatt GilbrideThe value must starts with "https://".
159*55e87721SMatt Gilbride
160*55e87721SMatt Gilbride### API description
161*55e87721SMatt Gilbride
162*55e87721SMatt GilbrideFind the short description of the API. Usually the first sentence in the product
163*55e87721SMatt Gilbridedocument above.
164*55e87721SMatt Gilbride
165*55e87721SMatt Gilbride### Example arguments
166*55e87721SMatt Gilbride
167*55e87721SMatt GilbrideRun `new-client.py` with the arguments above:
168*55e87721SMatt Gilbride
169*55e87721SMatt Gilbride```
170*55e87721SMatt Gilbride$ python3.9 generation/new_client/new-client.py generate \
171*55e87721SMatt Gilbride  --api_shortname=apikeys \
172*55e87721SMatt Gilbride  --proto-path=google/api/apikeys \
173*55e87721SMatt Gilbride  --name-pretty="API Keys API" \
174*55e87721SMatt Gilbride  --product-docs="https://cloud.google.com/api-keys/" \
175*55e87721SMatt Gilbride  --api-description="API Keys lets you create and manage your API keys for your projects."
176*55e87721SMatt Gilbride```
177*55e87721SMatt Gilbride
178*55e87721SMatt GilbrideThe command creates changes for
179*55e87721SMatt Gilbridethe new module in the monorepo. At the end (~ 10 minutes), it tells you to
180*55e87721SMatt Gilbridecreate a pull request in the monorepo:
181*55e87721SMatt Gilbride
182*55e87721SMatt Gilbride```
183*55e87721SMatt Gilbride...
184*55e87721SMatt GilbridePlease create a pull request:
185*55e87721SMatt Gilbride  $ git checkout -b new_module_java-discoveryengine
186*55e87721SMatt Gilbride  $ git add .
187*55e87721SMatt Gilbride  $ git commit -m 'feat: [apikeys] new module for apikeys'
188*55e87721SMatt Gilbride  $ gh pr create --title 'feat: [apikeys] new module for apikeys'
189*55e87721SMatt Gilbride```
190*55e87721SMatt Gilbride
191*55e87721SMatt GilbrideCreate a pull request from the change.
192*55e87721SMatt GilbrideIn the description, record the `python3.9 generation/new_client/new-client.py generate ...`
193*55e87721SMatt Gilbridecommand you ran above.
194*55e87721SMatt Gilbride
195*55e87721SMatt Gilbride## Advanced Options
196*55e87721SMatt Gilbride
197*55e87721SMatt GilbrideFor the explanation of the available parameters, run:
198*55e87721SMatt Gilbride`python3.9 generation/new_client/new-client.py generate  --help`.
199*55e87721SMatt Gilbride
200*55e87721SMatt Gilbride```
201*55e87721SMatt Gilbride~/google-cloud-java$ python3.9 generation/new_client/new-client.py generate  --help
202*55e87721SMatt Gilbride/usr/local/google/home/suztomo/google-cloud-java/generation/new_client
203*55e87721SMatt GilbrideUsage: new-client.py generate [OPTIONS]
204*55e87721SMatt Gilbride
205*55e87721SMatt GilbrideOptions:
206*55e87721SMatt Gilbride  --api_shortname TEXT            Name for the new directory name and
207*55e87721SMatt Gilbride                                  (default) artifact name  [required]
208*55e87721SMatt Gilbride  --name-pretty TEXT              The human-friendly name that appears in
209*55e87721SMatt Gilbride                                  README.md  [required]
210*55e87721SMatt Gilbride  --product-docs TEXT             Documentation URL that appears in README.md
211*55e87721SMatt Gilbride                                  [required]
212*55e87721SMatt Gilbride  --api-description TEXT          Description that appears in README.md
213*55e87721SMatt Gilbride                                  [required]
214*55e87721SMatt Gilbride  --release-level [stable|preview]
215*55e87721SMatt Gilbride                                  A label that appears in repo-metadata.json.
216*55e87721SMatt Gilbride                                  The first library generation is always
217*55e87721SMatt Gilbride                                  'preview'.  [default: preview]
218*55e87721SMatt Gilbride  --transport [grpc|http|both]    A label that appears in repo-metadata.json
219*55e87721SMatt Gilbride                                  [default: grpc]
220*55e87721SMatt Gilbride  --language TEXT                 [default: java]
221*55e87721SMatt Gilbride  --distribution-name TEXT        Maven coordinates of the generated library.
222*55e87721SMatt Gilbride                                  By default it's com.google.cloud:google-
223*55e87721SMatt Gilbride                                  cloud-<api_shortname>
224*55e87721SMatt Gilbride  --api-id TEXT                   The value of the apiid parameter used in
225*55e87721SMatt Gilbride                                  README.md It has link to https://console.clo
226*55e87721SMatt Gilbride                                  ud.google.com/flows/enableapi?apiid=<api_id>
227*55e87721SMatt Gilbride  --requires-billing BOOLEAN      Based on this value, README.md explains
228*55e87721SMatt Gilbride                                  whether billing setup is needed or not.
229*55e87721SMatt Gilbride                                  [default: True]
230*55e87721SMatt Gilbride  --destination-name TEXT         The directory name of the new library. By
231*55e87721SMatt Gilbride                                  default it's java-<api_shortname>
232*55e87721SMatt Gilbride  --proto-path TEXT               Path to proto file from the root of the
233*55e87721SMatt Gilbride                                  googleapis repository to thedirectory that
234*55e87721SMatt Gilbride                                  contains the proto files (without the
235*55e87721SMatt Gilbride                                  version).For example, to generate the
236*55e87721SMatt Gilbride                                  library for 'google/maps/routing/v2', then
237*55e87721SMatt Gilbride                                  you specify this value as
238*55e87721SMatt Gilbride                                  'google/maps/routing'  [required]
239*55e87721SMatt Gilbride  --cloud-api BOOLEAN             If true, the artifact ID of the library is
240*55e87721SMatt Gilbride                                  'google-cloud-'; otherwise 'google-'
241*55e87721SMatt Gilbride                                  [default: True]
242*55e87721SMatt Gilbride  --group-id TEXT                 The group ID of the artifact when
243*55e87721SMatt Gilbride                                  distribution name is not set  [default:
244*55e87721SMatt Gilbride                                  com.google.cloud]
245*55e87721SMatt Gilbride  --owlbot-image TEXT             The owlbot container image used in
246*55e87721SMatt Gilbride                                  OwlBot.yaml  [default: gcr.io/cloud-devrel-
247*55e87721SMatt Gilbride                                  public-resources/owlbot-java]
248*55e87721SMatt Gilbride  --library-type TEXT             A label that appear in repo-metadata.json to
249*55e87721SMatt Gilbride                                  tell how the library is maintained or
250*55e87721SMatt Gilbride                                  generated  [default: GAPIC_AUTO]
251*55e87721SMatt Gilbride  --googleapis-gen-url TEXT       The URL of the repository that has generated
252*55e87721SMatt Gilbride                                  Java code from proto service definition
253*55e87721SMatt Gilbride                                  [default:
254*55e87721SMatt Gilbride                                  https://github.com/googleapis/googleapis-
255*55e87721SMatt Gilbride                                  gen.git]
256*55e87721SMatt Gilbride  --help                          Show this message and exit.
257*55e87721SMatt Gilbride```
258*55e87721SMatt Gilbride
259*55e87721SMatt GilbrideSometimes, a library generation requires special handling for
260*55e87721SMatt GilbrideMaven coordinates or API ID, especially when the library is not
261*55e87721SMatt Gilbridespecific to Google Cloud. Refer to the following command example when we
262*55e87721SMatt Gilbridegenerated Google Maps Routes API Java client library.
263*55e87721SMatt Gilbride
264*55e87721SMatt Gilbride```
265*55e87721SMatt Gilbride~/google-cloud-java$ python3.9 generation/new_client/new-client.py generate \
266*55e87721SMatt Gilbride  --api_shortname=maps-routing \
267*55e87721SMatt Gilbride  --proto-path=google/maps/routing \
268*55e87721SMatt Gilbride  --name-pretty="Routes API" \
269*55e87721SMatt Gilbride  --product-docs="https://developers.google.com/maps/documentation/routes" \
270*55e87721SMatt Gilbride  --api-description="Routes API is the next generation, performance optimized version of the existing Directions API and Distance Matrix API. It helps you find the ideal route from A to Z, calculates ETAs and distances for matrices of origin and destination locations, and also offers new features." \
271*55e87721SMatt Gilbride  --api-id=routes.googleapis.com \
272*55e87721SMatt Gilbride  --cloud-api=false \
273*55e87721SMatt Gilbride  --requires-billing=true \
274*55e87721SMatt Gilbride  --distribution-name="com.google.maps:google-maps-routing"
275*55e87721SMatt Gilbride```
276*55e87721SMatt Gilbride
277*55e87721SMatt Gilbride# Principles
278*55e87721SMatt Gilbride
279*55e87721SMatt GilbrideThe script should finish creating a pull request even when the newly created
280*55e87721SMatt Gilbridemodule fails to compile. This gives the user flexibility to fix things in the
281*55e87721SMatt Gilbridecreated pull request.
282*55e87721SMatt Gilbride
283*55e87721SMatt Gilbride# Common Errors
284*55e87721SMatt Gilbride
285*55e87721SMatt Gilbride## Unable to clone googleapis-gen
286*55e87721SMatt Gilbride```
287*55e87721SMatt GilbrideCreating a new module /usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/java-vmwareengine
288*55e87721SMatt Gilbridegcr.io/cloud-devrel-public-resources/owlbot-java:latest
289*55e87721SMatt GilbrideCloning googleapis-gen...
290*55e87721SMatt GilbrideUsername for 'https://github.com': xxxxxx
291*55e87721SMatt GilbridePassword for 'https://[email protected]': ******
292*55e87721SMatt Gilbrideremote: Support for password authentication was removed on August 13, 2021.
293*55e87721SMatt Gilbrideremote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
294*55e87721SMatt Gilbridefatal: Authentication failed for 'https://github.com/googleapis/googleapis-gen.git/'
295*55e87721SMatt GilbrideTraceback (most recent call last):
296*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 291, in <module>
297*55e87721SMatt Gilbride    main()
298*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
299*55e87721SMatt Gilbride    return self.main(*args, **kwargs)
300*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1055, in main
301*55e87721SMatt Gilbride    rv = self.invoke(ctx)
302*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
303*55e87721SMatt Gilbride    return _process_result(sub_ctx.command.invoke(sub_ctx))
304*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
305*55e87721SMatt Gilbride    return ctx.invoke(self.callback, **ctx.params)
306*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 760, in invoke
307*55e87721SMatt Gilbride    return __callback(*args, **kwargs)
308*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 180, in generate
309*55e87721SMatt Gilbride    subprocess.check_call(["git", "clone", "-q", googleapis_gen_url, "./gen/googleapis-gen"], cwd=workdir)
310*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.pyenv/versions/3.9.13/lib/python3.9/subprocess.py", line 373, in check_call
311*55e87721SMatt Gilbride    raise CalledProcessError(retcode, cmd)
312*55e87721SMatt Gilbridesubprocess.CalledProcessError: Command '['git', 'clone', '-q', 'https://github.com/googleapis/googleapis-gen.git', './gen/googleapis-gen']' returned non-zero exit status 128.
313*55e87721SMatt Gilbride```
314*55e87721SMatt Gilbride### Solution
315*55e87721SMatt GilbrideRun `gh auth login` and choose to authenticate with HTTPS. You may already be authenticated with SSH.
316*55e87721SMatt Gilbride![img.png](img.png)
317*55e87721SMatt Gilbride
318*55e87721SMatt Gilbride## Owl-bot Staging Directory Not Found
319*55e87721SMatt Gilbride```
320*55e87721SMatt GilbrideRemoving googleapis-gen...
321*55e87721SMatt Gilbridemv: cannot stat 'owl-bot-staging': No such file or directory
322*55e87721SMatt GilbrideTraceback (most recent call last):
323*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 291, in <module>
324*55e87721SMatt Gilbride    main()
325*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
326*55e87721SMatt Gilbride    return self.main(*args, **kwargs)
327*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1055, in main
328*55e87721SMatt Gilbride    rv = self.invoke(ctx)
329*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
330*55e87721SMatt Gilbride    return _process_result(sub_ctx.command.invoke(sub_ctx))
331*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
332*55e87721SMatt Gilbride    return ctx.invoke(self.callback, **ctx.params)
333*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 760, in invoke
334*55e87721SMatt Gilbride    return __callback(*args, **kwargs)
335*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 212, in generate
336*55e87721SMatt Gilbride    subprocess.check_call(
337*55e87721SMatt Gilbride  File "/usr/local/google/home/lawrenceqiu/.pyenv/versions/3.9.13/lib/python3.9/subprocess.py", line 373, in check_call
338*55e87721SMatt Gilbride    raise CalledProcessError(retcode, cmd)
339*55e87721SMatt Gilbridesubprocess.CalledProcessError: Command '['mv', 'owl-bot-staging', '../']' returned non-zero exit status 1.
340*55e87721SMatt Gilbride```
341*55e87721SMatt Gilbride
342*55e87721SMatt Gilbride### Solution
343*55e87721SMatt GilbrideThe proto path is incorrect. See the `Proto Path` section to find the correct path.
344*55e87721SMatt Gilbride
345*55e87721SMatt Gilbride## Python3.9 is not Installed
346*55e87721SMatt Gilbride```
347*55e87721SMatt Gilbridepyenv: version `3.9.13' is not installed (set by /workspace/.python-version)
348*55e87721SMatt GilbrideTraceback (most recent call last):
349*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 291, in <module>
350*55e87721SMatt Gilbridemain()
351*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1130, in __call__
352*55e87721SMatt Gilbridereturn self.main(*args, **kwargs)
353*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1055, in main
354*55e87721SMatt Gilbriderv = self.invoke(ctx)
355*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1657, in invoke
356*55e87721SMatt Gilbridereturn _process_result(sub_ctx.command.invoke(sub_ctx))
357*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
358*55e87721SMatt Gilbridereturn ctx.invoke(self.callback, **ctx.params)
359*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.local/lib/python3.9/site-packages/click/core.py", line 760, in invoke
360*55e87721SMatt Gilbridereturn __callback(*args, **kwargs)
361*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java/generation/new_client/new-client.py", line 223, in generate
362*55e87721SMatt Gilbridesubprocess.check_call(
363*55e87721SMatt GilbrideFile "/usr/local/google/home/lawrenceqiu/.pyenv/versions/3.9.13/lib/python3.9/subprocess.py", line 373, in check_call
364*55e87721SMatt Gilbrideraise CalledProcessError(retcode, cmd)
365*55e87721SMatt Gilbridesubprocess.CalledProcessError: Command '['docker', 'run', '--rm', '-v', '/usr/local/google/home/lawrenceqiu/IdeaProjects/google-cloud-java:/workspace', '--user', '1023638:89939', 'gcr.io/cloud-devrel-public-resources/owlbot-java']' returned non-zero exit status 1.
366*55e87721SMatt Gilbride```
367*55e87721SMatt Gilbride
368*55e87721SMatt Gilbride### Solution
369*55e87721SMatt GilbrideYou have run the `pyenv local 3.9.13` in the `google-cloud-java` repo.
370*55e87721SMatt Gilbride1. Remove the `.python-version` file in `google-cloud-java`.
371*55e87721SMatt Gilbride2. `cd ..` out to the parent directory and run `pyenv local 3.9.13` there
372*55e87721SMatt Gilbride3. `cd google-cloud-java` back into the repo and run the generation script again
373