1*55e87721SMatt Gilbride# Google Compute Engine Client for Java 2*55e87721SMatt Gilbride 3*55e87721SMatt GilbrideJava idiomatic client for [Compute Engine][product-docs]. 4*55e87721SMatt Gilbride 5*55e87721SMatt Gilbride[![Maven][maven-version-image]][maven-version-link] 6*55e87721SMatt Gilbride![Stability][stability-image] 7*55e87721SMatt Gilbride 8*55e87721SMatt Gilbride- [Product Documentation][product-docs] 9*55e87721SMatt Gilbride- [Client Library Documentation][javadocs] 10*55e87721SMatt Gilbride 11*55e87721SMatt Gilbride 12*55e87721SMatt Gilbride## Quickstart 13*55e87721SMatt Gilbride 14*55e87721SMatt Gilbride 15*55e87721SMatt GilbrideIf you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: 16*55e87721SMatt Gilbride 17*55e87721SMatt Gilbride```xml 18*55e87721SMatt Gilbride<dependencyManagement> 19*55e87721SMatt Gilbride <dependencies> 20*55e87721SMatt Gilbride <dependency> 21*55e87721SMatt Gilbride <groupId>com.google.cloud</groupId> 22*55e87721SMatt Gilbride <artifactId>libraries-bom</artifactId> 23*55e87721SMatt Gilbride <version>26.12.0</version> 24*55e87721SMatt Gilbride <type>pom</type> 25*55e87721SMatt Gilbride <scope>import</scope> 26*55e87721SMatt Gilbride </dependency> 27*55e87721SMatt Gilbride </dependencies> 28*55e87721SMatt Gilbride</dependencyManagement> 29*55e87721SMatt Gilbride 30*55e87721SMatt Gilbride<dependencies> 31*55e87721SMatt Gilbride <dependency> 32*55e87721SMatt Gilbride <groupId>com.google.cloud</groupId> 33*55e87721SMatt Gilbride <artifactId>google-cloud-compute</artifactId> 34*55e87721SMatt Gilbride </dependency> 35*55e87721SMatt Gilbride``` 36*55e87721SMatt Gilbride 37*55e87721SMatt GilbrideIf you are using Maven without the BOM, add this to your dependencies: 38*55e87721SMatt Gilbride 39*55e87721SMatt Gilbride<!-- {x-version-update-start:google-cloud-compute:released} --> 40*55e87721SMatt Gilbride 41*55e87721SMatt Gilbride```xml 42*55e87721SMatt Gilbride<dependency> 43*55e87721SMatt Gilbride <groupId>com.google.cloud</groupId> 44*55e87721SMatt Gilbride <artifactId>google-cloud-compute</artifactId> 45*55e87721SMatt Gilbride <version>1.27.0</version> 46*55e87721SMatt Gilbride</dependency> 47*55e87721SMatt Gilbride``` 48*55e87721SMatt Gilbride 49*55e87721SMatt GilbrideIf you are using Gradle without BOM, add this to your dependencies: 50*55e87721SMatt Gilbride 51*55e87721SMatt Gilbride```Groovy 52*55e87721SMatt Gilbrideimplementation 'com.google.cloud:google-cloud-compute:1.27.0' 53*55e87721SMatt Gilbride``` 54*55e87721SMatt Gilbride 55*55e87721SMatt GilbrideIf you are using SBT, add this to your dependencies: 56*55e87721SMatt Gilbride 57*55e87721SMatt Gilbride```Scala 58*55e87721SMatt GilbridelibraryDependencies += "com.google.cloud" % "google-cloud-compute" % "1.27.0" 59*55e87721SMatt Gilbride``` 60*55e87721SMatt Gilbride<!-- {x-version-update-end} --> 61*55e87721SMatt Gilbride 62*55e87721SMatt Gilbride## Authentication 63*55e87721SMatt Gilbride 64*55e87721SMatt GilbrideSee the [Authentication][authentication] section in the base directory's README. 65*55e87721SMatt Gilbride 66*55e87721SMatt Gilbride## Authorization 67*55e87721SMatt Gilbride 68*55e87721SMatt GilbrideThe client application making API calls must be granted [authorization scopes][auth-scopes] required for the desired Compute Engine APIs, and the authenticated principal must have the [IAM role(s)][predefined-iam-roles] required to access GCP resources using the Compute Engine API calls. 69*55e87721SMatt Gilbride 70*55e87721SMatt Gilbride## Getting Started 71*55e87721SMatt Gilbride 72*55e87721SMatt Gilbride### Prerequisites 73*55e87721SMatt Gilbride 74*55e87721SMatt GilbrideYou will need a [Google Cloud Platform Console][developer-console] project with the Compute Engine [API enabled][enable-api]. 75*55e87721SMatt GilbrideYou will need to [enable billing][enable-billing] to use Google Compute Engine. 76*55e87721SMatt Gilbride[Follow these instructions][create-project] to get your project set up. You will also need to set up the local development environment by 77*55e87721SMatt Gilbride[installing the Google Cloud Command Line Interface][cloud-cli] and running the following commands in command line: 78*55e87721SMatt Gilbride`gcloud auth login` and `gcloud config set project [YOUR PROJECT ID]`. 79*55e87721SMatt Gilbride 80*55e87721SMatt Gilbride### Installation and setup 81*55e87721SMatt Gilbride 82*55e87721SMatt GilbrideYou'll need to obtain the `google-cloud-compute` library. See the [Quickstart](#quickstart) section 83*55e87721SMatt Gilbrideto add `google-cloud-compute` as a dependency in your code. 84*55e87721SMatt Gilbride 85*55e87721SMatt Gilbride## About Compute Engine 86*55e87721SMatt Gilbride 87*55e87721SMatt Gilbride 88*55e87721SMatt Gilbride[Compute Engine][product-docs] delivers virtual machines running in Google's innovative data centers and worldwide fiber network. Compute Engine's tooling and workflow support enable scaling from single instances to global, load-balanced cloud computing. Compute Engine's VMs boot quickly, come with persistent disk storage, deliver consistent performance and are available in many configurations. 89*55e87721SMatt Gilbride 90*55e87721SMatt Gilbride 91*55e87721SMatt Gilbride 92*55e87721SMatt GilbrideSee the [Compute Engine client library docs][javadocs] to learn how to 93*55e87721SMatt Gilbrideuse this Compute Engine Client Library. 94*55e87721SMatt Gilbride 95*55e87721SMatt Gilbride 96*55e87721SMatt Gilbride### Compute alpha to beta migration 97*55e87721SMatt Gilbride 98*55e87721SMatt GilbrideJava compute library is GA from version 1.7.0 and backwards incompatible with 0.x.x. Also it is incompatible with 1.5.x-alpha and prior in a following way: 99*55e87721SMatt Gilbride- Everything except polling methods which used to return `Operation` now returns `OperationFuture`. 100*55e87721SMatt Gilbride- Library automatically polls Operation status. 101*55e87721SMatt Gilbride- `Operation op = client.myMethod(args)` should be replaced with `OperationFuture<Operation, Operation> opFuture = client.myMethodAsync(args);` 102*55e87721SMatt Gilbride- Polling is now done automatically, manual polling is no longer required. Calling `opFuture.get()` will wait for automatic polling to complete. It will return the result of the long running operation once the operation is completed on the server side or throw an exception if an error occurs during polling. 103*55e87721SMatt Gilbride- To check for intermediate status on the future use either `opFuture.peekMetadata()` (non-blocking) or `opFuture.getMetadata()` (blocking) 104*55e87721SMatt Gilbride- If you wish to stop automatic polling call `opFuture.cancel()` - it will cancel the future on the client side but it will not affect the execution of the operation on the server side in any way (server will keep working on the operation). 105*55e87721SMatt Gilbride- The calls still may be done without relying on automatic polling and/or OperationFuture. To do so, use `client.myMethodCallable(MyMethodRequest).call()` semantics instead. Note this semantics does not have flattened method declarations and the request message must be instantiated explicitly by the users code. 106*55e87721SMatt Gilbride 107*55e87721SMatt Gilbride### Example 108*55e87721SMatt GilbrideThe following example creates a GCE address, then lists all the available addresses in the region and in the whole project and eventually deletes the newly created address. 109*55e87721SMatt Gilbride 110*55e87721SMatt Gilbride```java 111*55e87721SMatt Gilbrideimport com.google.cloud.compute.v1.Address; 112*55e87721SMatt Gilbrideimport com.google.cloud.compute.v1.AddressesClient; 113*55e87721SMatt Gilbrideimport com.google.cloud.compute.v1.AddressesScopedList; 114*55e87721SMatt Gilbrideimport com.google.cloud.compute.v1.Operation; 115*55e87721SMatt Gilbrideimport com.google.protobuf.util.JsonFormat; 116*55e87721SMatt Gilbrideimport java.io.IOException; 117*55e87721SMatt Gilbrideimport java.util.Map; 118*55e87721SMatt Gilbride 119*55e87721SMatt Gilbridepublic class ComputeExample { 120*55e87721SMatt Gilbride 121*55e87721SMatt Gilbride public static void main(String[] args) throws IOException, InterruptedException { 122*55e87721SMatt Gilbride final String project = "PROJECT_NAME"; 123*55e87721SMatt Gilbride final String region = "REGION"; 124*55e87721SMatt Gilbride final String address = "test-address-21"; 125*55e87721SMatt Gilbride 126*55e87721SMatt Gilbride AddressesClient addressesClient = AddressesClient.create(); 127*55e87721SMatt Gilbride 128*55e87721SMatt Gilbride // AddressClient#insert() 129*55e87721SMatt Gilbride System.out.println("\n===============\nAddressClient#insert()\n==============="); 130*55e87721SMatt Gilbride OperationFuture<Operation,Operation> insertResponse = 131*55e87721SMatt Gilbride addressesClient.insertAsync(project, region, Address.newBuilder().setName(address).build()); 132*55e87721SMatt Gilbride Operation insertResponseOperation = insertResponse.get(); 133*55e87721SMatt Gilbride System.out.println(JsonFormat.printer().print(insertResponse) + "\n"); 134*55e87721SMatt Gilbride 135*55e87721SMatt Gilbride // AddressClient#list() 136*55e87721SMatt Gilbride System.out.println("\n===============\nAddressClient#list()\n==============="); 137*55e87721SMatt Gilbride for (Address addr : addressesClient.list(project, region).iterateAll()) { 138*55e87721SMatt Gilbride System.out.println(JsonFormat.printer().print(addr)); 139*55e87721SMatt Gilbride } 140*55e87721SMatt Gilbride 141*55e87721SMatt Gilbride // AddressClient#aggregatedList() 142*55e87721SMatt Gilbride System.out.println("\n===============\nAddressClient#aggregatedList()\n==============="); 143*55e87721SMatt Gilbride for (Map.Entry<String, AddressesScopedList> addr : 144*55e87721SMatt Gilbride addressesClient.aggregatedList(project).iterateAll()) { 145*55e87721SMatt Gilbride System.out.println("KEY: " + addr.getKey()); 146*55e87721SMatt Gilbride System.out.println(JsonFormat.printer().print(addr.getValue())); 147*55e87721SMatt Gilbride } 148*55e87721SMatt Gilbride 149*55e87721SMatt Gilbride // AddressClient#delete() 150*55e87721SMatt Gilbride System.out.println("\n===============\nAddressClient#delete()\n==============="); 151*55e87721SMatt Gilbride OperationFuture<Operation,Operation> deleteResponse = addressesClient.deleteAsync(project, region, address); 152*55e87721SMatt Gilbride Operation deleteResponseOperation = deleteResponse.get(); 153*55e87721SMatt Gilbride System.out.println(JsonFormat.printer().print(deleteResponse) + "\n"); 154*55e87721SMatt Gilbride } 155*55e87721SMatt Gilbride} 156*55e87721SMatt Gilbride 157*55e87721SMatt Gilbride``` 158*55e87721SMatt Gilbride 159*55e87721SMatt Gilbride 160*55e87721SMatt Gilbride 161*55e87721SMatt Gilbride 162*55e87721SMatt Gilbride 163*55e87721SMatt Gilbride## Troubleshooting 164*55e87721SMatt Gilbride 165*55e87721SMatt GilbrideTo get help, follow the instructions in the [shared Troubleshooting document][troubleshooting]. 166*55e87721SMatt Gilbride 167*55e87721SMatt Gilbride## Transport 168*55e87721SMatt Gilbride 169*55e87721SMatt GilbrideCompute Engine uses HTTP/JSON for the transport layer. 170*55e87721SMatt Gilbride 171*55e87721SMatt Gilbride## Supported Java Versions 172*55e87721SMatt Gilbride 173*55e87721SMatt GilbrideJava 8 or above is required for using this client. 174*55e87721SMatt Gilbride 175*55e87721SMatt GilbrideGoogle's Java client libraries, 176*55e87721SMatt Gilbride[Google Cloud Client Libraries][cloudlibs] 177*55e87721SMatt Gilbrideand 178*55e87721SMatt Gilbride[Google Cloud API Libraries][apilibs], 179*55e87721SMatt Gilbridefollow the 180*55e87721SMatt Gilbride[Oracle Java SE support roadmap][oracle] 181*55e87721SMatt Gilbride(see the Oracle Java SE Product Releases section). 182*55e87721SMatt Gilbride 183*55e87721SMatt Gilbride### For new development 184*55e87721SMatt Gilbride 185*55e87721SMatt GilbrideIn general, new feature development occurs with support for the lowest Java 186*55e87721SMatt GilbrideLTS version covered by Oracle's Premier Support (which typically lasts 5 years 187*55e87721SMatt Gilbridefrom initial General Availability). If the minimum required JVM for a given 188*55e87721SMatt Gilbridelibrary is changed, it is accompanied by a [semver][semver] major release. 189*55e87721SMatt Gilbride 190*55e87721SMatt GilbrideJava 11 and (in September 2021) Java 17 are the best choices for new 191*55e87721SMatt Gilbridedevelopment. 192*55e87721SMatt Gilbride 193*55e87721SMatt Gilbride### Keeping production systems current 194*55e87721SMatt Gilbride 195*55e87721SMatt GilbrideGoogle tests its client libraries with all current LTS versions covered by 196*55e87721SMatt GilbrideOracle's Extended Support (which typically lasts 8 years from initial 197*55e87721SMatt GilbrideGeneral Availability). 198*55e87721SMatt Gilbride 199*55e87721SMatt Gilbride#### Legacy support 200*55e87721SMatt Gilbride 201*55e87721SMatt GilbrideGoogle's client libraries support legacy versions of Java runtimes with long 202*55e87721SMatt Gilbrideterm stable libraries that don't receive feature updates on a best efforts basis 203*55e87721SMatt Gilbrideas it may not be possible to backport all patches. 204*55e87721SMatt Gilbride 205*55e87721SMatt GilbrideGoogle provides updates on a best efforts basis to apps that continue to use 206*55e87721SMatt GilbrideJava 7, though apps might need to upgrade to current versions of the library 207*55e87721SMatt Gilbridethat supports their JVM. 208*55e87721SMatt Gilbride 209*55e87721SMatt Gilbride#### Where to find specific information 210*55e87721SMatt Gilbride 211*55e87721SMatt GilbrideThe latest versions and the supported Java versions are identified on 212*55e87721SMatt Gilbridethe individual GitHub repository `github.com/GoogleAPIs/java-SERVICENAME` 213*55e87721SMatt Gilbrideand on [google-cloud-java][g-c-j]. 214*55e87721SMatt Gilbride 215*55e87721SMatt Gilbride## Versioning 216*55e87721SMatt Gilbride 217*55e87721SMatt Gilbride 218*55e87721SMatt GilbrideThis library follows [Semantic Versioning](http://semver.org/). 219*55e87721SMatt Gilbride 220*55e87721SMatt Gilbride 221*55e87721SMatt Gilbride 222*55e87721SMatt Gilbride## Contributing 223*55e87721SMatt Gilbride 224*55e87721SMatt Gilbride 225*55e87721SMatt GilbrideContributions to this library are always welcome and highly encouraged. 226*55e87721SMatt Gilbride 227*55e87721SMatt GilbrideSee [CONTRIBUTING][contributing] for more information how to get started. 228*55e87721SMatt Gilbride 229*55e87721SMatt GilbridePlease note that this project is released with a Contributor Code of Conduct. By participating in 230*55e87721SMatt Gilbridethis project you agree to abide by its terms. See [Code of Conduct][code-of-conduct] for more 231*55e87721SMatt Gilbrideinformation. 232*55e87721SMatt Gilbride 233*55e87721SMatt Gilbride 234*55e87721SMatt Gilbride## License 235*55e87721SMatt Gilbride 236*55e87721SMatt GilbrideApache 2.0 - See [LICENSE][license] for more information. 237*55e87721SMatt Gilbride 238*55e87721SMatt Gilbride## CI Status 239*55e87721SMatt Gilbride 240*55e87721SMatt GilbrideJava Version | Status 241*55e87721SMatt Gilbride------------ | ------ 242*55e87721SMatt GilbrideJava 8 | [![Kokoro CI][kokoro-badge-image-2]][kokoro-badge-link-2] 243*55e87721SMatt GilbrideJava 8 OSX | [![Kokoro CI][kokoro-badge-image-3]][kokoro-badge-link-3] 244*55e87721SMatt GilbrideJava 8 Windows | [![Kokoro CI][kokoro-badge-image-4]][kokoro-badge-link-4] 245*55e87721SMatt GilbrideJava 11 | [![Kokoro CI][kokoro-badge-image-5]][kokoro-badge-link-5] 246*55e87721SMatt Gilbride 247*55e87721SMatt GilbrideJava is a registered trademark of Oracle and/or its affiliates. 248*55e87721SMatt Gilbride 249*55e87721SMatt Gilbride[product-docs]: https://cloud.google.com/compute/ 250*55e87721SMatt Gilbride[javadocs]: https://cloud.google.com/java/docs/reference/google-cloud-compute/latest/overview 251*55e87721SMatt Gilbride[kokoro-badge-image-1]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java7.svg 252*55e87721SMatt Gilbride[kokoro-badge-link-1]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java7.html 253*55e87721SMatt Gilbride[kokoro-badge-image-2]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8.svg 254*55e87721SMatt Gilbride[kokoro-badge-link-2]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8.html 255*55e87721SMatt Gilbride[kokoro-badge-image-3]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-osx.svg 256*55e87721SMatt Gilbride[kokoro-badge-link-3]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-osx.html 257*55e87721SMatt Gilbride[kokoro-badge-image-4]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-win.svg 258*55e87721SMatt Gilbride[kokoro-badge-link-4]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-win.html 259*55e87721SMatt Gilbride[kokoro-badge-image-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java11.svg 260*55e87721SMatt Gilbride[kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java11.html 261*55e87721SMatt Gilbride[stability-image]: https://img.shields.io/badge/stability-stable-green 262*55e87721SMatt Gilbride[maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-compute.svg 263*55e87721SMatt Gilbride[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-compute/1.24.0 264*55e87721SMatt Gilbride[authentication]: https://github.com/googleapis/google-cloud-java#authentication 265*55e87721SMatt Gilbride[auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes 266*55e87721SMatt Gilbride[predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles 267*55e87721SMatt Gilbride[iam-policy]: https://cloud.google.com/iam/docs/overview#cloud-iam-policy 268*55e87721SMatt Gilbride[developer-console]: https://console.developers.google.com/ 269*55e87721SMatt Gilbride[create-project]: https://cloud.google.com/resource-manager/docs/creating-managing-projects 270*55e87721SMatt Gilbride[cloud-cli]: https://cloud.google.com/cli 271*55e87721SMatt Gilbride[troubleshooting]: https://github.com/googleapis/google-cloud-java/blob/main/TROUBLESHOOTING.md 272*55e87721SMatt Gilbride[contributing]: https://github.com/googleapis/google-cloud-java/blob/main/CONTRIBUTING.md 273*55e87721SMatt Gilbride[code-of-conduct]: https://github.com/googleapis/google-cloud-java/blob/main/CODE_OF_CONDUCT.md#contributor-code-of-conduct 274*55e87721SMatt Gilbride[license]: https://github.com/googleapis/google-cloud-java/blob/main/LICENSE 275*55e87721SMatt Gilbride[enable-billing]: https://cloud.google.com/apis/docs/getting-started#enabling_billing 276*55e87721SMatt Gilbride[enable-api]: https://console.cloud.google.com/flows/enableapi?apiid=compute.googleapis.com 277*55e87721SMatt Gilbride[libraries-bom]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM 278*55e87721SMatt Gilbride[shell_img]: https://gstatic.com/cloudssh/images/open-btn.png 279*55e87721SMatt Gilbride 280*55e87721SMatt Gilbride[semver]: https://semver.org/ 281*55e87721SMatt Gilbride[cloudlibs]: https://cloud.google.com/apis/docs/client-libraries-explained 282*55e87721SMatt Gilbride[apilibs]: https://cloud.google.com/apis/docs/client-libraries-explained#google_api_client_libraries 283*55e87721SMatt Gilbride[oracle]: https://www.oracle.com/java/technologies/java-se-support-roadmap.html 284*55e87721SMatt Gilbride[g-c-j]: http://github.com/googleapis/google-cloud-java 285