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 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