xref: /aosp_15_r20/external/google-cloud-java/java-compute/README.md (revision 55e87721aa1bc457b326496a7ca40f3ea1a63287)
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