| # Google Resource Manager API Client for Java |
| |
| Java idiomatic client for [Resource Manager API][product-docs]. |
| |
| [![Maven][maven-version-image]][maven-version-link] |
| ![Stability][stability-image] |
| |
| - [Product Documentation][product-docs] |
| - [Client Library Documentation][javadocs] |
| |
| |
| ## Quickstart |
| |
| |
| If you are using Maven with [BOM][libraries-bom], add this to your pom.xml file: |
| |
| ```xml |
| <dependencyManagement> |
| <dependencies> |
| <dependency> |
| <groupId>com.google.cloud</groupId> |
| <artifactId>libraries-bom</artifactId> |
| <version>26.14.0</version> |
| <type>pom</type> |
| <scope>import</scope> |
| </dependency> |
| </dependencies> |
| </dependencyManagement> |
| |
| <dependencies> |
| <dependency> |
| <groupId>com.google.cloud</groupId> |
| <artifactId>google-cloud-resourcemanager</artifactId> |
| </dependency> |
| ``` |
| |
| If you are using Maven without the BOM, add this to your dependencies: |
| |
| <!-- {x-version-update-start:google-cloud-resourcemanager:released} --> |
| |
| ```xml |
| <dependency> |
| <groupId>com.google.cloud</groupId> |
| <artifactId>google-cloud-resourcemanager</artifactId> |
| <version>1.19.0</version> |
| </dependency> |
| ``` |
| |
| If you are using Gradle without BOM, add this to your dependencies: |
| |
| ```Groovy |
| implementation 'com.google.cloud:google-cloud-resourcemanager:1.19.0' |
| ``` |
| |
| If you are using SBT, add this to your dependencies: |
| |
| ```Scala |
| libraryDependencies += "com.google.cloud" % "google-cloud-resourcemanager" % "1.19.0" |
| ``` |
| <!-- {x-version-update-end} --> |
| |
| ## Authentication |
| |
| See the [Authentication][authentication] section in the base directory's README. |
| |
| ## Authorization |
| |
| The client application making API calls must be granted [authorization scopes][auth-scopes] required for the desired Resource Manager API APIs, and the authenticated principal must have the [IAM role(s)][predefined-iam-roles] required to access GCP resources using the Resource Manager API API calls. |
| |
| ## Getting Started |
| |
| ### Prerequisites |
| |
| You will need a [Google Cloud Platform Console][developer-console] project with the Resource Manager API [API enabled][enable-api]. |
| |
| [Follow these instructions][create-project] to get your project set up. You will also need to set up the local development environment by |
| [installing the Google Cloud Command Line Interface][cloud-cli] and running the following commands in command line: |
| `gcloud auth login` and `gcloud config set project [YOUR PROJECT ID]`. |
| |
| ### Installation and setup |
| |
| You'll need to obtain the `google-cloud-resourcemanager` library. See the [Quickstart](#quickstart) section |
| to add `google-cloud-resourcemanager` as a dependency in your code. |
| |
| ## About Resource Manager API |
| |
| |
| [Resource Manager API][product-docs] enables you to programmatically manage resources by project, folder, and organization. |
| |
| See the [Resource Manager API client library docs][javadocs] to learn how to |
| use this Resource Manager API Client Library. |
| |
| |
| #### Creating an authorized service object |
| To make authenticated requests to Google Cloud Resource Manager, you must create a service object |
| with Google Cloud SDK credentials. You can then make API calls by calling methods on the Resource |
| Manager service object. The simplest way to authenticate is to use |
| [Application Default Credentials](https://developers.google.com/identity/protocols/application-default-credentials). |
| These credentials are automatically inferred from your environment, so you only need the following |
| code to create your service object: |
| |
| ```java |
| import com.google.cloud.resourcemanager.ResourceManager; |
| import com.google.cloud.resourcemanager.ResourceManagerOptions; |
| |
| ResourceManager resourceManager = ResourceManagerOptions.getDefaultInstance().getService(); |
| ``` |
| |
| #### Getting a specific project |
| You can load a project if you know its project ID and have read permissions to the project. |
| To get a project, add the following import at the top of your file: |
| |
| ```java |
| import com.google.cloud.resourcemanager.Project; |
| ``` |
| |
| Then use the following code to get the project: |
| |
| ```java |
| String projectId = "my-globally-unique-project-id"; // Change to a unique project ID |
| Project project = resourceManager.get(projectId); |
| ``` |
| |
| #### Creating a project |
| All you need to create a project is a globally unique project ID. You can also optionally attach a |
| non-unique name and labels to your project. Read more about naming guidelines for project IDs, |
| names, and labels [here](https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects). |
| To create a project, add the following imports at the top of your file: |
| |
| ```java |
| import com.google.cloud.resourcemanager.Project; |
| import com.google.cloud.resourcemanager.ProjectInfo; |
| ``` |
| |
| Then add the following code to create a project (be sure to change `projectId` to your own unique |
| project ID). |
| |
| ```java |
| String projectId = "my-globally-unique-project-id"; // Change to a unique project ID |
| Project project = resourceManager.create(ProjectInfo.newBuilder(projectId).build()); |
| ``` |
| |
| Note that the return value from `create` is a `Project` that includes additional read-only |
| information, like creation time, project number, and lifecycle state. Read more about these fields |
| on the [Projects page](https://cloud.google.com/resource-manager/reference/rest/v1beta1/projects). |
| `Project`, a subclass of `ProjectInfo`, adds a layer of service-related functionality over |
| `ProjectInfo`. |
| |
| #### Editing a project |
| To edit a project, create a new `ProjectInfo` object and pass it in to the `Project.replace` method. |
| For example, to add a label to a project to denote that it's launch status is "in development", add |
| the following code: |
| |
| ```java |
| Project newProject = project.toBuilder() |
| .addLabel("launch-status", "in-development") |
| .build() |
| .replace(); |
| ``` |
| |
| Note that the values of the project you pass in to `replace` overwrite the server's values for |
| non-read-only fields, namely `projectName` and `labels`. For example, if you create a project with |
| `projectName` "some-project-name" and subsequently call replace using a `ProjectInfo` object that |
| didn't set the `projectName`, then the server will unset the project's name. The server ignores any |
| attempted changes to the read-only fields `projectNumber`, `lifecycleState`, and `createTime`. |
| The `projectId` cannot change. |
| |
| #### Listing all projects |
| Suppose that we want a list of all projects for which we have read permissions. Add the following |
| import: |
| |
| ```java |
| import java.util.Iterator; |
| ``` |
| |
| Then add the following code to print a list of projects you can view: |
| |
| ```java |
| Iterator<Project> projectIterator = resourceManager.list().iterateAll().iterator(); |
| System.out.println("Projects I can view:"); |
| while (projectIterator.hasNext()) { |
| System.out.println(projectIterator.next().getProjectId()); |
| } |
| ``` |
| |
| #### Managing IAM Policies |
| You can edit [Google Cloud IAM](https://cloud.google.com/iam/) (Identity and Access Management) |
| policies on the project-level using this library as well. We recommend using the read-modify-write |
| pattern to make policy changes. This entails reading the project's current policy, updating it |
| locally, and then sending the modified policy for writing, as shown in the snippet below. First, |
| add these imports: |
| |
| ```java |
| import com.google.cloud.Identity; |
| import com.google.cloud.Policy; |
| import com.google.cloud.Role; |
| ``` |
| |
| Assuming you have completed the steps above to create the `ResourceManager` service object and load |
| a project from the server, you just need to add the following code: |
| |
| ```java |
| // Get the project's policy |
| Policy policy = project.getPolicy(); |
| |
| // Add a viewer |
| Policy.Builder modifiedPolicy = policy.toBuilder(); |
| Identity newViewer = Identity.user("<insert user's email address here>"); |
| modifiedPolicy.addIdentity(Role.viewer(), newViewer); |
| |
| // Write policy |
| Policy updatedPolicy = project.replacePolicy(modifiedPolicy.build()); |
| ``` |
| |
| Note that the policy you pass in to `replacePolicy` overwrites the original policy. For example, if |
| the original policy has two bindings and you call `replacePolicy` with a new policy containing only |
| one binding, the two original bindings are lost. |
| |
| #### Complete source code |
| |
| We put together all the code shown above into three programs. The programs assume that you are |
| running from your own desktop and used the Google Cloud SDK to authenticate yourself. |
| |
| The first program creates a project if it does not exist. Complete source code can be found at |
| [GetOrCreateProject.java](https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-examples/src/main/java/com/google/cloud/examples/resourcemanager/snippets/GetOrCreateProject.java). |
| |
| The second program updates a project if it exists and lists all projects the user has permission to |
| view. Complete source code can be found at |
| [UpdateAndListProjects.java](https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-examples/src/main/java/com/google/cloud/examples/resourcemanager/snippets/UpdateAndListProjects.java). |
| |
| The third program modifies the IAM policy associated with a project using the read-modify-write |
| pattern. Complete source code can be found at |
| [ModifyPolicy.java](https://github.com/googleapis/google-cloud-java/blob/master/google-cloud-examples/src/main/java/com/google/cloud/examples/resourcemanager/snippets/ModifyPolicy.java) |
| |
| |
| |
| |
| |
| ## Troubleshooting |
| |
| To get help, follow the instructions in the [shared Troubleshooting document][troubleshooting]. |
| |
| ## Transport |
| |
| Resource Manager API uses HTTP/JSON for the transport layer. |
| |
| ## Supported Java Versions |
| |
| Java 8 or above is required for using this client. |
| |
| Google's Java client libraries, |
| [Google Cloud Client Libraries][cloudlibs] |
| and |
| [Google Cloud API Libraries][apilibs], |
| follow the |
| [Oracle Java SE support roadmap][oracle] |
| (see the Oracle Java SE Product Releases section). |
| |
| ### For new development |
| |
| In general, new feature development occurs with support for the lowest Java |
| LTS version covered by Oracle's Premier Support (which typically lasts 5 years |
| from initial General Availability). If the minimum required JVM for a given |
| library is changed, it is accompanied by a [semver][semver] major release. |
| |
| Java 11 and (in September 2021) Java 17 are the best choices for new |
| development. |
| |
| ### Keeping production systems current |
| |
| Google tests its client libraries with all current LTS versions covered by |
| Oracle's Extended Support (which typically lasts 8 years from initial |
| General Availability). |
| |
| #### Legacy support |
| |
| Google's client libraries support legacy versions of Java runtimes with long |
| term stable libraries that don't receive feature updates on a best efforts basis |
| as it may not be possible to backport all patches. |
| |
| Google provides updates on a best efforts basis to apps that continue to use |
| Java 7, though apps might need to upgrade to current versions of the library |
| that supports their JVM. |
| |
| #### Where to find specific information |
| |
| The latest versions and the supported Java versions are identified on |
| the individual GitHub repository `github.com/GoogleAPIs/java-SERVICENAME` |
| and on [google-cloud-java][g-c-j]. |
| |
| ## Versioning |
| |
| |
| This library follows [Semantic Versioning](http://semver.org/). |
| |
| |
| |
| ## Contributing |
| |
| |
| Contributions to this library are always welcome and highly encouraged. |
| |
| See [CONTRIBUTING][contributing] for more information how to get started. |
| |
| Please note that this project is released with a Contributor Code of Conduct. By participating in |
| this project you agree to abide by its terms. See [Code of Conduct][code-of-conduct] for more |
| information. |
| |
| |
| ## License |
| |
| Apache 2.0 - See [LICENSE][license] for more information. |
| |
| ## CI Status |
| |
| Java Version | Status |
| ------------ | ------ |
| Java 8 | [![Kokoro CI][kokoro-badge-image-2]][kokoro-badge-link-2] |
| Java 8 OSX | [![Kokoro CI][kokoro-badge-image-3]][kokoro-badge-link-3] |
| Java 8 Windows | [![Kokoro CI][kokoro-badge-image-4]][kokoro-badge-link-4] |
| Java 11 | [![Kokoro CI][kokoro-badge-image-5]][kokoro-badge-link-5] |
| |
| Java is a registered trademark of Oracle and/or its affiliates. |
| |
| [product-docs]: https://cloud.google.com/resource-manager |
| [javadocs]: https://cloud.google.com/java/docs/reference/google-cloud-resourcemanager/latest/overview |
| [kokoro-badge-image-1]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java7.svg |
| [kokoro-badge-link-1]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java7.html |
| [kokoro-badge-image-2]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8.svg |
| [kokoro-badge-link-2]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8.html |
| [kokoro-badge-image-3]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-osx.svg |
| [kokoro-badge-link-3]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-osx.html |
| [kokoro-badge-image-4]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-win.svg |
| [kokoro-badge-link-4]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java8-win.html |
| [kokoro-badge-image-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java11.svg |
| [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/google-cloud-java/java11.html |
| [stability-image]: https://img.shields.io/badge/stability-stable-green |
| [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-resourcemanager.svg |
| [maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-resourcemanager/1.18.0 |
| [authentication]: https://github.com/googleapis/google-cloud-java#authentication |
| [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes |
| [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles |
| [iam-policy]: https://cloud.google.com/iam/docs/overview#cloud-iam-policy |
| [developer-console]: https://console.developers.google.com/ |
| [create-project]: https://cloud.google.com/resource-manager/docs/creating-managing-projects |
| [cloud-cli]: https://cloud.google.com/cli |
| [troubleshooting]: https://github.com/googleapis/google-cloud-java/blob/main/TROUBLESHOOTING.md |
| [contributing]: https://github.com/googleapis/google-cloud-java/blob/main/CONTRIBUTING.md |
| [code-of-conduct]: https://github.com/googleapis/google-cloud-java/blob/main/CODE_OF_CONDUCT.md#contributor-code-of-conduct |
| [license]: https://github.com/googleapis/google-cloud-java/blob/main/LICENSE |
| |
| [enable-api]: https://console.cloud.google.com/flows/enableapi?apiid=cloudresourcemanager.googleapis.com |
| [libraries-bom]: https://github.com/GoogleCloudPlatform/cloud-opensource-java/wiki/The-Google-Cloud-Platform-Libraries-BOM |
| [shell_img]: https://gstatic.com/cloudssh/images/open-btn.png |
| |
| [semver]: https://semver.org/ |
| [cloudlibs]: https://cloud.google.com/apis/docs/client-libraries-explained |
| [apilibs]: https://cloud.google.com/apis/docs/client-libraries-explained#google_api_client_libraries |
| [oracle]: https://www.oracle.com/java/technologies/java-se-support-roadmap.html |
| [g-c-j]: http://github.com/googleapis/google-cloud-java |