From fe9de9c6fad6b98f1a53d7aea061c108b289efb9 Mon Sep 17 00:00:00 2001 From: Ajay Kannan Date: Sun, 17 Jan 2016 09:26:00 -0800 Subject: [PATCH] Merge ProjectInfo and Project --- .../examples/ResourceManagerExample.java | 11 +- .../gcloud/resourcemanager/Project.java | 419 ++++++++++++++++-- .../gcloud/resourcemanager/ProjectInfo.java | 353 --------------- .../resourcemanager/ResourceManager.java | 26 +- .../resourcemanager/ResourceManagerImpl.java | 37 +- .../gcloud/resourcemanager/package-info.java | 8 +- .../resourcemanager/ProjectInfoTest.java | 109 ----- .../gcloud/resourcemanager/ProjectTest.java | 186 ++++++-- .../ResourceManagerImplTest.java | 70 +-- .../resourcemanager/SerializationTest.java | 16 +- 10 files changed, 625 insertions(+), 610 deletions(-) delete mode 100644 gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ProjectInfo.java delete mode 100644 gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectInfoTest.java diff --git a/gcloud-java-examples/src/main/java/com/google/gcloud/examples/ResourceManagerExample.java b/gcloud-java-examples/src/main/java/com/google/gcloud/examples/ResourceManagerExample.java index c1ba4e06cf7d..8aceeb832515 100644 --- a/gcloud-java-examples/src/main/java/com/google/gcloud/examples/ResourceManagerExample.java +++ b/gcloud-java-examples/src/main/java/com/google/gcloud/examples/ResourceManagerExample.java @@ -17,7 +17,7 @@ package com.google.gcloud.examples; import com.google.common.base.Joiner; -import com.google.gcloud.resourcemanager.ProjectInfo; +import com.google.gcloud.resourcemanager.Project; import com.google.gcloud.resourcemanager.ResourceManager; import com.google.gcloud.resourcemanager.ResourceManagerOptions; @@ -64,8 +64,7 @@ public void run(ResourceManager resourceManager, String... args) { labels.put(args[i], ""); } } - ProjectInfo project = - resourceManager.create(ProjectInfo.builder(projectId).labels(labels).build()); + Project project = Project.builder(resourceManager, projectId).labels(labels).build().create(); System.out.printf( "Successfully created project '%s': %s.%n", projectId, projectDetails(project)); } @@ -111,7 +110,7 @@ private static class GetAction implements ResourceManagerAction { @Override public void run(ResourceManager resourceManager, String... args) { String projectId = args[0]; - ProjectInfo project = resourceManager.get(projectId); + Project project = resourceManager.get(projectId); if (project != null) { System.out.printf( "Successfully got project '%s': %s.%n", projectId, projectDetails(project)); @@ -135,7 +134,7 @@ private static class ListAction implements ResourceManagerAction { @Override public void run(ResourceManager resourceManager, String... args) { System.out.println("Projects you can view:"); - for (ProjectInfo project : resourceManager.list().values()) { + for (Project project : resourceManager.list().values()) { System.out.println(projectDetails(project)); } } @@ -158,7 +157,7 @@ public String[] getOptionalParams() { ACTIONS.put("list", new ListAction()); } - private static String projectDetails(ProjectInfo project) { + private static String projectDetails(Project project) { return new StringBuilder() .append("{projectId:") .append(project.projectId()) diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/Project.java b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/Project.java index e329e1aa3714..9c6b9465cbaf 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/Project.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/Project.java @@ -16,8 +16,23 @@ package com.google.gcloud.resourcemanager; +import static com.google.common.base.MoreObjects.firstNonNull; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.api.client.util.Data; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + +import org.joda.time.DateTime; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.Serializable; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + /** * A Google Cloud Resource Manager project object. * @@ -26,35 +41,295 @@ * immutable. Methods that change or update the underlying Project information return a new Project * instance. */ -public class Project { +public class Project implements Serializable { - private final ResourceManager resourceManager; - private final ProjectInfo info; + private static final long serialVersionUID = 6772622204012731332L; + + private final String name; + private final String projectId; + private final Map labels; + private final Long projectNumber; + private final State state; + private final Long createTimeMillis; + private final ResourceId parent; + private final ResourceManagerOptions options; + private transient ResourceManager resourceManager; /** - * Constructs a Project object that contains the ProjectInfo given. + * The project lifecycle states. */ - public Project(ResourceManager resourceManager, ProjectInfo projectInfo) { - this.resourceManager = checkNotNull(resourceManager); - this.info = checkNotNull(projectInfo); + public enum State { + /** + * Only used/useful for distinguishing unset values. + */ + LIFECYCLE_STATE_UNSPECIFIED, + + /** + * The normal and active state. + */ + ACTIVE, + + /** + * The project has been marked for deletion by the user or by the system (Google Cloud + * Platform). This can generally be reversed by calling {@link ResourceManager#undelete}. + */ + DELETE_REQUESTED, + + /** + * The process of deleting the project has begun. Reversing the deletion is no longer possible. + */ + DELETE_IN_PROGRESS + } + + static class ResourceId implements Serializable { + + private static final long serialVersionUID = 214964928747889072L; + + private final String id; + private final String type; + + ResourceId(String id, String type) { + this.id = checkNotNull(id); + this.type = checkNotNull(type); + } + + String id() { + return id; + } + + String type() { + return type; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof ResourceId && Objects.equals(toPb(), ((ResourceId) obj).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash(id, type); + } + + com.google.api.services.cloudresourcemanager.model.ResourceId toPb() { + com.google.api.services.cloudresourcemanager.model.ResourceId resourceIdPb = + new com.google.api.services.cloudresourcemanager.model.ResourceId(); + resourceIdPb.setId(id); + resourceIdPb.setType(type.toLowerCase()); + return resourceIdPb; + } + + static ResourceId fromPb( + com.google.api.services.cloudresourcemanager.model.ResourceId resourceIdPb) { + return new ResourceId(resourceIdPb.getId(), resourceIdPb.getType()); + } + } + + public static class Builder { + + private String name; + private String projectId; + private Map labels = new HashMap<>(); + private Long projectNumber; + private State state; + private Long createTimeMillis; + private ResourceId parent; + private ResourceManager resourceManager; + + private Builder() { + } + + Builder(Project project) { + this.name = project.name; + this.projectId = project.projectId; + this.labels.putAll(project.labels); + this.projectNumber = project.projectNumber; + this.state = project.state; + this.createTimeMillis = project.createTimeMillis; + this.parent = project.parent; + this.resourceManager = project.resourceManager; + } + + /** + * Set the user-assigned name of the project. + * + *

This field is optional and can remain unset. Allowed characters are: lowercase and + * uppercase letters, numbers, hyphen, single-quote, double-quote, space, and exclamation point. + * This field can be changed after project creation. + */ + public Builder name(String name) { + this.name = firstNonNull(name, Data.nullOf(String.class)); + return this; + } + + /** + * Set the unique, user-assigned ID of the project. + * + *

The ID must be 6 to 30 lowercase letters, digits, or hyphens. It must start with a letter. + * Trailing hyphens are prohibited. This field cannot be changed after the server creates the + * project. + */ + public Builder projectId(String projectId) { + this.projectId = checkNotNull(projectId); + return this; + } + + /** + * Add a label associated with this project. + * + *

See {@link #labels} for label restrictions. + */ + public Builder addLabel(String key, String value) { + this.labels.put(key, value); + return this; + } + + /** + * Remove a label associated with this project. + */ + public Builder removeLabel(String key) { + this.labels.remove(key); + return this; + } + + /** + * Clear the labels associated with this project. + */ + public Builder clearLabels() { + this.labels.clear(); + return this; + } + + /** + * Set the labels associated with this project. + * + *

Label keys must be between 1 and 63 characters long and must conform to the following + * regular expression: [a-z]([-a-z0-9]*[a-z0-9])?. Label values must be between 0 and 63 + * characters long and must conform to the regular expression ([a-z]([-a-z0-9]*[a-z0-9])?)?. No + * more than 256 labels can be associated with a given resource. This field can be changed after + * project creation. + */ + public Builder labels(Map labels) { + this.labels = Maps.newHashMap(checkNotNull(labels)); + return this; + } + + Builder projectNumber(Long projectNumber) { + this.projectNumber = projectNumber; + return this; + } + + Builder state(State state) { + this.state = state; + return this; + } + + Builder createTimeMillis(Long createTimeMillis) { + this.createTimeMillis = createTimeMillis; + return this; + } + + Builder parent(ResourceId parent) { + this.parent = parent; + return this; + } + + /** + * Sets the service object associated with this Project. This service object is used to send + * requests relevant to this blob (e.g. {@link #delete}, {@link #get}, {@link #reload}, + * {@link #replace}, {@link #undelete}). + */ + public Builder resourceManager(ResourceManager resourceManager) { + this.resourceManager = checkNotNull(resourceManager); + return this; + } + + public Project build() { + return new Project(this); + } + } + + Project(Builder builder) { + this.name = builder.name; + this.projectId = builder.projectId; + this.labels = ImmutableMap.copyOf(builder.labels); + this.projectNumber = builder.projectNumber; + this.state = builder.state; + this.createTimeMillis = builder.createTimeMillis; + this.parent = builder.parent; + this.options = builder.resourceManager.options(); + this.resourceManager = builder.resourceManager; + } + + Project(String name, String projectId, Map labels, Long projectNumber, + State state, Long createTimeMillis, ResourceId parent, ResourceManagerOptions options, + ResourceManager resourceManager) { + this.name = name; + this.projectId = projectId; + this.labels = ImmutableMap.copyOf(labels); + this.projectNumber = projectNumber; + this.state = state; + this.createTimeMillis = createTimeMillis; + this.parent = parent; + this.options = options; + this.resourceManager = resourceManager; } /** - * Constructs a Project object that contains project information got from the server. + * Get the unique, user-assigned ID of the project. * - * @return Project object containing the project's metadata or {@code null} if not found - * @throws ResourceManagerException upon failure + *

This field cannot be changed after the server creates the project. */ - public static Project get(ResourceManager resourceManager, String projectId) { - ProjectInfo projectInfo = resourceManager.get(projectId); - return projectInfo != null ? new Project(resourceManager, projectInfo) : null; + public String projectId() { + return projectId; + } + + /** + * Get the user-assigned name of the project. + * + *

This field is optional, can remain unset, and can be changed after project creation. + */ + public String name() { + return Data.isNull(name) ? null : name; + } + + /** + * Get number uniquely identifying the project. + * + *

This field is set by the server and is read-only. + */ + public Long projectNumber() { + return projectNumber; } /** - * Returns the {@link ProjectInfo} object associated with this Project. + * Get the immutable map of labels associated with this project. */ - public ProjectInfo info() { - return info; + public Map labels() { + return labels; + } + + /** + * Get the project's lifecycle state. + * + *

This is a read-only field. To change the lifecycle state of your project, use the + * {@code delete} or {@code undelete} method. + */ + public State state() { + return state; + } + + ResourceId parent() { + return parent; + } + + /** + * Get the project's creation time (in milliseconds). + * + *

This field is set by the server and is read-only. + */ + public Long createTimeMillis() { + return createTimeMillis; } /** @@ -64,6 +339,46 @@ public ResourceManager resourceManager() { return resourceManager; } + @Override + public boolean equals(Object obj) { + return obj instanceof Project && Objects.equals(toPb(), ((Project) obj).toPb()) + && Objects.equals(options, ((Project) obj).options); + } + + @Override + public int hashCode() { + return Objects.hash( + name, projectId, labels, projectNumber, state, createTimeMillis, parent, options); + } + + public static Builder builder(ResourceManager resourceManager, String id) { + return new Builder().projectId(id).resourceManager(resourceManager); + } + + public Builder toBuilder() { + return new Builder(this); + } + + /** + * Creates a project. + * + * @return a Project containing the project's data + * @throws ResourceManagerException upon failure + */ + public Project create() { + return resourceManager.create(this); + } + + /** + * Constructs a Project object that contains project information loaded from the server. + * + * @return Project object containing the project's data or {@code null} if not found + * @throws ResourceManagerException upon failure + */ + public static Project get(ResourceManager resourceManager, String projectId) { + return resourceManager.get(projectId); + } + /** * Fetches the current project's latest information. Returns {@code null} if the job does not * exist. @@ -72,7 +387,7 @@ public ResourceManager resourceManager() { * @throws ResourceManagerException upon failure */ public Project reload() { - return Project.get(resourceManager, info.projectId()); + return resourceManager.get(projectId); } /** @@ -81,11 +396,11 @@ public Project reload() { *

This method will only affect the project if the following criteria are met: *

    *
  • The project does not have a billing account associated with it. - *
  • The project has a lifecycle state of {@link ProjectInfo.State#ACTIVE}. + *
  • The project has a lifecycle state of {@link Project.State#ACTIVE}. *
- * This method changes the project's lifecycle state from {@link ProjectInfo.State#ACTIVE} to - * {@link ProjectInfo.State#DELETE_REQUESTED}. The deletion starts at an unspecified time, at - * which point the lifecycle state changes to {@link ProjectInfo.State#DELETE_IN_PROGRESS}. Until + * This method changes the project's lifecycle state from {@link Project.State#ACTIVE} to + * {@link Project.State#DELETE_REQUESTED}. The deletion starts at an unspecified time, at + * which point the lifecycle state changes to {@link Project.State#DELETE_IN_PROGRESS}. Until * the deletion completes, you can check the lifecycle state checked by retrieving the project * with {@link ResourceManager#get}, and the project remains visible to * {@link ResourceManager#list}. However, you cannot update the project. After the deletion @@ -98,15 +413,15 @@ public Project reload() { * @throws ResourceManagerException upon failure */ public void delete() { - resourceManager.delete(info.projectId()); + resourceManager.delete(projectId); } /** * Restores the project identified by the specified project ID. * *

You can only use this method for a project that has a lifecycle state of - * {@link ProjectInfo.State#DELETE_REQUESTED}. After deletion starts, as indicated by a lifecycle - * state of {@link ProjectInfo.State#DELETE_IN_PROGRESS}, the project cannot be restored. The + * {@link Project.State#DELETE_REQUESTED}. After deletion starts, as indicated by a lifecycle + * state of {@link Project.State#DELETE_IN_PROGRESS}, the project cannot be restored. The * caller must have modify permissions for this project. * * @see Cloud * Resource Manager update - * @return the ProjectInfo representing the new project metadata + * @return the Project representing the new project metadata * @throws ResourceManagerException upon failure */ - public Project replace(ProjectInfo projectInfo) { - return new Project(resourceManager, resourceManager.replace(checkNotNull(projectInfo))); + public Project replace(Project project) { + return resourceManager.replace(checkNotNull(project)); + } + + com.google.api.services.cloudresourcemanager.model.Project toPb() { + com.google.api.services.cloudresourcemanager.model.Project projectPb = + new com.google.api.services.cloudresourcemanager.model.Project(); + projectPb.setName(name); + projectPb.setProjectId(projectId); + projectPb.setLabels(labels); + projectPb.setProjectNumber(projectNumber); + if (state != null) { + projectPb.setLifecycleState(state.toString()); + } + if (createTimeMillis != null) { + projectPb.setCreateTime(ISODateTimeFormat.dateTime().withZoneUTC().print(createTimeMillis)); + } + if (parent != null) { + projectPb.setParent(parent.toPb()); + } + return projectPb; + } + + static Project fromPb( + ResourceManager resourceManager, + com.google.api.services.cloudresourcemanager.model.Project projectPb) { + Builder builder = + builder(resourceManager, projectPb.getProjectId()) + .projectNumber(projectPb.getProjectNumber()); + if (projectPb.getName() != null && !projectPb.getName().equals("Unnamed")) { + builder.name(projectPb.getName()); + } + if (projectPb.getLabels() != null) { + builder.labels(projectPb.getLabels()); + } + if (projectPb.getLifecycleState() != null) { + builder.state(State.valueOf(projectPb.getLifecycleState())); + } + if (projectPb.getCreateTime() != null) { + builder.createTimeMillis(DateTime.parse(projectPb.getCreateTime()).getMillis()); + } + if (projectPb.getParent() != null) { + builder.parent(ResourceId.fromPb(projectPb.getParent())); + } + return builder.build(); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + this.resourceManager = options.service(); } } diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ProjectInfo.java b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ProjectInfo.java deleted file mode 100644 index 2cb8a2d93ad2..000000000000 --- a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ProjectInfo.java +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software distributed under the License - * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express - * or implied. See the License for the specific language governing permissions and limitations under - * the License. - */ - -package com.google.gcloud.resourcemanager; - -import static com.google.common.base.MoreObjects.firstNonNull; -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.api.client.util.Data; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; - -import org.joda.time.DateTime; -import org.joda.time.format.ISODateTimeFormat; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -/** - * A Google Cloud Resource Manager project metadata object. - * A Project is a high-level Google Cloud Platform entity. It is a container for ACLs, APIs, - * AppEngine Apps, VMs, and other Google Cloud Platform resources. - */ -public class ProjectInfo implements Serializable { - - private static final long serialVersionUID = 9148970963697734236L; - private final String name; - private final String projectId; - private final Map labels; - private final Long projectNumber; - private final State state; - private final Long createTimeMillis; - private final ResourceId parent; - - /** - * The project lifecycle states. - */ - public enum State { - /** - * Only used/useful for distinguishing unset values. - */ - LIFECYCLE_STATE_UNSPECIFIED, - - /** - * The normal and active state. - */ - ACTIVE, - - /** - * The project has been marked for deletion by the user or by the system (Google Cloud - * Platform). This can generally be reversed by calling {@link ResourceManager#undelete}. - */ - DELETE_REQUESTED, - - /** - * The process of deleting the project has begun. Reversing the deletion is no longer possible. - */ - DELETE_IN_PROGRESS - } - - static class ResourceId implements Serializable { - - private static final long serialVersionUID = -325199985993344726L; - - private final String id; - private final String type; - - ResourceId(String id, String type) { - this.id = checkNotNull(id); - this.type = checkNotNull(type); - } - - String id() { - return id; - } - - String type() { - return type; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ResourceId && Objects.equals(toPb(), ((ResourceId) obj).toPb()); - } - - @Override - public int hashCode() { - return Objects.hash(id, type); - } - - com.google.api.services.cloudresourcemanager.model.ResourceId toPb() { - com.google.api.services.cloudresourcemanager.model.ResourceId resourceIdPb = - new com.google.api.services.cloudresourcemanager.model.ResourceId(); - resourceIdPb.setId(id); - resourceIdPb.setType(type.toLowerCase()); - return resourceIdPb; - } - - static ResourceId fromPb( - com.google.api.services.cloudresourcemanager.model.ResourceId resourceIdPb) { - return new ResourceId(resourceIdPb.getId(), resourceIdPb.getType()); - } - } - - public static class Builder { - - private String name; - private String projectId; - private Map labels = new HashMap<>(); - private Long projectNumber; - private State state; - private Long createTimeMillis; - private ResourceId parent; - - private Builder() { - } - - Builder(ProjectInfo info) { - this.name = info.name; - this.projectId = info.projectId; - this.labels.putAll(info.labels); - this.projectNumber = info.projectNumber; - this.state = info.state; - this.createTimeMillis = info.createTimeMillis; - this.parent = info.parent; - } - - /** - * Set the user-assigned name of the project. - * - *

This field is optional and can remain unset. Allowed characters are: lowercase and - * uppercase letters, numbers, hyphen, single-quote, double-quote, space, and exclamation point. - * This field can be changed after project creation. - */ - public Builder name(String name) { - this.name = firstNonNull(name, Data.nullOf(String.class)); - return this; - } - - /** - * Set the unique, user-assigned ID of the project. - * - *

The ID must be 6 to 30 lowercase letters, digits, or hyphens. It must start with a letter. - * Trailing hyphens are prohibited. This field cannot be changed after the server creates the - * project. - */ - public Builder projectId(String projectId) { - this.projectId = checkNotNull(projectId); - return this; - } - - /** - * Add a label associated with this project. - * - *

See {@link #labels} for label restrictions. - */ - public Builder addLabel(String key, String value) { - this.labels.put(key, value); - return this; - } - - /** - * Remove a label associated with this project. - */ - public Builder removeLabel(String key) { - this.labels.remove(key); - return this; - } - - /** - * Clear the labels associated with this project. - */ - public Builder clearLabels() { - this.labels.clear(); - return this; - } - - /** - * Set the labels associated with this project. - * - *

Label keys must be between 1 and 63 characters long and must conform to the following - * regular expression: [a-z]([-a-z0-9]*[a-z0-9])?. Label values must be between 0 and 63 - * characters long and must conform to the regular expression ([a-z]([-a-z0-9]*[a-z0-9])?)?. No - * more than 256 labels can be associated with a given resource. This field can be changed after - * project creation. - */ - public Builder labels(Map labels) { - this.labels = Maps.newHashMap(checkNotNull(labels)); - return this; - } - - Builder projectNumber(Long projectNumber) { - this.projectNumber = projectNumber; - return this; - } - - Builder state(State state) { - this.state = state; - return this; - } - - Builder createTimeMillis(Long createTimeMillis) { - this.createTimeMillis = createTimeMillis; - return this; - } - - Builder parent(ResourceId parent) { - this.parent = parent; - return this; - } - - public ProjectInfo build() { - return new ProjectInfo(this); - } - } - - ProjectInfo(Builder builder) { - this.name = builder.name; - this.projectId = builder.projectId; - this.labels = ImmutableMap.copyOf(builder.labels); - this.projectNumber = builder.projectNumber; - this.state = builder.state; - this.createTimeMillis = builder.createTimeMillis; - this.parent = builder.parent; - } - - /** - * Get the unique, user-assigned ID of the project. - * - *

This field cannot be changed after the server creates the project. - */ - public String projectId() { - return projectId; - } - - /** - * Get the user-assigned name of the project. - * - *

This field is optional, can remain unset, and can be changed after project creation. - */ - public String name() { - return Data.isNull(name) ? null : name; - } - - /** - * Get number uniquely identifying the project. - * - *

This field is set by the server and is read-only. - */ - public Long projectNumber() { - return projectNumber; - } - - /** - * Get the immutable map of labels associated with this project. - */ - public Map labels() { - return labels; - } - - /** - * Get the project's lifecycle state. - * - *

This is a read-only field. To change the lifecycle state of your project, use the - * {@code delete} or {@code undelete} method. - */ - public State state() { - return state; - } - - ResourceId parent() { - return parent; - } - - /** - * Get the project's creation time (in milliseconds). - * - *

This field is set by the server and is read-only. - */ - public Long createTimeMillis() { - return createTimeMillis; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ProjectInfo && Objects.equals(toPb(), ((ProjectInfo) obj).toPb()); - } - - @Override - public int hashCode() { - return Objects.hash(name, projectId, labels, projectNumber, state, createTimeMillis, parent); - } - - public static Builder builder(String id) { - return new Builder().projectId(id); - } - - public Builder toBuilder() { - return new Builder(this); - } - - com.google.api.services.cloudresourcemanager.model.Project toPb() { - com.google.api.services.cloudresourcemanager.model.Project projectPb = - new com.google.api.services.cloudresourcemanager.model.Project(); - projectPb.setName(name); - projectPb.setProjectId(projectId); - projectPb.setLabels(labels); - projectPb.setProjectNumber(projectNumber); - if (state != null) { - projectPb.setLifecycleState(state.toString()); - } - if (createTimeMillis != null) { - projectPb.setCreateTime(ISODateTimeFormat.dateTime().withZoneUTC().print(createTimeMillis)); - } - if (parent != null) { - projectPb.setParent(parent.toPb()); - } - return projectPb; - } - - static ProjectInfo fromPb(com.google.api.services.cloudresourcemanager.model.Project projectPb) { - Builder builder = builder(projectPb.getProjectId()).projectNumber(projectPb.getProjectNumber()); - if (projectPb.getName() != null && !projectPb.getName().equals("Unnamed")) { - builder.name(projectPb.getName()); - } - if (projectPb.getLabels() != null) { - builder.labels(projectPb.getLabels()); - } - if (projectPb.getLifecycleState() != null) { - builder.state(State.valueOf(projectPb.getLifecycleState())); - } - if (projectPb.getCreateTime() != null) { - builder.createTimeMillis(DateTime.parse(projectPb.getCreateTime()).getMillis()); - } - if (projectPb.getParent() != null) { - builder.parent(ResourceId.fromPb(projectPb.getParent())); - } - return builder.build(); - } -} diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ResourceManager.java b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ResourceManager.java index 3d658d18d28a..5716b891ec89 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ResourceManager.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/ResourceManager.java @@ -179,12 +179,12 @@ public static ProjectListOption fields(ProjectField... fields) { * @see Cloud * Resource Manager create - * @return ProjectInfo object representing the new project's metadata. The returned object will + * @return Project object representing the new project's metadata. The returned object will * include the following read-only fields supplied by the server: project number, lifecycle * state, and creation time. * @throws ResourceManagerException upon failure */ - ProjectInfo create(ProjectInfo project); + Project create(Project project); /** * Marks the project identified by the specified project ID for deletion. @@ -192,11 +192,11 @@ public static ProjectListOption fields(ProjectField... fields) { *

This method will only affect the project if the following criteria are met: *

    *
  • The project does not have a billing account associated with it. - *
  • The project has a lifecycle state of {@link ProjectInfo.State#ACTIVE}. + *
  • The project has a lifecycle state of {@link Project.State#ACTIVE}. *
- * This method changes the project's lifecycle state from {@link ProjectInfo.State#ACTIVE} to - * {@link ProjectInfo.State#DELETE_REQUESTED}. The deletion starts at an unspecified time, at - * which point the lifecycle state changes to {@link ProjectInfo.State#DELETE_IN_PROGRESS}. Until + * This method changes the project's lifecycle state from {@link Project.State#ACTIVE} to + * {@link Project.State#DELETE_REQUESTED}. The deletion starts at an unspecified time, at + * which point the lifecycle state changes to {@link Project.State#DELETE_IN_PROGRESS}. Until * the deletion completes, you can check the lifecycle state checked by retrieving the project * with {@link ResourceManager#get}, and the project remains visible to * {@link ResourceManager#list}. However, you cannot update the project. After the deletion @@ -221,7 +221,7 @@ public static ProjectListOption fields(ProjectField... fields) { * Resource Manager get * @throws ResourceManagerException upon failure */ - ProjectInfo get(String projectId, ProjectGetOption... options); + Project get(String projectId, ProjectGetOption... options); /** * Lists the projects visible to the current user. @@ -234,10 +234,10 @@ public static ProjectListOption fields(ProjectField... fields) { * @see Cloud * Resource Manager list - * @return {@code Page}, a page of projects + * @return {@code Page}, a page of projects * @throws ResourceManagerException upon failure */ - Page list(ProjectListOption... options); + Page list(ProjectListOption... options); /** * Replaces the attributes of the project. @@ -247,17 +247,17 @@ public static ProjectListOption fields(ProjectField... fields) { * @see Cloud * Resource Manager update - * @return the ProjectInfo representing the new project metadata + * @return the Project representing the new project metadata * @throws ResourceManagerException upon failure */ - ProjectInfo replace(ProjectInfo newProject); + Project replace(Project newProject); /** * Restores the project identified by the specified project ID. * *

You can only use this method for a project that has a lifecycle state of - * {@link ProjectInfo.State#DELETE_REQUESTED}. After deletion starts, as indicated by a lifecycle - * state of {@link ProjectInfo.State#DELETE_IN_PROGRESS}, the project cannot be restored. The + * {@link Project.State#DELETE_REQUESTED}. After deletion starts, as indicated by a lifecycle + * state of {@link Project.State#DELETE_IN_PROGRESS}, the project cannot be restored. The * caller must have modify permissions for this project. * * @see () { @Override public com.google.api.services.cloudresourcemanager.model.Project call() { - return resourceManagerRpc.create(project.toPb()); + return resourceManagerRpc.create(project.toPb()); } }, options().retryParams(), EXCEPTION_HANDLER)); } catch (RetryHelperException e) { @@ -101,7 +103,7 @@ public Void call() { } @Override - public ProjectInfo get(final String projectId, ProjectGetOption... options) { + public Project get(final String projectId, ProjectGetOption... options) { final Map optionsMap = optionMap(options); try { com.google.api.services.cloudresourcemanager.model.Project answer = runWithRetries( @@ -111,13 +113,13 @@ public com.google.api.services.cloudresourcemanager.model.Project call() { return resourceManagerRpc.get(projectId, optionsMap); } }, options().retryParams(), EXCEPTION_HANDLER); - return answer == null ? null : ProjectInfo.fromPb(answer); + return answer == null ? null : Project.fromPb(this, answer); } catch (RetryHelperException e) { throw ResourceManagerException.translateAndThrow(e); } } - private static class ProjectPageFetcher implements NextPageFetcher { + private static class ProjectPageFetcher implements NextPageFetcher { private static final long serialVersionUID = 2158209410430566961L; private final Map requestOptions; @@ -131,17 +133,18 @@ private static class ProjectPageFetcher implements NextPageFetcher } @Override - public Page nextPage() { + public Page nextPage() { return listProjects(serviceOptions, requestOptions); } } @Override - public Page list(ProjectListOption... options) { + public Page list(ProjectListOption... options) { return listProjects(options(), optionMap(options)); } - private static Page listProjects(final ResourceManagerOptions serviceOptions, + private static Page listProjects( + final ResourceManagerOptions serviceOptions, final Map optionsMap) { try { Tuple> result = @@ -155,16 +158,16 @@ Iterable> call() { }, serviceOptions.retryParams(), EXCEPTION_HANDLER); String cursor = result.x(); - Iterable projects = + Iterable projects = result.y() == null - ? ImmutableList.of() : Iterables.transform( + ? ImmutableList.of() : Iterables.transform( result.y(), new Function() { + Project>() { @Override - public ProjectInfo apply( + public Project apply( com.google.api.services.cloudresourcemanager.model.Project projectPb) { - return ProjectInfo.fromPb(projectPb); + return Project.fromPb(serviceOptions.service(), projectPb); } }); return new PageImpl<>( @@ -175,9 +178,11 @@ public ProjectInfo apply( } @Override - public ProjectInfo replace(final ProjectInfo newProject) { + public Project replace(final Project newProject) { try { - return ProjectInfo.fromPb(runWithRetries( + return Project.fromPb( + this, + runWithRetries( new Callable() { @Override public com.google.api.services.cloudresourcemanager.model.Project call() { diff --git a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/package-info.java b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/package-info.java index b8687fbf1314..78c7e2402293 100644 --- a/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/package-info.java +++ b/gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/package-info.java @@ -21,17 +21,17 @@ *

 {@code
  * ResourceManager resourceManager = ResourceManagerOptions.defaultInstance().service();
  * String myProjectId = "my-globally-unique-project-id"; // Change to a unique project ID.
- * ProjectInfo myProject = resourceManager.create(ProjectInfo.builder(myProjectId).build());
- * ProjectInfo newProjectInfo = resourceManager.replace(myProject.toBuilder()
+ * Project myProject = Project.builder(resourceManager, myProjectId).build().create();
+ * Project newProject = myProject.replace(myProject.toBuilder()
  *     .addLabel("launch-status", "in-development").build());
- * Iterator projectIterator = resourceManager.list().iterateAll();
+ * Iterator projectIterator = resourceManager.list().iterateAll();
  * System.out.println("Projects I can view:");
  * while (projectIterator.hasNext()) {
  *   System.out.println(projectIterator.next().projectId());
  * }}
* *

Remember that you must authenticate using the Google Cloud SDK. See more about - * providing + * providing * credentials here. * * @see Google Cloud Resource Manager diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectInfoTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectInfoTest.java deleted file mode 100644 index 3aaef8047322..000000000000 --- a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectInfoTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright 2015 Google Inc. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.gcloud.resourcemanager; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertTrue; - -import com.google.common.collect.ImmutableMap; - -import org.junit.Test; - -import java.util.Map; - -public class ProjectInfoTest { - - private static final String PROJECT_ID = "project-id"; - private static final String NAME = "myProj"; - private static final Map LABELS = ImmutableMap.of("k1", "v1", "k2", "v2"); - private static final Long PROJECT_NUMBER = 123L; - private static final Long CREATE_TIME_MILLIS = 123456789L; - private static final ProjectInfo.State STATE = ProjectInfo.State.DELETE_REQUESTED; - private static final ProjectInfo.ResourceId PARENT = - new ProjectInfo.ResourceId("id", "organization"); - private static final ProjectInfo FULL_PROJECT_INFO = ProjectInfo.builder(PROJECT_ID) - .name(NAME) - .labels(LABELS) - .projectNumber(PROJECT_NUMBER) - .createTimeMillis(CREATE_TIME_MILLIS) - .state(STATE) - .parent(PARENT) - .build(); - private static final ProjectInfo PARTIAL_PROJECT_INFO = ProjectInfo.builder(PROJECT_ID).build(); - private static final ProjectInfo UNNAMED_PROJECT_FROM_LIST = - PARTIAL_PROJECT_INFO.toBuilder().name("Unnamed").build(); - - @Test - public void testBuilder() { - assertEquals(PROJECT_ID, FULL_PROJECT_INFO.projectId()); - assertEquals(NAME, FULL_PROJECT_INFO.name()); - assertEquals(LABELS, FULL_PROJECT_INFO.labels()); - assertEquals(PROJECT_NUMBER, FULL_PROJECT_INFO.projectNumber()); - assertEquals(CREATE_TIME_MILLIS, FULL_PROJECT_INFO.createTimeMillis()); - assertEquals(STATE, FULL_PROJECT_INFO.state()); - - assertEquals(PROJECT_ID, PARTIAL_PROJECT_INFO.projectId()); - assertEquals(null, PARTIAL_PROJECT_INFO.name()); - assertTrue(PARTIAL_PROJECT_INFO.labels().isEmpty()); - assertEquals(null, PARTIAL_PROJECT_INFO.projectNumber()); - assertEquals(null, PARTIAL_PROJECT_INFO.createTimeMillis()); - assertEquals(null, PARTIAL_PROJECT_INFO.state()); - } - - @Test - public void testToBuilder() { - compareProjects(FULL_PROJECT_INFO, FULL_PROJECT_INFO.toBuilder().build()); - compareProjects(PARTIAL_PROJECT_INFO, PARTIAL_PROJECT_INFO.toBuilder().build()); - } - - @Test - public void testToAndFromPb() { - assertTrue(FULL_PROJECT_INFO.toPb().getCreateTime().endsWith("Z")); - compareProjects(FULL_PROJECT_INFO, ProjectInfo.fromPb(FULL_PROJECT_INFO.toPb())); - compareProjects(PARTIAL_PROJECT_INFO, ProjectInfo.fromPb(PARTIAL_PROJECT_INFO.toPb())); - compareProjects(PARTIAL_PROJECT_INFO, ProjectInfo.fromPb(UNNAMED_PROJECT_FROM_LIST.toPb())); - } - - @Test - public void testEquals() { - compareProjects( - FULL_PROJECT_INFO, - ProjectInfo.builder(PROJECT_ID) - .name(NAME) - .labels(LABELS) - .projectNumber(PROJECT_NUMBER) - .createTimeMillis(CREATE_TIME_MILLIS) - .state(STATE) - .parent(PARENT) - .build()); - compareProjects(PARTIAL_PROJECT_INFO, ProjectInfo.builder(PROJECT_ID).build()); - assertNotEquals(FULL_PROJECT_INFO, PARTIAL_PROJECT_INFO); - } - - private void compareProjects(ProjectInfo expected, ProjectInfo value) { - assertEquals(expected, value); - assertEquals(expected.projectId(), value.projectId()); - assertEquals(expected.name(), value.name()); - assertEquals(expected.labels(), value.labels()); - assertEquals(expected.projectNumber(), value.projectNumber()); - assertEquals(expected.createTimeMillis(), value.createTimeMillis()); - assertEquals(expected.state(), value.state()); - assertEquals(expected.parent(), value.parent()); - } -} - diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectTest.java index 077818bf2bb9..7bccde5a5bf5 100644 --- a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectTest.java +++ b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ProjectTest.java @@ -16,14 +16,16 @@ package com.google.gcloud.resourcemanager; -import static org.easymock.EasyMock.createStrictMock; +import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import com.google.common.collect.ImmutableMap; @@ -39,22 +41,34 @@ public class ProjectTest { private static final Map LABELS = ImmutableMap.of("k1", "v1", "k2", "v2"); private static final Long PROJECT_NUMBER = 123L; private static final Long CREATE_TIME_MILLIS = 123456789L; - private static final ProjectInfo.State STATE = ProjectInfo.State.DELETE_REQUESTED; - private static final ProjectInfo PROJECT_INFO = ProjectInfo.builder(PROJECT_ID) - .name(NAME) - .labels(LABELS) - .projectNumber(PROJECT_NUMBER) - .createTimeMillis(CREATE_TIME_MILLIS) - .state(STATE) - .build(); - + private static final Project.State STATE = Project.State.DELETE_REQUESTED; + private static final Project.ResourceId PARENT = new Project.ResourceId("id", "organization"); private ResourceManager resourceManager; - private Project project; + private Project fullProject; + private Project fullProjectFromConstructor; + private Project partialProject; + private Project unnamedProjectFromList; + + private void initializeProjects() { + fullProject = + Project.builder(resourceManager, PROJECT_ID) + .name(NAME) + .labels(LABELS) + .projectNumber(PROJECT_NUMBER) + .createTimeMillis(CREATE_TIME_MILLIS) + .state(STATE) + .parent(PARENT) + .build(); + partialProject = Project.builder(resourceManager, PROJECT_ID).build(); + unnamedProjectFromList = partialProject.toBuilder().name("Unnamed").build(); + } @Before - public void setUp() throws Exception { - resourceManager = createStrictMock(ResourceManager.class); - project = new Project(resourceManager, PROJECT_INFO); + public void setup() { + resourceManager = createMock(ResourceManager.class); + fullProjectFromConstructor = new Project(NAME, PROJECT_ID, LABELS, PROJECT_NUMBER, STATE, + CREATE_TIME_MILLIS, PARENT, null, resourceManager); + expect(resourceManager.options()).andReturn(null).anyTimes(); } @After @@ -63,74 +77,160 @@ public void tearDown() throws Exception { } @Test - public void testLoad() { - expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(PROJECT_INFO); + public void testBuilder() { + replay(resourceManager); + initializeProjects(); + assertEquals(PROJECT_ID, fullProject.projectId()); + assertEquals(NAME, fullProject.name()); + assertEquals(LABELS, fullProject.labels()); + assertEquals(PROJECT_NUMBER, fullProject.projectNumber()); + assertEquals(CREATE_TIME_MILLIS, fullProject.createTimeMillis()); + assertEquals(STATE, fullProject.state()); + assertEquals(PARENT, fullProject.parent()); + assertEquals(resourceManager.options(), fullProject.resourceManager().options()); + + assertEquals(PROJECT_ID, partialProject.projectId()); + assertEquals(null, partialProject.name()); + assertTrue(partialProject.labels().isEmpty()); + assertEquals(null, partialProject.projectNumber()); + assertEquals(null, partialProject.createTimeMillis()); + assertEquals(null, partialProject.state()); + assertEquals(null, partialProject.parent()); + assertEquals(resourceManager.options(), partialProject.resourceManager().options()); + } + + @Test + public void testToBuilder() { replay(resourceManager); - Project loadedProject = Project.get(resourceManager, PROJECT_INFO.projectId()); - assertEquals(PROJECT_INFO, loadedProject.info()); + initializeProjects(); + compareProjects(fullProject, fullProject.toBuilder().build()); + compareProjects(partialProject, partialProject.toBuilder().build()); + } + + @Test + public void testToAndFromPb() { + replay(resourceManager); + initializeProjects(); + assertTrue(fullProject.toPb().getCreateTime().endsWith("Z")); + compareProjects(fullProject, Project.fromPb(resourceManager, fullProject.toPb())); + compareProjects(partialProject, Project.fromPb(resourceManager, partialProject.toPb())); + compareProjects(partialProject, Project.fromPb(resourceManager, unnamedProjectFromList.toPb())); + } + + @Test + public void testEquals() { + replay(resourceManager); + initializeProjects(); + compareProjects( + fullProject, + Project.builder(resourceManager, PROJECT_ID) + .name(NAME) + .labels(LABELS) + .projectNumber(PROJECT_NUMBER) + .createTimeMillis(CREATE_TIME_MILLIS) + .state(STATE) + .parent(PARENT) + .build()); + compareProjects(partialProject, Project.builder(resourceManager, PROJECT_ID).build()); + assertNotEquals(fullProject, partialProject); + } + + @Test + public void testCreate() { + expect(resourceManager.get(PROJECT_ID)).andReturn(fullProjectFromConstructor); + replay(resourceManager); + initializeProjects(); + Project loadedProject = Project.get(resourceManager, fullProject.projectId()); + assertEquals(fullProject, loadedProject); + } + + @Test + public void testGet() { + expect(resourceManager.get(PROJECT_ID)).andReturn(fullProjectFromConstructor); + replay(resourceManager); + initializeProjects(); + Project loadedProject = Project.get(resourceManager, fullProject.projectId()); + assertEquals(fullProject, loadedProject); } @Test public void testReload() { - ProjectInfo newInfo = PROJECT_INFO.toBuilder().addLabel("k3", "v3").build(); - expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(newInfo); + Map newLabels = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"); + Project project = new Project(NAME, PROJECT_ID, newLabels, PROJECT_NUMBER, STATE, + CREATE_TIME_MILLIS, PARENT, null, resourceManager); + expect(resourceManager.get(PROJECT_ID)).andReturn(project); replay(resourceManager); + initializeProjects(); Project newProject = project.reload(); assertSame(resourceManager, newProject.resourceManager()); - assertEquals(newInfo, newProject.info()); + assertEquals(project, newProject); } @Test - public void testLoadNull() { - expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(null); + public void testGetNull() { + expect(resourceManager.get(PROJECT_ID)).andReturn(null); replay(resourceManager); - assertNull(Project.get(resourceManager, PROJECT_INFO.projectId())); + initializeProjects(); + assertNull(Project.get(resourceManager, fullProject.projectId())); } @Test public void testReloadDeletedProject() { - expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(PROJECT_INFO); - expect(resourceManager.get(PROJECT_INFO.projectId())).andReturn(null); + expect(resourceManager.get(PROJECT_ID)).andReturn(fullProjectFromConstructor); + expect(resourceManager.get(PROJECT_ID)).andReturn(null); replay(resourceManager); - Project loadedProject = Project.get(resourceManager, PROJECT_INFO.projectId()); + initializeProjects(); + Project loadedProject = Project.get(resourceManager, fullProject.projectId()); assertNotNull(loadedProject); Project reloadedProject = loadedProject.reload(); assertNull(reloadedProject); } - @Test - public void testInfo() { - replay(resourceManager); - assertEquals(PROJECT_INFO, project.info()); - } - @Test public void testResourceManager() { replay(resourceManager); - assertEquals(resourceManager, project.resourceManager()); + initializeProjects(); + assertEquals(resourceManager, fullProject.resourceManager()); } @Test public void testDelete() { - resourceManager.delete(PROJECT_INFO.projectId()); + resourceManager.delete(PROJECT_ID); replay(resourceManager); - project.delete(); + initializeProjects(); + fullProject.delete(); } @Test public void testUndelete() { - resourceManager.undelete(PROJECT_INFO.projectId()); + resourceManager.undelete(PROJECT_ID); replay(resourceManager); - project.undelete(); + initializeProjects(); + fullProject.undelete(); } @Test public void testReplace() { - ProjectInfo newInfo = PROJECT_INFO.toBuilder().addLabel("k3", "v3").build(); - expect(resourceManager.replace(newInfo)).andReturn(newInfo); + Map newLabels = ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3"); + Project expected = new Project(NAME, PROJECT_ID, newLabels, PROJECT_NUMBER, STATE, + CREATE_TIME_MILLIS, PARENT, null, resourceManager); + expect(resourceManager.replace(expected)).andReturn(expected); replay(resourceManager); - Project newProject = project.replace(newInfo); - assertSame(resourceManager, newProject.resourceManager()); - assertEquals(newInfo, newProject.info()); + initializeProjects(); + Project actual = expected.replace(expected); + assertSame(resourceManager, actual.resourceManager()); + compareProjects(expected, actual); + } + + private void compareProjects(Project expected, Project value) { + assertEquals(expected, value); + assertEquals(expected.projectId(), value.projectId()); + assertEquals(expected.name(), value.name()); + assertEquals(expected.labels(), value.labels()); + assertEquals(expected.projectNumber(), value.projectNumber()); + assertEquals(expected.createTimeMillis(), value.createTimeMillis()); + assertEquals(expected.state(), value.state()); + assertEquals(expected.parent(), value.parent()); + assertEquals(expected.resourceManager().options(), value.resourceManager().options()); } } diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ResourceManagerImplTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ResourceManagerImplTest.java index fedd10eacdc6..a7c62dd1c69b 100644 --- a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ResourceManagerImplTest.java +++ b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/ResourceManagerImplTest.java @@ -25,7 +25,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gcloud.Page; -import com.google.gcloud.resourcemanager.ProjectInfo.ResourceId; +import com.google.gcloud.resourcemanager.Project.ResourceId; import com.google.gcloud.resourcemanager.ResourceManager.ProjectField; import com.google.gcloud.resourcemanager.ResourceManager.ProjectGetOption; import com.google.gcloud.resourcemanager.ResourceManager.ProjectListOption; @@ -55,9 +55,11 @@ public class ResourceManagerImplTest { ProjectListOption.fields(ProjectField.NAME, ProjectField.LABELS); private static final ProjectListOption LIST_FILTER = ProjectListOption.filter("id:* name:myProject labels.color:blue LABELS.SIZE:*"); - private static final ProjectInfo PARTIAL_PROJECT = ProjectInfo.builder("partial-project").build(); + private static final Project PARTIAL_PROJECT = + Project.builder(RESOURCE_MANAGER, "partial-project").build(); private static final ResourceId PARENT = new ResourceId("id", "type"); - private static final ProjectInfo COMPLETE_PROJECT = ProjectInfo.builder("complete-project") + private static final Project COMPLETE_PROJECT = + Project.builder(RESOURCE_MANAGER, "complete-project") .name("name") .labels(ImmutableMap.of("k1", "v1")) .parent(PARENT) @@ -78,7 +80,7 @@ public void setUp() { } private void clearProjects() { - for (ProjectInfo project : RESOURCE_MANAGER.list().values()) { + for (Project project : RESOURCE_MANAGER.list().values()) { RESOURCE_MANAGER_HELPER.removeProject(project.projectId()); } } @@ -88,7 +90,7 @@ public static void afterClass() { RESOURCE_MANAGER_HELPER.stop(); } - private void compareReadWriteFields(ProjectInfo expected, ProjectInfo actual) { + private void compareReadWriteFields(Project expected, Project actual) { assertEquals(expected.projectId(), actual.projectId()); assertEquals(expected.name(), actual.name()); assertEquals(expected.labels(), actual.labels()); @@ -97,9 +99,9 @@ private void compareReadWriteFields(ProjectInfo expected, ProjectInfo actual) { @Test public void testCreate() { - ProjectInfo returnedProject = RESOURCE_MANAGER.create(PARTIAL_PROJECT); + Project returnedProject = RESOURCE_MANAGER.create(PARTIAL_PROJECT); compareReadWriteFields(PARTIAL_PROJECT, returnedProject); - assertEquals(ProjectInfo.State.ACTIVE, returnedProject.state()); + assertEquals(Project.State.ACTIVE, returnedProject.state()); assertNull(returnedProject.name()); assertNull(returnedProject.parent()); assertNotNull(returnedProject.projectNumber()); @@ -114,7 +116,7 @@ public void testCreate() { } returnedProject = RESOURCE_MANAGER.create(COMPLETE_PROJECT); compareReadWriteFields(COMPLETE_PROJECT, returnedProject); - assertEquals(ProjectInfo.State.ACTIVE, returnedProject.state()); + assertEquals(Project.State.ACTIVE, returnedProject.state()); assertNotNull(returnedProject.projectNumber()); assertNotNull(returnedProject.createTimeMillis()); } @@ -123,7 +125,8 @@ public void testCreate() { public void testDelete() { RESOURCE_MANAGER.create(COMPLETE_PROJECT); RESOURCE_MANAGER.delete(COMPLETE_PROJECT.projectId()); - assertEquals(ProjectInfo.State.DELETE_REQUESTED, + assertEquals( + Project.State.DELETE_REQUESTED, RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()).state()); try { RESOURCE_MANAGER.delete("some-nonexistant-project-id"); @@ -137,7 +140,7 @@ public void testDelete() { @Test public void testGet() { RESOURCE_MANAGER.create(COMPLETE_PROJECT); - ProjectInfo returnedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()); + Project returnedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()); compareReadWriteFields(COMPLETE_PROJECT, returnedProject); RESOURCE_MANAGER_HELPER.removeProject(COMPLETE_PROJECT.projectId()); assertNull(RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId())); @@ -145,8 +148,8 @@ public void testGet() { @Test public void testGetWithOptions() { - ProjectInfo originalProject = RESOURCE_MANAGER.create(COMPLETE_PROJECT); - ProjectInfo returnedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId(), GET_FIELDS); + Project originalProject = RESOURCE_MANAGER.create(COMPLETE_PROJECT); + Project returnedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId(), GET_FIELDS); assertFalse(COMPLETE_PROJECT.equals(returnedProject)); assertEquals(COMPLETE_PROJECT.projectId(), returnedProject.projectId()); assertEquals(COMPLETE_PROJECT.name(), returnedProject.name()); @@ -159,11 +162,11 @@ public void testGetWithOptions() { @Test public void testList() { - Page projects = RESOURCE_MANAGER.list(); + Page projects = RESOURCE_MANAGER.list(); assertFalse(projects.values().iterator().hasNext()); // TODO: change this when #421 is resolved RESOURCE_MANAGER.create(PARTIAL_PROJECT); RESOURCE_MANAGER.create(COMPLETE_PROJECT); - for (ProjectInfo p : RESOURCE_MANAGER.list().values()) { + for (Project p : RESOURCE_MANAGER.list().values()) { if (p.projectId().equals(PARTIAL_PROJECT.projectId())) { compareReadWriteFields(PARTIAL_PROJECT, p); } else if (p.projectId().equals(COMPLETE_PROJECT.projectId())) { @@ -177,8 +180,8 @@ public void testList() { @Test public void testListFieldOptions() { RESOURCE_MANAGER.create(COMPLETE_PROJECT); - Page projects = RESOURCE_MANAGER.list(LIST_FIELDS); - ProjectInfo returnedProject = projects.iterateAll().next(); + Page projects = RESOURCE_MANAGER.list(LIST_FIELDS); + Project returnedProject = projects.iterateAll().next(); assertEquals(COMPLETE_PROJECT.projectId(), returnedProject.projectId()); assertEquals(COMPLETE_PROJECT.name(), returnedProject.name()); assertEquals(COMPLETE_PROJECT.labels(), returnedProject.labels()); @@ -190,24 +193,28 @@ public void testListFieldOptions() { @Test public void testListFilterOptions() { - ProjectInfo matchingProject = ProjectInfo.builder("matching-project") + Project matchingProject = + Project.builder(RESOURCE_MANAGER, "matching-project") .name("MyProject") .labels(ImmutableMap.of("color", "blue", "size", "big")) .build(); - ProjectInfo nonMatchingProject1 = ProjectInfo.builder("non-matching-project1") + Project nonMatchingProject1 = + Project.builder(RESOURCE_MANAGER, "non-matching-project1") .name("myProject") .labels(ImmutableMap.of("color", "blue")) .build(); - ProjectInfo nonMatchingProject2 = ProjectInfo.builder("non-matching-project2") + Project nonMatchingProject2 = + Project.builder(RESOURCE_MANAGER, "non-matching-project2") .name("myProj") .labels(ImmutableMap.of("color", "blue", "size", "big")) .build(); - ProjectInfo nonMatchingProject3 = ProjectInfo.builder("non-matching-project3").build(); + Project nonMatchingProject3 = + Project.builder(RESOURCE_MANAGER, "non-matching-project3").build(); RESOURCE_MANAGER.create(matchingProject); RESOURCE_MANAGER.create(nonMatchingProject1); RESOURCE_MANAGER.create(nonMatchingProject2); RESOURCE_MANAGER.create(nonMatchingProject3); - for (ProjectInfo p : RESOURCE_MANAGER.list(LIST_FILTER).values()) { + for (Project p : RESOURCE_MANAGER.list(LIST_FILTER).values()) { assertFalse(p.equals(nonMatchingProject1)); assertFalse(p.equals(nonMatchingProject2)); compareReadWriteFields(matchingProject, p); @@ -216,22 +223,23 @@ public void testListFilterOptions() { @Test public void testReplace() { - ProjectInfo createdProject = RESOURCE_MANAGER.create(COMPLETE_PROJECT); + Project createdProject = RESOURCE_MANAGER.create(COMPLETE_PROJECT); Map newLabels = ImmutableMap.of("new k1", "new v1"); - ProjectInfo anotherCompleteProject = ProjectInfo.builder(COMPLETE_PROJECT.projectId()) + Project anotherCompleteProject = + Project.builder(RESOURCE_MANAGER, COMPLETE_PROJECT.projectId()) .labels(newLabels) .projectNumber(987654321L) .createTimeMillis(230682061315L) - .state(ProjectInfo.State.DELETE_REQUESTED) + .state(Project.State.DELETE_REQUESTED) .parent(createdProject.parent()) .build(); - ProjectInfo returnedProject = RESOURCE_MANAGER.replace(anotherCompleteProject); + Project returnedProject = RESOURCE_MANAGER.replace(anotherCompleteProject); compareReadWriteFields(anotherCompleteProject, returnedProject); assertEquals(createdProject.projectNumber(), returnedProject.projectNumber()); assertEquals(createdProject.createTimeMillis(), returnedProject.createTimeMillis()); assertEquals(createdProject.state(), returnedProject.state()); - ProjectInfo nonexistantProject = - ProjectInfo.builder("some-project-id-that-does-not-exist").build(); + Project nonexistantProject = + Project.builder(RESOURCE_MANAGER, "some-project-id-that-does-not-exist").build(); try { RESOURCE_MANAGER.replace(nonexistantProject); fail("Should fail because the project doesn't exist."); @@ -246,12 +254,12 @@ public void testUndelete() { RESOURCE_MANAGER.create(COMPLETE_PROJECT); RESOURCE_MANAGER.delete(COMPLETE_PROJECT.projectId()); assertEquals( - ProjectInfo.State.DELETE_REQUESTED, + Project.State.DELETE_REQUESTED, RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()).state()); RESOURCE_MANAGER.undelete(COMPLETE_PROJECT.projectId()); - ProjectInfo revivedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()); + Project revivedProject = RESOURCE_MANAGER.get(COMPLETE_PROJECT.projectId()); compareReadWriteFields(COMPLETE_PROJECT, revivedProject); - assertEquals(ProjectInfo.State.ACTIVE, revivedProject.state()); + assertEquals(Project.State.ACTIVE, revivedProject.state()); try { RESOURCE_MANAGER.undelete("invalid-project-id"); fail("Should fail because the project doesn't exist."); @@ -276,7 +284,7 @@ public void testRetryableException() { .andThrow(new ResourceManagerException(500, "Internal Error", true)) .andReturn(PARTIAL_PROJECT.toPb()); EasyMock.replay(resourceManagerRpcMock); - ProjectInfo returnedProject = resourceManagerMock.get(PARTIAL_PROJECT.projectId()); + Project returnedProject = resourceManagerMock.get(PARTIAL_PROJECT.projectId()); assertEquals(PARTIAL_PROJECT, returnedProject); } diff --git a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java index 64e09449149b..eb6b3f080f58 100644 --- a/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java +++ b/gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/SerializationTest.java @@ -35,16 +35,18 @@ public class SerializationTest { - private static final ProjectInfo PARTIAL_PROJECT_INFO = ProjectInfo.builder("id1").build(); - private static final ProjectInfo FULL_PROJECT_INFO = ProjectInfo.builder("id") +private static final ResourceManager RESOURCE_MANAGER = + ResourceManagerOptions.defaultInstance().service(); + private static final Project PARTIAL_PROJECT = Project.builder(RESOURCE_MANAGER, "id1").build(); + private static final Project FULL_PROJECT = Project.builder(RESOURCE_MANAGER, "id") .name("name") .labels(ImmutableMap.of("key", "value")) .projectNumber(123L) - .state(ProjectInfo.State.ACTIVE) + .state(Project.State.ACTIVE) .createTimeMillis(1234L) .build(); - private static final PageImpl PAGE_RESULT = - new PageImpl<>(null, "c", Collections.singletonList(PARTIAL_PROJECT_INFO)); + private static final PageImpl PAGE_RESULT = + new PageImpl<>(null, "c", Collections.singletonList(PARTIAL_PROJECT)); private static final ResourceManager.ProjectGetOption PROJECT_GET_OPTION = ResourceManager.ProjectGetOption.fields(ResourceManager.ProjectField.NAME); private static final ResourceManager.ProjectListOption PROJECT_LIST_OPTION = @@ -65,8 +67,8 @@ public void testServiceOptions() throws Exception { @Test public void testModelAndRequests() throws Exception { - Serializable[] objects = {PARTIAL_PROJECT_INFO, FULL_PROJECT_INFO, PAGE_RESULT, - PROJECT_GET_OPTION, PROJECT_LIST_OPTION}; + Serializable[] objects = { + PARTIAL_PROJECT, FULL_PROJECT, PAGE_RESULT, PROJECT_GET_OPTION, PROJECT_LIST_OPTION}; for (Serializable obj : objects) { Object copy = serializeAndDeserialize(obj); assertEquals(obj, obj);