From e9a9b1d6d43759fe7daf90f1e7d66877d8cfcc61 Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Thu, 12 Mar 2020 15:22:15 +0530 Subject: [PATCH 01/14] feat: expose folders apis --- clirr-ignored-differences.xml | 61 +++ .../cloud/resourcemanager/Constraint.java | 145 +++++++ .../cloud/resourcemanager/ConstraintInfo.java | 314 ++++++++++++++ .../cloud/resourcemanager/OrgPolicy.java | 140 ++++++ .../cloud/resourcemanager/OrgPolicyInfo.java | 397 ++++++++++++++++++ .../resourcemanager/ResourceManager.java | 78 ++++ .../resourcemanager/ResourceManagerImpl.java | 262 ++++++++++++ .../spi/v1beta1/HttpResourceManagerRpc.java | 90 ++++ .../spi/v1beta1/ResourceManagerRpc.java | 61 +++ .../resourcemanager/ConstraintInfoTest.java | 86 ++++ .../resourcemanager/OrgPolicyInfoTest.java | 94 +++++ .../ResourceManagerImplTest.java | 190 +++++++++ 12 files changed, 1918 insertions(+) create mode 100644 src/main/java/com/google/cloud/resourcemanager/Constraint.java create mode 100644 src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java create mode 100644 src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java create mode 100644 src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java create mode 100644 src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java create mode 100644 src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java diff --git a/clirr-ignored-differences.xml b/clirr-ignored-differences.xml index da1f3c38..d59ef378 100644 --- a/clirr-ignored-differences.xml +++ b/clirr-ignored-differences.xml @@ -6,9 +6,70 @@ java.util.Map testOrgPermissions(java.lang.String, java.util.List) 7012 + + com/google/cloud/resourcemanager/ResourceManager + void clearOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/ResourceManager + com.google.cloud.resourcemanager.OrgPolicy getEffectiveOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/ResourceManager + com.google.cloud.resourcemanager.OrgPolicy getOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/ResourceManager + com.google.api.gax.paging.Page listAvailableOrgPolicyConstraints(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest) + 7012 + + + com/google/cloud/resourcemanager/ResourceManager + com.google.api.gax.paging.Page listOrgPolicies(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest) + 7012 + + + com/google/cloud/resourcemanager/ResourceManager + com.google.cloud.resourcemanager.OrgPolicy setOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest) + 7012 + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc java.util.Map testOrgPermissions(java.lang.String, java.util.List) 7012 + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + void clearOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + com.google.api.services.cloudresourcemanager.model.OrgPolicy getEffectiveOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + com.google.api.services.cloudresourcemanager.model.OrgPolicy getOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest) + 7012 + + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + com.google.cloud.Tuple listAvailableOrgPolicyConstraints(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest) + 7012 + + + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + com.google.cloud.Tuple listOrgPolicies(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest) + 7012 + + + com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc + com.google.api.services.cloudresourcemanager.model.OrgPolicy setOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest) + 7012 + diff --git a/src/main/java/com/google/cloud/resourcemanager/Constraint.java b/src/main/java/com/google/cloud/resourcemanager/Constraint.java new file mode 100644 index 00000000..02340a6b --- /dev/null +++ b/src/main/java/com/google/cloud/resourcemanager/Constraint.java @@ -0,0 +1,145 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.Objects; + +/** + * A Google Cloud Resource Manager constraint object. + * + *

A Constraint describes a way in which a resource's configuration can be restricted. For + * example, it controls which cloud services can be activated across an organization, or whether a + * Compute Engine instance can have serial port connections established. Constraints can be + * configured by the organization's policy adminstrator to fit the needs of the organzation by + * setting Policies for Constraints at different locations in the organization's resource hierarchy. + * Policies are inherited down the resource hierarchy from higher levels, but can also be + * overridden. For details about the inheritance rules please read about + * [Policies][google.cloud.OrgPolicy.v1.Policy]. + */ +public class Constraint extends ConstraintInfo { + private static final long serialVersionUID = 6767630161335155133L; + + private final ResourceManagerOptions options; + private transient ResourceManager resourceManager; + + /** Builder for {@code Constraint}. */ + public static class Builder extends ConstraintInfo.Builder { + private ResourceManager resourceManager; + private ConstraintInfo.BuilderImpl infoBuilder; + + Builder(Constraint constraint) { + this.resourceManager = constraint.resourceManager; + this.infoBuilder = new ConstraintInfo.BuilderImpl(constraint); + } + + @Override + public Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { + infoBuilder.setBooleanConstraint(booleanConstraint); + return this; + } + + @Override + public Builder setConstraintDefault(String constraintDefault) { + infoBuilder.setConstraintDefault(constraintDefault); + return this; + } + + @Override + public Builder setDescription(String description) { + infoBuilder.setDescription(description); + return this; + } + + @Override + public Builder setDisplayName(String displayName) { + infoBuilder.setDisplayName(displayName); + return this; + } + + @Override + public Builder setListConstraint(ListConstraint listConstraint) { + infoBuilder.setListConstraint(listConstraint); + return this; + } + + @Override + public Builder setName(String name) { + infoBuilder.setName(name); + return this; + } + + @Override + public Builder setVersion(Integer version) { + infoBuilder.setVersion(version); + return this; + } + + @Override + public ConstraintInfo build() { + return new Constraint(resourceManager, infoBuilder); + } + } + + Constraint(ResourceManager resourceManager, ConstraintInfo.BuilderImpl infoBuilder) { + super(infoBuilder); + this.resourceManager = checkNotNull(resourceManager); + this.options = resourceManager.getOptions(); + } + + /** Returns the {@link ResourceManager} service object associated with this Constraint. */ + public ResourceManager getResourceManager() { + return resourceManager; + } + + @Override + public Constraint.Builder toBuilder() { + return new Constraint.Builder(this); + } + + @Override + public final boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj == null || !obj.getClass().equals(Constraint.class)) { + return false; + } + Constraint other = (Constraint) obj; + return Objects.equals(toPb(), other.toPb()) && Objects.equals(options, other.options); + } + + @Override + public final int hashCode() { + return Objects.hash(super.hashCode(), options); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + this.resourceManager = options.getService(); + } + + static Constraint fromPb( + ResourceManager resourceManager, + com.google.api.services.cloudresourcemanager.model.Constraint answer) { + ConstraintInfo info = ConstraintInfo.fromPb(answer); + return new Constraint(resourceManager, new ConstraintInfo.BuilderImpl(info)); + } +} diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java new file mode 100644 index 00000000..fca01ad8 --- /dev/null +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -0,0 +1,314 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; +import com.google.common.base.Function; +import com.google.common.base.MoreObjects; +import com.google.common.base.Optional; +import java.io.Serializable; +import java.util.Objects; + +/** A Google Cloud Resource Manager constraint metadata object. */ +public class ConstraintInfo implements Serializable { + static final Function< + com.google.api.services.cloudresourcemanager.model.Constraint, ConstraintInfo> + FROM_PB_FUNCTION = + new Function< + com.google.api.services.cloudresourcemanager.model.Constraint, ConstraintInfo>() { + @Override + public ConstraintInfo apply( + com.google.api.services.cloudresourcemanager.model.Constraint pb) { + return ConstraintInfo.fromPb(pb); + } + }; + static final Function< + ConstraintInfo, com.google.api.services.cloudresourcemanager.model.Constraint> + TO_PB_FUNCTION = + new Function< + ConstraintInfo, com.google.api.services.cloudresourcemanager.model.Constraint>() { + @Override + public com.google.api.services.cloudresourcemanager.model.Constraint apply( + ConstraintInfo constraintInfo) { + return constraintInfo.toPb(); + } + }; + + private static final long serialVersionUID = 9148970963697734236L; + + private BooleanConstraint booleanConstraint; + private String constraintDefault; + private String description; + private String displayName; + private ListConstraint listConstraint; + private String name; + private Integer version; + + /** + * A Constraint that allows or disallows a list of string values, which are configured by an + * Organization's policy administrator with a Policy. + */ + public static class ListConstraint implements Serializable { + + private static final long serialVersionUID = -2133042982786959352L; + + private final Optional suggestedValue; + private final Boolean supportsUnder; + + ListConstraint(String suggestedValue, Boolean supportsUnder) { + this.suggestedValue = Optional.fromNullable(suggestedValue); + this.supportsUnder = supportsUnder; + } + + public Optional getSuggestedValue() { + return suggestedValue; + } + + public Boolean getSupportsUnder() { + return supportsUnder; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("suggestedValue", getSuggestedValue()) + .add("supportsUnder", getSupportsUnder()) + .toString(); + } + + @Override + public int hashCode() { + return Objects.hash(getSuggestedValue(), getSupportsUnder()); + } + + @Override + public final boolean equals(Object obj) { + return obj == this + || obj != null + && obj.getClass().equals(ListConstraint.class) + && Objects.equals(toPb(), ((ListConstraint) obj).toPb()); + } + + com.google.api.services.cloudresourcemanager.model.ListConstraint toPb() { + return new com.google.api.services.cloudresourcemanager.model.ListConstraint() + .setSuggestedValue(String.valueOf(Optional.fromNullable(suggestedValue))) + .setSupportsUnder(supportsUnder); + } + + static ListConstraint fromPb( + com.google.api.services.cloudresourcemanager.model.ListConstraint listConstraint) { + return new ListConstraint( + listConstraint.getSuggestedValue(), listConstraint.getSupportsUnder()); + } + } + + public abstract static class Builder { + public abstract Builder setBooleanConstraint(BooleanConstraint booleanConstraint); + + public abstract Builder setConstraintDefault(String constraintDefault); + + public abstract Builder setDescription(String description); + + public abstract Builder setDisplayName(String displayName); + + public abstract Builder setListConstraint(ListConstraint listConstraint); + + public abstract Builder setName(String name); + + public abstract Builder setVersion(Integer version); + + public abstract ConstraintInfo build(); + } + + static class BuilderImpl extends Builder { + private BooleanConstraint booleanConstraint; + private String constraintDefault; + private String description; + private String displayName; + private ListConstraint listConstraint; + private String name; + private Integer version; + + BuilderImpl(String name) { + this.name = name; + } + + BuilderImpl(ConstraintInfo info) { + this.booleanConstraint = info.booleanConstraint; + this.constraintDefault = info.constraintDefault; + this.description = info.description; + this.displayName = info.displayName; + this.listConstraint = info.listConstraint; + this.name = info.name; + this.version = info.version; + } + + @Override + public Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { + this.booleanConstraint = booleanConstraint; + return this; + } + + @Override + public Builder setConstraintDefault(String constraintDefault) { + this.constraintDefault = constraintDefault; + return this; + } + + @Override + public Builder setDescription(String description) { + this.description = description; + return this; + } + + @Override + public Builder setDisplayName(String displayName) { + this.displayName = displayName; + return this; + } + + @Override + public Builder setListConstraint(ListConstraint listConstraint) { + this.listConstraint = listConstraint; + return this; + } + + @Override + public Builder setName(String name) { + this.name = name; + return this; + } + + @Override + public Builder setVersion(Integer version) { + this.version = version; + return this; + } + + @Override + public ConstraintInfo build() { + return new ConstraintInfo(this); + } + } + + ConstraintInfo(BuilderImpl builder) { + this.booleanConstraint = builder.booleanConstraint; + this.constraintDefault = builder.constraintDefault; + this.description = builder.description; + this.displayName = builder.displayName; + this.listConstraint = builder.listConstraint; + this.name = builder.name; + this.version = builder.version; + } + + public BooleanConstraint getBooleanConstraint() { + return booleanConstraint; + } + + public String getConstraintDefault() { + return constraintDefault; + } + + public String getDescription() { + return description; + } + + public String getDisplayName() { + return displayName; + } + + public ListConstraint getListConstraint() { + return listConstraint; + } + + public String getName() { + return name; + } + + public Integer getVersion() { + return version; + } + + @Override + public boolean equals(Object obj) { + return obj == this + || obj != null + && obj.getClass().equals(ConstraintInfo.class) + && Objects.equals(toPb(), ((ConstraintInfo) obj).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash( + booleanConstraint, + constraintDefault, + description, + displayName, + listConstraint, + name, + version); + } + + public static Builder newBuilder(String name) { + return new BuilderImpl(name); + } + + public Builder toBuilder() { + return new BuilderImpl(this); + } + + com.google.api.services.cloudresourcemanager.model.Constraint toPb() { + com.google.api.services.cloudresourcemanager.model.Constraint constraintPb = + new com.google.api.services.cloudresourcemanager.model.Constraint(); + constraintPb.setBooleanConstraint(booleanConstraint); + constraintPb.setConstraintDefault(constraintDefault); + constraintPb.setDescription(description); + constraintPb.setDisplayName(displayName); + if (listConstraint != null) { + constraintPb.setListConstraint(listConstraint.toPb()); + } + constraintPb.setName(name); + constraintPb.setVersion(version); + return constraintPb; + } + + static ConstraintInfo fromPb( + com.google.api.services.cloudresourcemanager.model.Constraint constraintPb) { + Builder builder = newBuilder(constraintPb.getName()); + if (constraintPb.getBooleanConstraint() != null) { + builder.setBooleanConstraint(constraintPb.getBooleanConstraint()); + } + if (constraintPb.getConstraintDefault() != null) { + constraintPb.setConstraintDefault(constraintPb.getConstraintDefault()); + } + if (constraintPb.getDescription() != null) { + constraintPb.setDescription(constraintPb.getDescription()); + } + if (constraintPb.getDisplayName() != null) { + constraintPb.setDisplayName(constraintPb.getDisplayName()); + } + if (constraintPb.getListConstraint() != null) { + constraintPb.setListConstraint(constraintPb.getListConstraint()); + } + if (constraintPb.getName() != null && !constraintPb.getName().equals("Unnamed")) { + builder.setName(constraintPb.getName()); + } + if (constraintPb.getVersion() != null) { + builder.setVersion(constraintPb.getVersion()); + } + return builder.build(); + } +} diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java new file mode 100644 index 00000000..9ffbcb26 --- /dev/null +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java @@ -0,0 +1,140 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static com.google.common.base.Preconditions.checkNotNull; + +import com.google.api.services.cloudresourcemanager.model.RestoreDefault; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.util.Objects; + +/** + * A Google Cloud Resource Manager organization policy object. + * + *

Defines a Cloud Organization Policy which is used to specify Constraints for configurations of + * Cloud Platform resources. + */ +public class OrgPolicy extends OrgPolicyInfo { + + private static final long serialVersionUID = 6767630161335155133L; + + private final ResourceManagerOptions options; + private transient ResourceManager resourceManager; + + /** Builder for {@code OrgPolicy}. */ + public static class Builder extends OrgPolicyInfo.Builder { + private final ResourceManager resourceManager; + private final OrgPolicyInfo.BuilderImpl infoBuilder; + + Builder(OrgPolicy orgPolicy) { + this.resourceManager = orgPolicy.resourceManager; + this.infoBuilder = new OrgPolicyInfo.BuilderImpl(orgPolicy); + } + + @Override + public Builder setBooleanPolicy(BooleanPolicy booleanPolicy) { + infoBuilder.setBooleanPolicy(booleanPolicy); + return this; + } + + @Override + public Builder setConstraint(String constraint) { + infoBuilder.setConstraint(constraint); + return this; + } + + @Override + public Builder setEtag(String etag) { + infoBuilder.setEtag(etag); + return this; + } + + @Override + public Builder setListPolicy(ListPolicy listPolicy) { + infoBuilder.setListPolicy(listPolicy); + return this; + } + + @Override + public Builder setRestoreDefault(RestoreDefault restoreDefault) { + infoBuilder.setRestoreDefault(restoreDefault); + return this; + } + + @Override + public Builder setUpdateTime(String updateTime) { + infoBuilder.setUpdateTime(updateTime); + return this; + } + + @Override + public Builder setVersion(Integer version) { + infoBuilder.setVersion(version); + return this; + } + + @Override + public OrgPolicyInfo build() { + return new OrgPolicy(resourceManager, infoBuilder); + } + } + + OrgPolicy(ResourceManager resourceManager, OrgPolicyInfo.BuilderImpl infoBuilder) { + super(infoBuilder); + this.resourceManager = checkNotNull(resourceManager); + this.options = resourceManager.getOptions(); + } + + /** Returns the {@link ResourceManager} service object associated with this OrgPolicy. */ + public ResourceManager getResourceManager() { + return resourceManager; + } + + @Override + public Builder toBuilder() { + return new OrgPolicy.Builder(this); + } + + @Override + public final boolean equals(Object obj) { + if (obj == this) { + return true; + } + if (obj == null || !obj.getClass().equals(OrgPolicy.class)) { + return false; + } + OrgPolicy other = (OrgPolicy) obj; + return Objects.equals(toPb(), other.toPb()) && Objects.equals(options, other.options); + } + + @Override + public final int hashCode() { + return Objects.hash(super.hashCode(), options); + } + + private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { + in.defaultReadObject(); + this.resourceManager = options.getService(); + } + + static OrgPolicy fromPb( + ResourceManager resourceManager, + com.google.api.services.cloudresourcemanager.model.OrgPolicy answer) { + OrgPolicyInfo info = OrgPolicyInfo.fromPb(answer); + return new OrgPolicy(resourceManager, new OrgPolicyInfo.BuilderImpl(info)); + } +} diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java new file mode 100644 index 00000000..721fcc08 --- /dev/null +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -0,0 +1,397 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import com.google.api.services.cloudresourcemanager.model.OrgPolicy; +import com.google.api.services.cloudresourcemanager.model.RestoreDefault; +import com.google.common.base.Function; +import com.google.common.base.MoreObjects; +import java.io.Serializable; +import java.util.List; +import java.util.Objects; + +/** A Google Cloud Resource Manager organization policy metadata object. */ +public class OrgPolicyInfo implements Serializable { + static final Function FROM_PB_FUNCTION = + new Function() { + @Override + public OrgPolicyInfo apply( + com.google.api.services.cloudresourcemanager.model.OrgPolicy pb) { + return OrgPolicyInfo.fromPb(pb); + } + }; + static final Function + TO_PB_FUNCTION = + new Function< + OrgPolicyInfo, com.google.api.services.cloudresourcemanager.model.OrgPolicy>() { + @Override + public com.google.api.services.cloudresourcemanager.model.OrgPolicy apply( + OrgPolicyInfo orgPolicyInfo) { + return orgPolicyInfo.toPb(); + } + }; + private static final long serialVersionUID = 9148970963697734236L; + + private BooleanPolicy booleanPolicy; + private String constraint; + private String etag; + private ListPolicy listPolicy; + private RestoreDefault restoreDefault; + private String updateTime; + private Integer version; + + /** Used in policy_type to specify how booleanPolicy will behave at this resource. */ + public static class BooleanPolicy implements Serializable { + private static final long serialVersionUID = -2133042982786959351L; + private final Boolean enforce; + + BooleanPolicy(Boolean enforce) { + this.enforce = enforce; + } + + public boolean getEnforce() { + return enforce; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("enforce", getEnforce()).toString(); + } + + @Override + public int hashCode() { + return Objects.hash(getEnforce()); + } + + @Override + public final boolean equals(Object obj) { + return obj == this + || obj != null + && obj.getClass().equals(BooleanPolicy.class) + && Objects.equals(toPb(), ((BooleanPolicy) obj).toPb()); + } + + com.google.api.services.cloudresourcemanager.model.BooleanPolicy toPb() { + return new com.google.api.services.cloudresourcemanager.model.BooleanPolicy() + .setEnforced(enforce); + } + + static BooleanPolicy fromPb( + com.google.api.services.cloudresourcemanager.model.BooleanPolicy booleanPolicy) { + return new BooleanPolicy(booleanPolicy.getEnforced()); + } + } + + /** + * Used in policy_type to specify how listPolicy behaves at this resource. + * + *

ListPolicy can define specific values and subtrees of Cloud Resource Manager resource + * hierarchy (Organizations, Folders, Projects) that are allowed or denied by setting the + * allowedValues and deniedValues fields. This is achieved by using the under: and optional is: + * prefixes. The under: prefix is used to denote resource subtree values. The is: prefix is used + * to denote specific values, and is required only if the value contains a ":". Values prefixed + * with "is:" are treated the same as values with no prefix. Ancestry subtrees must be in one of + * the following formats: - "projects/", e.g. "projects/tokyo-rain-123" - "folders/", e.g. + * "folders/1234" - "organizations/", e.g. "organizations/1234" The supportsUnder field of the + * associated Constraint defines whether ancestry prefixes can be used. You can set allowedValues + * and deniedValues in the same Policy if allValues is ALL_VALUES_UNSPECIFIED. ALLOW or DENY are + * used to allow or deny all values. If allValues is set to either ALLOW or DENY, allowedValues + * and deniedValues must be unset. + */ + public static class ListPolicy implements Serializable { + private static final long serialVersionUID = -2133042982786959352L; + + private final String allValues; + private final List allowedValues; + private final List deniedValues; + private final Boolean inheritFromParent; + private final String suggestedValue; + + public ListPolicy( + String allValues, + List allowedValues, + List deniedValues, + Boolean inheritFromParent, + String suggestedValue) { + this.allValues = allValues; + this.allowedValues = allowedValues; + this.deniedValues = deniedValues; + this.inheritFromParent = inheritFromParent; + this.suggestedValue = suggestedValue; + } + + public String getAllValues() { + return allValues; + } + + public List getAllowedValues() { + return allowedValues; + } + + public List getDeniedValues() { + return deniedValues; + } + + public Boolean getInheritFromParent() { + return inheritFromParent; + } + + public String getSuggestedValue() { + return suggestedValue; + } + + @Override + public String toString() { + return MoreObjects.toStringHelper(this) + .add("allValues", getAllValues()) + .add("allowedValues", getAllowedValues()) + .add("deniedValues", getDeniedValues()) + .add("inheritFromParent", getInheritFromParent()) + .add("suggestedValue", getSuggestedValue()) + .toString(); + } + + @Override + public final boolean equals(Object obj) { + return obj == this + || obj != null + && obj.getClass().equals(ListPolicy.class) + && Objects.equals(toPb(), ((ListPolicy) obj).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash( + allowedValues, allowedValues, deniedValues, inheritFromParent, suggestedValue); + } + + com.google.api.services.cloudresourcemanager.model.ListPolicy toPb() { + return new com.google.api.services.cloudresourcemanager.model.ListPolicy() + .setAllValues(allValues) + .setAllowedValues(allowedValues) + .setDeniedValues(deniedValues) + .setInheritFromParent(inheritFromParent) + .setSuggestedValue(suggestedValue); + } + + static ListPolicy fromPb( + com.google.api.services.cloudresourcemanager.model.ListPolicy listPolicy) { + return new ListPolicy( + listPolicy.getAllValues(), + listPolicy.getAllowedValues(), + listPolicy.getDeniedValues(), + listPolicy.getInheritFromParent(), + listPolicy.getSuggestedValue()); + } + } + + public abstract static class Builder { + public abstract Builder setBooleanPolicy(BooleanPolicy booleanPolicy); + + public abstract Builder setConstraint(String constraint); + + public abstract Builder setEtag(String etag); + + public abstract Builder setListPolicy(ListPolicy listPolicy); + + public abstract Builder setRestoreDefault(RestoreDefault restoreDefault); + + public abstract Builder setUpdateTime(String updateTime); + + public abstract Builder setVersion(Integer version); + + public abstract OrgPolicyInfo build(); + } + + static class BuilderImpl extends Builder { + private BooleanPolicy booleanPolicy; + private String constraint; + private String etag; + private ListPolicy listPolicy; + private RestoreDefault restoreDefault; + private String updateTime; + private Integer version; + + BuilderImpl() {} + + BuilderImpl(OrgPolicyInfo info) { + this.booleanPolicy = info.booleanPolicy; + this.constraint = info.constraint; + this.etag = info.etag; + this.listPolicy = info.listPolicy; + this.restoreDefault = info.restoreDefault; + this.updateTime = info.updateTime; + this.version = info.version; + } + + @Override + public Builder setBooleanPolicy(BooleanPolicy booleanPolicy) { + this.booleanPolicy = booleanPolicy; + return this; + } + + @Override + public Builder setConstraint(String constraint) { + this.constraint = constraint; + return this; + } + + @Override + public Builder setEtag(String etag) { + this.etag = etag; + return this; + } + + @Override + public Builder setListPolicy(ListPolicy listPolicy) { + this.listPolicy = listPolicy; + return this; + } + + @Override + public Builder setRestoreDefault(RestoreDefault restoreDefault) { + this.restoreDefault = restoreDefault; + return this; + } + + @Override + public Builder setUpdateTime(String updateTime) { + this.updateTime = updateTime; + return this; + } + + @Override + public Builder setVersion(Integer version) { + this.version = version; + return this; + } + + @Override + public OrgPolicyInfo build() { + return new OrgPolicyInfo(this); + } + } + + OrgPolicyInfo(BuilderImpl builder) { + this.booleanPolicy = builder.booleanPolicy; + this.constraint = builder.constraint; + this.etag = builder.etag; + this.listPolicy = builder.listPolicy; + this.restoreDefault = builder.restoreDefault; + this.updateTime = builder.updateTime; + this.version = builder.version; + } + + public BooleanPolicy getBooleanPolicy() { + return booleanPolicy; + } + + public String getConstraint() { + return constraint; + } + + public String getEtag() { + return etag; + } + + public ListPolicy getListPolicy() { + return listPolicy; + } + + public RestoreDefault getRestoreDefault() { + return restoreDefault; + } + + public String getUpdateTime() { + return updateTime; + } + + public Integer getVersion() { + return version; + } + + @Override + public boolean equals(Object obj) { + return obj == this + || obj != null + && obj.getClass().equals(OrgPolicyInfo.class) + && Objects.equals(toPb(), ((OrgPolicyInfo) obj).toPb()); + } + + @Override + public int hashCode() { + return Objects.hash( + getBooleanPolicy(), + getConstraint(), + getEtag(), + getListPolicy(), + getRestoreDefault(), + getUpdateTime(), + getVersion()); + } + + public static Builder newBuilder() { + return new BuilderImpl(); + } + + public Builder toBuilder() { + return new BuilderImpl(this); + } + + com.google.api.services.cloudresourcemanager.model.OrgPolicy toPb() { + com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb = + new com.google.api.services.cloudresourcemanager.model.OrgPolicy(); + if (booleanPolicy != null) { + orgPolicyPb.setBooleanPolicy(booleanPolicy.toPb()); + } + orgPolicyPb.setConstraint(constraint); + if (listPolicy != null) { + orgPolicyPb.setListPolicy(listPolicy.toPb()); + } + orgPolicyPb.setRestoreDefault(restoreDefault); + orgPolicyPb.setEtag(etag); + orgPolicyPb.setUpdateTime(updateTime); + orgPolicyPb.setVersion(version); + return orgPolicyPb; + } + + static OrgPolicyInfo fromPb( + com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb) { + Builder builder = newBuilder(); + if (orgPolicyPb.getBooleanPolicy() != null) { + builder.setBooleanPolicy(BooleanPolicy.fromPb(orgPolicyPb.getBooleanPolicy())); + } + if (orgPolicyPb.getConstraint() != null) { + builder.setConstraint(orgPolicyPb.getConstraint()); + } + if (orgPolicyPb.getListPolicy() != null) { + builder.setListPolicy(ListPolicy.fromPb(orgPolicyPb.getListPolicy())); + } + if (orgPolicyPb.getRestoreDefault() != null) { + builder.setRestoreDefault(orgPolicyPb.getRestoreDefault()); + } + if (orgPolicyPb.getEtag() != null) { + builder.setEtag(orgPolicyPb.getEtag()); + } + if (orgPolicyPb.getUpdateTime() != null) { + builder.setUpdateTime(orgPolicyPb.getUpdateTime()); + } + if (orgPolicyPb.getVersion() != null) { + builder.setVersion(orgPolicyPb.getVersion()); + } + return builder.build(); + } +} diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java index b2a46edf..4fcc0079 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java @@ -17,6 +17,12 @@ package com.google.cloud.resourcemanager; import com.google.api.gax.paging.Page; +import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; +import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.FieldSelector; import com.google.cloud.FieldSelector.Helper; import com.google.cloud.Policy; @@ -354,4 +360,76 @@ public static ProjectListOption fields(ProjectField... fields) { * Resource Manager testIamPermissions */ Map testOrgPermissions(String resource, List permissions); + + /** + * Clears a Policy from a resource. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager clearOrgPolicy + */ + void clearOrgPolicy(String resource, ClearOrgPolicyRequest request); + + /** + * Gets the effective Policy on a resource + * + *

This is the result of merging Policies in the resource hierarchy. The returned Policy will + * not have an etagset because it is a computed Policy across multiple resources. Subtrees of + * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager getEffectiveOrgPolicy + */ + OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); + + /** + * Gets a Policy on a resource. + * + *

If no Policy is set on the resource, a Policy is returned with default values including + * POLICY_TYPE_NOT_SET for the policy_type oneof. The etag value can be used with + * projects.setOrgPolicy() to create or update a Policy during read-modify-write. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager getOrgPolicy + */ + OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); + + /** + * Lists Constraints that could be applied on the specified resource. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager listAvailableOrgPolicyConstraints + */ + Page listAvailableOrgPolicyConstraints( + String resource, ListAvailableOrgPolicyConstraintsRequest request); + + /** + * Lists all the Policies set for a particular resource. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager listOrgPolicies + */ + Page listOrgPolicies(String resource, ListOrgPoliciesRequest request); + + /** + * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the + * resource if one does not exist. + * + *

Not supplying an etag on the request Policy results in an unconditional write of the Policy. + * + * @throws ResourceManagerException upon failure + * @see Resource + * Manager setOrgPolicy + */ + OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request); } diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java index 557567d9..af7d72f2 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java @@ -20,6 +20,12 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.api.gax.paging.Page; +import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; +import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.BaseService; import com.google.cloud.PageImpl; import com.google.cloud.PageImpl.NextPageFetcher; @@ -33,6 +39,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import java.io.IOException; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -293,6 +300,261 @@ public Map call() throws IOException { } } + @Override + public void clearOrgPolicy(final String resource, final ClearOrgPolicyRequest request) { + try { + runWithRetries( + new Callable() { + @Override + public Void call() { + resourceManagerRpc.clearOrgPolicy(resource, request); + return null; + } + }, + getOptions().getRetrySettings(), + EXCEPTION_HANDLER, + getOptions().getClock()); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + + @Override + public OrgPolicy getEffectiveOrgPolicy( + final String resource, final GetEffectiveOrgPolicyRequest request) { + try { + com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + runWithRetries( + new Callable() { + @Override + public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + return resourceManagerRpc.getEffectiveOrgPolicy(resource, request); + } + }, + getOptions().getRetrySettings(), + EXCEPTION_HANDLER, + getOptions().getClock()); + return answer == null ? null : OrgPolicy.fromPb(this, answer); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + + @Override + public OrgPolicy getOrgPolicy(final String resource, final GetOrgPolicyRequest request) { + try { + com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + runWithRetries( + new Callable() { + @Override + public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + return resourceManagerRpc.getOrgPolicy(resource, request); + } + }, + getOptions().getRetrySettings(), + EXCEPTION_HANDLER, + getOptions().getClock()); + return answer == null ? null : OrgPolicy.fromPb(this, answer); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + + private static class ConstraintPageFetcher implements NextPageFetcher { + + private static final long serialVersionUID = 2158209410430566961L; + private final String resource; + private final ListAvailableOrgPolicyConstraintsRequest request; + private final Map requestOptions; + private final ResourceManagerOptions serviceOptions; + + ConstraintPageFetcher( + String resource, + ListAvailableOrgPolicyConstraintsRequest request, + ResourceManagerOptions serviceOptions, + String cursor, + Map optionMap) { + this.resource = resource; + this.request = request; + this.requestOptions = + PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap); + this.serviceOptions = serviceOptions; + } + + @Override + public Page getNextPage() { + return listAvailableOrgPolicyConstraints(resource, request, serviceOptions, requestOptions); + } + } + + @Override + public Page listAvailableOrgPolicyConstraints( + String resource, ListAvailableOrgPolicyConstraintsRequest request) { + Map optionsMap = new HashMap<>(); + optionsMap.put(ResourceManagerRpc.Option.PAGE_TOKEN, request.getPageToken()); + optionsMap.put(ResourceManagerRpc.Option.PAGE_SIZE, request.getPageSize()); + return listAvailableOrgPolicyConstraints(resource, request, getOptions(), optionsMap); + } + + private static Page listAvailableOrgPolicyConstraints( + final String resource, + final ListAvailableOrgPolicyConstraintsRequest request, + final ResourceManagerOptions serviceOptions, + final Map optionsMap) { + try { + Tuple> + result = + runWithRetries( + new Callable< + Tuple< + String, + Iterable< + com.google.api.services.cloudresourcemanager.model.Constraint>>>() { + @Override + public Tuple< + String, + Iterable> + call() { + return serviceOptions + .getResourceManagerRpcV1Beta1() + .listAvailableOrgPolicyConstraints(resource, request); + } + }, + serviceOptions.getRetrySettings(), + EXCEPTION_HANDLER, + serviceOptions.getClock()); + String cursor = result.x(); + Iterable constraints = + result.y() == null + ? ImmutableList.of() + : Iterables.transform( + result.y(), + new Function< + com.google.api.services.cloudresourcemanager.model.Constraint, Constraint>() { + @Override + public Constraint apply( + com.google.api.services.cloudresourcemanager.model.Constraint + constraintPb) { + return new com.google.cloud.resourcemanager.Constraint( + serviceOptions.getService(), + new ConstraintInfo.BuilderImpl(ConstraintInfo.fromPb(constraintPb))); + } + }); + return new PageImpl<>( + new ConstraintPageFetcher(resource, request, serviceOptions, cursor, optionsMap), + cursor, + constraints); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + + private static class OrgPolicyPageFetcher implements NextPageFetcher { + + private static final long serialVersionUID = 2158209410430566961L; + private final String resource; + private final ListOrgPoliciesRequest request; + private final Map requestOptions; + private final ResourceManagerOptions serviceOptions; + + OrgPolicyPageFetcher( + String resource, + ListOrgPoliciesRequest request, + ResourceManagerOptions serviceOptions, + String cursor, + Map optionMap) { + this.resource = resource; + this.request = request; + this.requestOptions = + PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap); + this.serviceOptions = serviceOptions; + } + + @Override + public Page getNextPage() { + return listOrgPolicies(resource, request, serviceOptions, requestOptions); + } + } + + @Override + public Page listOrgPolicies( + final String resource, final ListOrgPoliciesRequest request) { + Map optionsMap = new HashMap<>(); + optionsMap.put(ResourceManagerRpc.Option.PAGE_TOKEN, request.getPageToken()); + optionsMap.put(ResourceManagerRpc.Option.PAGE_SIZE, request.getPageSize()); + return listOrgPolicies(resource, request, getOptions(), optionsMap); + } + + private static Page listOrgPolicies( + final String resource, + final ListOrgPoliciesRequest request, + final ResourceManagerOptions serviceOptions, + final Map optionsMap) { + try { + Tuple> result = + runWithRetries( + new Callable< + Tuple< + String, + Iterable>>() { + @Override + public Tuple< + String, + Iterable> + call() { + return serviceOptions + .getResourceManagerRpcV1Beta1() + .listOrgPolicies(resource, request); + } + }, + serviceOptions.getRetrySettings(), + EXCEPTION_HANDLER, + serviceOptions.getClock()); + String cursor = result.x(); + Iterable orgPolicies = + result.y() == null + ? ImmutableList.of() + : Iterables.transform( + result.y(), + new Function< + com.google.api.services.cloudresourcemanager.model.OrgPolicy, OrgPolicy>() { + @Override + public OrgPolicy apply( + com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb) { + return new OrgPolicy( + serviceOptions.getService(), + new OrgPolicyInfo.BuilderImpl(OrgPolicyInfo.fromPb(orgPolicyPb))); + } + }); + return new PageImpl<>( + new OrgPolicyPageFetcher(resource, request, serviceOptions, cursor, optionsMap), + cursor, + orgPolicies); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + + @Override + public OrgPolicy setOrgPolicy(final String resource, final SetOrgPolicyRequest request) { + try { + com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + runWithRetries( + new Callable() { + @Override + public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + return resourceManagerRpc.setOrgPolicy(resource, request); + } + }, + getOptions().getRetrySettings(), + EXCEPTION_HANDLER, + getOptions().getClock()); + return answer == null ? null : OrgPolicy.fromPb(this, answer); + } catch (RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); + } + } + private Map optionMap(Option... options) { Map temp = Maps.newEnumMap(ResourceManagerRpc.Option.class); for (Option option : options) { diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java index 12e53a91..3e68d86b 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java @@ -30,12 +30,22 @@ import com.google.api.gax.retrying.RetrySettings; import com.google.api.gax.retrying.TimedAttemptSettings; import com.google.api.services.cloudresourcemanager.CloudResourceManager; +import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.Constraint; +import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsResponse; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesResponse; import com.google.api.services.cloudresourcemanager.model.ListProjectsResponse; import com.google.api.services.cloudresourcemanager.model.Operation; +import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.api.services.cloudresourcemanager.model.Policy; import com.google.api.services.cloudresourcemanager.model.Project; import com.google.api.services.cloudresourcemanager.model.SetIamPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.api.services.cloudresourcemanager.model.Status; import com.google.api.services.cloudresourcemanager.model.TestIamPermissionsRequest; import com.google.api.services.cloudresourcemanager.model.TestIamPermissionsResponse; @@ -324,4 +334,84 @@ resource, new TestIamPermissionsRequest().setPermissions(permissions)) throw ResourceManagerException.translateAndThrow(ex); } } + + @Override + public void clearOrgPolicy(String resource, ClearOrgPolicyRequest request) { + try { + resourceManager.folders().clearOrgPolicy(resource, request).execute(); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request) { + try { + return resourceManager.folders().getEffectiveOrgPolicy(resource, request).execute(); + } catch (IOException ex) { + ResourceManagerException translated = translate(ex); + if (translated.getCode() == HTTP_FORBIDDEN) { + // Service returns permission denied if policy doesn't exist. + return null; + } else { + throw translated; + } + } + } + + @Override + public OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request) { + try { + return resourceManager.folders().getOrgPolicy(resource, request).execute(); + } catch (IOException ex) { + ResourceManagerException translated = translate(ex); + if (translated.getCode() == HTTP_FORBIDDEN) { + // Service returns permission denied if policy doesn't exist. + return null; + } else { + throw translated; + } + } + } + + @Override + public Tuple> listAvailableOrgPolicyConstraints( + String resource, ListAvailableOrgPolicyConstraintsRequest request) { + try { + ListAvailableOrgPolicyConstraintsResponse response = + resourceManager.folders().listAvailableOrgPolicyConstraints(resource, request).execute(); + return Tuple.>of( + response.getNextPageToken(), response.getConstraints()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public Tuple> listOrgPolicies( + String resource, ListOrgPoliciesRequest request) { + try { + ListOrgPoliciesResponse response = + resourceManager.folders().listOrgPolicies(resource, request).execute(); + return Tuple.>of( + response.getNextPageToken(), response.getPolicies()); + } catch (IOException ex) { + throw translate(ex); + } + } + + @Override + public OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request) { + try { + return resourceManager.folders().setOrgPolicy(resource, request).execute(); + } catch (IOException ex) { + ResourceManagerException translated = translate(ex); + if (translated.getCode() == HTTP_FORBIDDEN) { + // Service returns permission denied if policy doesn't exist. + return null; + } else { + throw translated; + } + } + } } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index dc45f31d..7c4aa887 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -16,8 +16,16 @@ package com.google.cloud.resourcemanager.spi.v1beta1; +import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.Constraint; +import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; +import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.api.services.cloudresourcemanager.model.Policy; import com.google.api.services.cloudresourcemanager.model.Project; +import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.ServiceRpc; import com.google.cloud.Tuple; import com.google.cloud.resourcemanager.ResourceManagerException; @@ -133,4 +141,57 @@ Integer getInt(Map options) { */ Map testOrgPermissions(String resource, List permissions) throws IOException; + + // TODO(ajaykannan): implement "Organization" functionality when available (issue #319) + + /** Clears a Policy from a resource. */ + void clearOrgPolicy(String resource, ClearOrgPolicyRequest request); + + /** + * Gets the effective Policy on a resource + * + *

This is the result of merging Policies in the resource hierarchy. The returned Policy will + * not have an etagset because it is a computed Policy across multiple resources. Subtrees of + * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. + * + * @throws ResourceManagerException upon failure + */ + OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); + + /** + * Gets a Policy on a resource. + * + *

If no Policy is set on the resource, a Policy is returned with default values including + * POLICY_TYPE_NOT_SET for the policy_type oneof. The etag value can be used with + * projects.setOrgPolicy() to create or update a Policy during read-modify-write. + * + * @throws ResourceManagerException upon failure + */ + OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); + + /** + * Lists Constraints that could be applied on the specified resource. + * + * @throws ResourceManagerException upon failure + */ + Tuple> listAvailableOrgPolicyConstraints( + String resource, ListAvailableOrgPolicyConstraintsRequest request); + + /** + * Lists all the Policies set for a particular resource. + * + * @throws ResourceManagerException upon failure + */ + Tuple> listOrgPolicies( + String resource, ListOrgPoliciesRequest request); + + /** + * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the + * resource if one does not exist. + * + *

Not supplying an etag on the request Policy results in an unconditional write of the Policy. + * + * @throws ResourceManagerException upon failure + */ + OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request); } diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java new file mode 100644 index 00000000..7fb9c7ac --- /dev/null +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -0,0 +1,86 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static org.junit.Assert.assertEquals; + +import com.google.cloud.resourcemanager.ConstraintInfo.ListConstraint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class ConstraintInfoTest { + private static final String NAME = "constraints/serviceuser.services"; + private static final String CONSTRAINT_DEFAULT = "ALLOW"; + private static final String DISPLAY_NAME = "constraints-display-name"; + private static final String DESCRIPTION = + "Detailed description of what this Constraint controls as well as how and where it is enforced"; + private static final Integer VERSION = 1; + + private static final ListConstraint LIST_CONSTRAINT = new ListConstraint("suggested-value", true); + private static final ConstraintInfo CONSTRAINT_INFO = + ConstraintInfo.newBuilder(NAME) + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setListConstraint(LIST_CONSTRAINT) + .setVersion(VERSION) + .build(); + + @Test + public void testBuilder() { + assertEquals(NAME, CONSTRAINT_INFO.getName()); + assertEquals(CONSTRAINT_DEFAULT, CONSTRAINT_INFO.getConstraintDefault()); + assertEquals(DISPLAY_NAME, CONSTRAINT_INFO.getDisplayName()); + assertEquals(DESCRIPTION, CONSTRAINT_INFO.getDescription()); + assertEquals(LIST_CONSTRAINT, CONSTRAINT_INFO.getListConstraint()); + assertEquals(VERSION, CONSTRAINT_INFO.getVersion()); + } + + @Test + public void testToBuilder() { + compareConstraints(CONSTRAINT_INFO, CONSTRAINT_INFO.toBuilder().build()); + } + + @Test + public void testToAndFromPb() { + compareConstraints(CONSTRAINT_INFO, CONSTRAINT_INFO.toBuilder().build()); + } + + @Test + public void testEquals() { + compareConstraints( + CONSTRAINT_INFO, + ConstraintInfo.newBuilder(NAME) + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setListConstraint(LIST_CONSTRAINT) + .setVersion(VERSION) + .build()); + compareConstraints(CONSTRAINT_INFO, new ConstraintInfo.BuilderImpl(CONSTRAINT_INFO).build()); + } + + private void compareConstraints(ConstraintInfo expected, ConstraintInfo value) { + assertEquals(expected.getName(), value.getName()); + assertEquals(expected.getConstraintDefault(), value.getConstraintDefault()); + assertEquals(expected.getDisplayName(), value.getDisplayName()); + assertEquals(expected.getDescription(), value.getDescription()); + assertEquals(expected.getListConstraint(), value.getListConstraint()); + assertEquals(expected.getVersion(), value.getVersion()); + } +} diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java new file mode 100644 index 00000000..a8e8373a --- /dev/null +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class OrgPolicyInfoTest { + + private static final String CONSTRAINTS_NAME = "constraints/serviceuser.services"; + private static final String ETAG = "abcd12"; + private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; + private static final Integer VERSION = 1; + private static final OrgPolicyInfo.BooleanPolicy BOOLEAN_POLICY = + new OrgPolicyInfo.BooleanPolicy(true); + private static final OrgPolicyInfo.ListPolicy LIST_POLICY = + new OrgPolicyInfo.ListPolicy( + "allvaluse", + Arrays.asList("allowedValue-1", "allowedValue-2"), + Arrays.asList("deniedValue-1", "deniedValue-2"), + true, + "suggestedValue"); + private static final OrgPolicyInfo ORG_POLICY_INFO = + OrgPolicy.newBuilder() + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS_NAME) + .setListPolicy(LIST_POLICY) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build(); + + @Test + public void testBuilder() { + assertEquals(CONSTRAINTS_NAME, ORG_POLICY_INFO.getConstraint()); + assertEquals(BOOLEAN_POLICY, ORG_POLICY_INFO.getBooleanPolicy()); + assertEquals(LIST_POLICY, ORG_POLICY_INFO.getListPolicy()); + assertEquals(UPDATE_TIME, ORG_POLICY_INFO.getUpdateTime()); + assertEquals(VERSION, ORG_POLICY_INFO.getVersion()); + } + + @Test + public void testToBuilder() { + compareLiens(ORG_POLICY_INFO, ORG_POLICY_INFO.toBuilder().build()); + } + + @Test + public void testToAndFromPb() { + assertTrue(ORG_POLICY_INFO.toPb().getUpdateTime().endsWith("Z")); + compareLiens(ORG_POLICY_INFO, ORG_POLICY_INFO.fromPb(ORG_POLICY_INFO.toPb())); + } + + @Test + public void testEquals() { + compareLiens( + ORG_POLICY_INFO, + OrgPolicyInfo.newBuilder() + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS_NAME) + .setListPolicy(LIST_POLICY) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build()); + compareLiens(ORG_POLICY_INFO, new OrgPolicyInfo.BuilderImpl(ORG_POLICY_INFO).build()); + } + + private void compareLiens(OrgPolicyInfo expected, OrgPolicyInfo value) { + assertEquals(expected.getConstraint(), value.getConstraint()); + assertEquals(expected.getBooleanPolicy(), value.getBooleanPolicy()); + assertEquals(expected.getListPolicy(), value.getListPolicy()); + assertEquals(expected.getUpdateTime(), value.getUpdateTime()); + assertEquals(expected.getVersion(), value.getVersion()); + } +} diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index 1fdb954f..4a7608c2 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -16,6 +16,7 @@ package com.google.cloud.resourcemanager; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -29,9 +30,18 @@ import static org.mockito.Mockito.when; import com.google.api.gax.paging.Page; +import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; +import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; +import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.Identity; import com.google.cloud.Policy; import com.google.cloud.Role; +import com.google.cloud.Tuple; +import com.google.cloud.resourcemanager.OrgPolicyInfo.BooleanPolicy; +import com.google.cloud.resourcemanager.OrgPolicyInfo.ListPolicy; import com.google.cloud.resourcemanager.ProjectInfo.ResourceId; import com.google.cloud.resourcemanager.ResourceManager.ProjectField; import com.google.cloud.resourcemanager.ResourceManager.ProjectGetOption; @@ -41,7 +51,9 @@ import com.google.cloud.resourcemanager.testing.LocalResourceManagerHelper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Iterables; import java.io.IOException; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -82,6 +94,29 @@ public class ResourceManagerImplTest { .addIdentity(Role.owner(), Identity.user("me@gmail.com")) .addIdentity(Role.editor(), Identity.serviceAccount("serviceaccount@gmail.com")) .build(); + private static final String CURSOR = "cursor"; + private static final String RESOURCE = "folders/my-folder"; + private static final String CONSTRAINTS = "constraints/serviceuser.services"; + private static final String ETAG = "abcd12"; + private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; + private static final Integer VERSION = 1; + private static final BooleanPolicy BOOLEAN_POLICY = new BooleanPolicy(true); + private static final ListPolicy LIST_POLICY = + new ListPolicy( + "allvaluse", + Arrays.asList("allowedValues"), + Arrays.asList("deniedValues"), + true, + "suggestedValue"); + private static final OrgPolicyInfo ORG_POLICY_INFO = + OrgPolicy.newBuilder() + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS) + .setListPolicy(LIST_POLICY) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build(); private ResourceManagerRpcFactory rpcFactoryMock = Mockito.mock(ResourceManagerRpcFactory.class); private ResourceManagerRpc resourceManagerRpcMock = Mockito.mock(ResourceManagerRpc.class); @@ -493,6 +528,72 @@ public void testTestOrgPermissions() throws IOException { verify(resourceManagerRpcMock).testOrgPermissions(organization, permissions); } + @Test + public void testClearOrgPolicy() { + try { + ClearOrgPolicyRequest requestBody = new ClearOrgPolicyRequest(); + requestBody.setConstraint(CONSTRAINTS); + requestBody.setEtag(ETAG); + RESOURCE_MANAGER.clearOrgPolicy(RESOURCE, requestBody); + fail("Should fail because the organization policy doesn't exist."); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); + } + } + + @Test + public void testGetEffectiveOrgPolicy() { + ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); + ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) + .andReturn(resourceManagerRpcMock); + EasyMock.replay(rpcFactoryMock); + ResourceManager resourceManagerMock = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + GetEffectiveOrgPolicyRequest request = new GetEffectiveOrgPolicyRequest(); + request.setConstraint(CONSTRAINTS); + EasyMock.expect(resourceManagerRpcMock.getEffectiveOrgPolicy(RESOURCE, request)) + .andReturn(ORG_POLICY_INFO.toPb()) + .times(2); + EasyMock.replay(resourceManagerRpcMock); + OrgPolicy orgPolicy = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, request); + assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); + assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); + assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); + assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); + assertEquals(VERSION, orgPolicy.getVersion()); + } + + @Test + public void testGetOrgPolicy() { + ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); + ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) + .andReturn(resourceManagerRpcMock); + EasyMock.replay(rpcFactoryMock); + ResourceManager resourceManagerMock = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + GetOrgPolicyRequest request = new GetOrgPolicyRequest(); + request.setConstraint(CONSTRAINTS); + EasyMock.expect(resourceManagerRpcMock.getOrgPolicy(RESOURCE, request)) + .andReturn(ORG_POLICY_INFO.toPb()) + .times(2); + EasyMock.replay(resourceManagerRpcMock); + OrgPolicy orgPolicy = resourceManagerMock.getOrgPolicy(RESOURCE, request); + assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); + assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); + assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); + assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); + assertEquals(VERSION, orgPolicy.getVersion()); + } + @Test public void testTestOrgPermissionsWithResourceManagerException() throws IOException { String organization = "organizations/12345"; @@ -517,4 +618,93 @@ public void testTestOrgPermissionsWithResourceManagerException() throws IOExcept assertEquals(exceptionMessage, expected.getMessage()); } } + + @Test + public void testListAvailableOrgPolicyConstraints() { + ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); + ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) + .andReturn(resourceManagerRpcMock); + EasyMock.replay(rpcFactoryMock); + ResourceManager resourceManagerMock = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + ConstraintInfo.ListConstraint LIST_CONSTRAINT = new ConstraintInfo.ListConstraint(null, true); + ImmutableList constraints = + ImmutableList.of( + new Constraint( + resourceManagerMock, + new ConstraintInfo.BuilderImpl(ConstraintInfo.newBuilder(CONSTRAINTS).build()))); + Tuple> result = + Tuple.of(CURSOR, Iterables.transform(constraints, ConstraintInfo.TO_PB_FUNCTION)); + ListAvailableOrgPolicyConstraintsRequest policyConstraintsRequest = + new ListAvailableOrgPolicyConstraintsRequest(); + policyConstraintsRequest.setPageSize(1); + policyConstraintsRequest.setPageToken("page-token"); + EasyMock.expect( + resourceManagerRpcMock.listAvailableOrgPolicyConstraints( + RESOURCE, policyConstraintsRequest)) + .andReturn(result); + EasyMock.replay(resourceManagerRpcMock); + Page page = + resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE, policyConstraintsRequest); + assertEquals(CURSOR, page.getNextPageToken()); + assertArrayEquals(constraints.toArray(), Iterables.toArray(page.getValues(), Constraint.class)); + } + + @Test + public void testListOrgPolicies() { + ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); + ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) + .andReturn(resourceManagerRpcMock); + EasyMock.replay(rpcFactoryMock); + ResourceManager resourceManagerMock = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + ImmutableList orgPolicies = + ImmutableList.of( + new OrgPolicy(resourceManagerMock, new OrgPolicyInfo.BuilderImpl(ORG_POLICY_INFO))); + Tuple> result = + Tuple.of(CURSOR, Iterables.transform(orgPolicies, OrgPolicyInfo.TO_PB_FUNCTION)); + ListOrgPoliciesRequest orgPoliciesRequest = new ListOrgPoliciesRequest(); + orgPoliciesRequest.setPageSize(1); + orgPoliciesRequest.setPageToken("page-token"); + EasyMock.expect(resourceManagerRpcMock.listOrgPolicies(RESOURCE, orgPoliciesRequest)) + .andReturn(result); + EasyMock.replay(resourceManagerRpcMock); + Page page = resourceManagerMock.listOrgPolicies(RESOURCE, orgPoliciesRequest); + assertEquals(CURSOR, page.getNextPageToken()); + assertArrayEquals(orgPolicies.toArray(), Iterables.toArray(page.getValues(), OrgPolicy.class)); + } + + @Test + public void testSetOrgPolicy() { + ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); + ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); + EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) + .andReturn(resourceManagerRpcMock); + EasyMock.replay(rpcFactoryMock); + ResourceManager resourceManagerMock = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + SetOrgPolicyRequest request = new SetOrgPolicyRequest(); + request.setPolicy(ORG_POLICY_INFO.toPb()); + EasyMock.expect(resourceManagerRpcMock.setOrgPolicy(RESOURCE, request)) + .andReturn(ORG_POLICY_INFO.toPb()) + .times(2); + EasyMock.replay(resourceManagerRpcMock); + OrgPolicy orgPolicy = resourceManagerMock.setOrgPolicy(RESOURCE, request); + assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); + assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); + assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); + assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); + assertEquals(VERSION, orgPolicy.getVersion()); + } } From 3cab7f4f372eac28ff4c662a794b21e5961a110e Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Thu, 12 Mar 2020 16:46:34 +0530 Subject: [PATCH 02/14] feat: change the position of serialVersionUID --- .../com/google/cloud/resourcemanager/ConstraintInfo.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index fca01ad8..689e6a29 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -24,6 +24,9 @@ /** A Google Cloud Resource Manager constraint metadata object. */ public class ConstraintInfo implements Serializable { + + private static final long serialVersionUID = 9148970963697734236L; + static final Function< com.google.api.services.cloudresourcemanager.model.Constraint, ConstraintInfo> FROM_PB_FUNCTION = @@ -47,8 +50,6 @@ public com.google.api.services.cloudresourcemanager.model.Constraint apply( } }; - private static final long serialVersionUID = 9148970963697734236L; - private BooleanConstraint booleanConstraint; private String constraintDefault; private String description; From 64c39c555d62cac6854cd02b22add22463bdd0b3 Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Fri, 20 Mar 2020 14:16:17 +0530 Subject: [PATCH 03/14] feat: modified code as well add system test for constraint and org policy --- .../cloud/resourcemanager/Constraint.java | 23 +-- .../cloud/resourcemanager/ConstraintInfo.java | 18 +-- .../cloud/resourcemanager/OrgPolicy.java | 23 +-- .../resourcemanager/ResourceManager.java | 8 +- .../resourcemanager/ResourceManagerImpl.java | 2 +- .../spi/v1beta1/ResourceManagerRpc.java | 8 +- .../resourcemanager/ConstraintInfoTest.java | 50 ++++-- .../cloud/resourcemanager/ConstraintTest.java | 147 +++++++++++++++++ .../resourcemanager/OrgPolicyInfoTest.java | 84 +++++++--- .../cloud/resourcemanager/OrgPolicyTest.java | 152 ++++++++++++++++++ 10 files changed, 433 insertions(+), 82 deletions(-) create mode 100644 src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java create mode 100644 src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java diff --git a/src/main/java/com/google/cloud/resourcemanager/Constraint.java b/src/main/java/com/google/cloud/resourcemanager/Constraint.java index 02340a6b..b751fb73 100644 --- a/src/main/java/com/google/cloud/resourcemanager/Constraint.java +++ b/src/main/java/com/google/cloud/resourcemanager/Constraint.java @@ -18,8 +18,6 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; -import java.io.IOException; -import java.io.ObjectInputStream; import java.util.Objects; /** @@ -28,7 +26,7 @@ *

A Constraint describes a way in which a resource's configuration can be restricted. For * example, it controls which cloud services can be activated across an organization, or whether a * Compute Engine instance can have serial port connections established. Constraints can be - * configured by the organization's policy adminstrator to fit the needs of the organzation by + * configured by the organization's policy administrator to fit the needs of the organization by * setting Policies for Constraints at different locations in the organization's resource hierarchy. * Policies are inherited down the resource hierarchy from higher levels, but can also be * overridden. For details about the inheritance rules please read about @@ -93,7 +91,7 @@ public Builder setVersion(Integer version) { } @Override - public ConstraintInfo build() { + public Constraint build() { return new Constraint(resourceManager, infoBuilder); } } @@ -116,14 +114,10 @@ public Constraint.Builder toBuilder() { @Override public final boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj == null || !obj.getClass().equals(Constraint.class)) { - return false; - } - Constraint other = (Constraint) obj; - return Objects.equals(toPb(), other.toPb()) && Objects.equals(options, other.options); + return obj == this + || obj != null + && obj.getClass().equals(Constraint.class) + && Objects.equals(toPb(), ((Constraint) obj).toPb()); } @Override @@ -131,11 +125,6 @@ public final int hashCode() { return Objects.hash(super.hashCode(), options); } - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - this.resourceManager = options.getService(); - } - static Constraint fromPb( ResourceManager resourceManager, com.google.api.services.cloudresourcemanager.model.Constraint answer) { diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index 689e6a29..15f7181f 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -18,7 +18,6 @@ import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; import com.google.common.base.Function; import com.google.common.base.MoreObjects; -import com.google.common.base.Optional; import java.io.Serializable; import java.util.Objects; @@ -66,15 +65,15 @@ public static class ListConstraint implements Serializable { private static final long serialVersionUID = -2133042982786959352L; - private final Optional suggestedValue; + private final String suggestedValue; private final Boolean supportsUnder; ListConstraint(String suggestedValue, Boolean supportsUnder) { - this.suggestedValue = Optional.fromNullable(suggestedValue); + this.suggestedValue = suggestedValue; this.supportsUnder = supportsUnder; } - public Optional getSuggestedValue() { + public String getSuggestedValue() { return suggestedValue; } @@ -105,7 +104,7 @@ public final boolean equals(Object obj) { com.google.api.services.cloudresourcemanager.model.ListConstraint toPb() { return new com.google.api.services.cloudresourcemanager.model.ListConstraint() - .setSuggestedValue(String.valueOf(Optional.fromNullable(suggestedValue))) + .setSuggestedValue(suggestedValue) .setSupportsUnder(supportsUnder); } @@ -293,16 +292,17 @@ static ConstraintInfo fromPb( builder.setBooleanConstraint(constraintPb.getBooleanConstraint()); } if (constraintPb.getConstraintDefault() != null) { - constraintPb.setConstraintDefault(constraintPb.getConstraintDefault()); + builder.setConstraintDefault(constraintPb.getConstraintDefault()); } if (constraintPb.getDescription() != null) { - constraintPb.setDescription(constraintPb.getDescription()); + builder.setDescription(constraintPb.getDescription()); } if (constraintPb.getDisplayName() != null) { - constraintPb.setDisplayName(constraintPb.getDisplayName()); + builder.setDisplayName(constraintPb.getDisplayName()); } if (constraintPb.getListConstraint() != null) { - constraintPb.setListConstraint(constraintPb.getListConstraint()); + builder.setListConstraint( + ConstraintInfo.ListConstraint.fromPb(constraintPb.getListConstraint())); } if (constraintPb.getName() != null && !constraintPb.getName().equals("Unnamed")) { builder.setName(constraintPb.getName()); diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java index 9ffbcb26..ec8a0862 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java @@ -18,14 +18,12 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.api.services.cloudresourcemanager.model.RestoreDefault; -import java.io.IOException; -import java.io.ObjectInputStream; import java.util.Objects; /** * A Google Cloud Resource Manager organization policy object. * - *

Defines a Cloud Organization Policy which is used to specify Constraints for configurations of + *

Defines a Cloud Organization Policy which is used to specify constraints for configurations of * Cloud Platform resources. */ public class OrgPolicy extends OrgPolicyInfo { @@ -88,7 +86,7 @@ public Builder setVersion(Integer version) { } @Override - public OrgPolicyInfo build() { + public OrgPolicy build() { return new OrgPolicy(resourceManager, infoBuilder); } } @@ -111,14 +109,10 @@ public Builder toBuilder() { @Override public final boolean equals(Object obj) { - if (obj == this) { - return true; - } - if (obj == null || !obj.getClass().equals(OrgPolicy.class)) { - return false; - } - OrgPolicy other = (OrgPolicy) obj; - return Objects.equals(toPb(), other.toPb()) && Objects.equals(options, other.options); + return obj == this + || obj != null + && obj.getClass().equals(OrgPolicy.class) + && Objects.equals(toPb(), ((OrgPolicy) obj).toPb()); } @Override @@ -126,11 +120,6 @@ public final int hashCode() { return Objects.hash(super.hashCode(), options); } - private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { - in.defaultReadObject(); - this.resourceManager = options.getService(); - } - static OrgPolicy fromPb( ResourceManager resourceManager, com.google.api.services.cloudresourcemanager.model.OrgPolicy answer) { diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java index 4fcc0079..06f7bf79 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java @@ -375,7 +375,7 @@ public static ProjectListOption fields(ProjectField... fields) { * Gets the effective Policy on a resource * *

This is the result of merging Policies in the resource hierarchy. The returned Policy will - * not have an etagset because it is a computed Policy across multiple resources. Subtrees of + * not have an etag set because it is a computed Policy across multiple resources. Subtrees of * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. * * @throws ResourceManagerException upon failure @@ -386,10 +386,10 @@ public static ProjectListOption fields(ProjectField... fields) { OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); /** - * Gets a Policy on a resource. + * Gets the Policy on a resource. * *

If no Policy is set on the resource, a Policy is returned with default values including - * POLICY_TYPE_NOT_SET for the policy_type oneof. The etag value can be used with + * POLICY_TYPE_NOT_SET for the policy_type one of. The etag value can be used with * projects.setOrgPolicy() to create or update a Policy during read-modify-write. * * @throws ResourceManagerException upon failure @@ -400,7 +400,7 @@ public static ProjectListOption fields(ProjectField... fields) { OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); /** - * Lists Constraints that could be applied on the specified resource. + * Lists all the Constraints that could be applied on the specified resource. * * @throws ResourceManagerException upon failure * @see listAvailableOrgPolicyConstraints( public Constraint apply( com.google.api.services.cloudresourcemanager.model.Constraint constraintPb) { - return new com.google.cloud.resourcemanager.Constraint( + return new Constraint( serviceOptions.getService(), new ConstraintInfo.BuilderImpl(ConstraintInfo.fromPb(constraintPb))); } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index 7c4aa887..5f11d99d 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -144,14 +144,14 @@ Map testOrgPermissions(String resource, List permission // TODO(ajaykannan): implement "Organization" functionality when available (issue #319) - /** Clears a Policy from a resource. */ + /** Clears the Policy from a resource. */ void clearOrgPolicy(String resource, ClearOrgPolicyRequest request); /** * Gets the effective Policy on a resource * *

This is the result of merging Policies in the resource hierarchy. The returned Policy will - * not have an etagset because it is a computed Policy across multiple resources. Subtrees of + * not have an etag set because it is a computed Policy across multiple resources. Subtrees of * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. * * @throws ResourceManagerException upon failure @@ -159,7 +159,7 @@ Map testOrgPermissions(String resource, List permission OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); /** - * Gets a Policy on a resource. + * Gets the Policy on a resource. * *

If no Policy is set on the resource, a Policy is returned with default values including * POLICY_TYPE_NOT_SET for the policy_type oneof. The etag value can be used with @@ -170,7 +170,7 @@ Map testOrgPermissions(String resource, List permission OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); /** - * Lists Constraints that could be applied on the specified resource. + * Lists all the Constraints that could be applied on the specified resource. * * @throws ResourceManagerException upon failure */ diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java index 7fb9c7ac..addc3665 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -16,8 +16,12 @@ package com.google.cloud.resourcemanager; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; import com.google.cloud.resourcemanager.ConstraintInfo.ListConstraint; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -32,14 +36,23 @@ public class ConstraintInfoTest { private static final Integer VERSION = 1; private static final ListConstraint LIST_CONSTRAINT = new ListConstraint("suggested-value", true); - private static final ConstraintInfo CONSTRAINT_INFO = - ConstraintInfo.newBuilder(NAME) - .setConstraintDefault(CONSTRAINT_DEFAULT) - .setDisplayName(DISPLAY_NAME) - .setDescription(DESCRIPTION) - .setListConstraint(LIST_CONSTRAINT) - .setVersion(VERSION) - .build(); + private static ConstraintInfo CONSTRAINT_INFO; + private static BooleanConstraint BOOLEAN_CONSTRAINT; + + @Before + public void setUp() { + BOOLEAN_CONSTRAINT = new BooleanConstraint(); + BOOLEAN_CONSTRAINT.set("boolean", Boolean.class); + CONSTRAINT_INFO = + ConstraintInfo.newBuilder(NAME) + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setListConstraint(LIST_CONSTRAINT) + .setBooleanConstraint(BOOLEAN_CONSTRAINT) + .setVersion(VERSION) + .build(); + } @Test public void testBuilder() { @@ -48,6 +61,7 @@ public void testBuilder() { assertEquals(DISPLAY_NAME, CONSTRAINT_INFO.getDisplayName()); assertEquals(DESCRIPTION, CONSTRAINT_INFO.getDescription()); assertEquals(LIST_CONSTRAINT, CONSTRAINT_INFO.getListConstraint()); + assertEquals(BOOLEAN_CONSTRAINT, CONSTRAINT_INFO.getBooleanConstraint()); assertEquals(VERSION, CONSTRAINT_INFO.getVersion()); } @@ -58,7 +72,11 @@ public void testToBuilder() { @Test public void testToAndFromPb() { - compareConstraints(CONSTRAINT_INFO, CONSTRAINT_INFO.toBuilder().build()); + compareConstraints(CONSTRAINT_INFO, ConstraintInfo.fromPb(CONSTRAINT_INFO.toPb())); + assertNotNull(ConstraintInfo.TO_PB_FUNCTION.apply(CONSTRAINT_INFO)); + assertNotNull( + ConstraintInfo.FROM_PB_FUNCTION.apply( + ConstraintInfo.TO_PB_FUNCTION.apply(CONSTRAINT_INFO))); } @Test @@ -70,12 +88,26 @@ public void testEquals() { .setDisplayName(DISPLAY_NAME) .setDescription(DESCRIPTION) .setListConstraint(LIST_CONSTRAINT) + .setBooleanConstraint(BOOLEAN_CONSTRAINT) .setVersion(VERSION) .build()); compareConstraints(CONSTRAINT_INFO, new ConstraintInfo.BuilderImpl(CONSTRAINT_INFO).build()); } + @Test + public void testToString() { + assertTrue( + LIST_CONSTRAINT + .toString() + .contains("suggestedValue=" + LIST_CONSTRAINT.getSuggestedValue())); + assertTrue( + LIST_CONSTRAINT.toString().contains("supportsUnder=" + LIST_CONSTRAINT.getSupportsUnder())); + } + private void compareConstraints(ConstraintInfo expected, ConstraintInfo value) { + assertEquals(expected, value); + assertEquals(expected.hashCode(), value.hashCode()); + assertEquals(expected.toString(), value.toString()); assertEquals(expected.getName(), value.getName()); assertEquals(expected.getConstraintDefault(), value.getConstraintDefault()); assertEquals(expected.getDisplayName(), value.getDisplayName()); diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java new file mode 100644 index 00000000..cce123c0 --- /dev/null +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java @@ -0,0 +1,147 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createStrictMock; +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 com.google.api.services.cloudresourcemanager.model.BooleanConstraint; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class ConstraintTest { + private static final String NAME = "constraints/serviceuser.services"; + private static final String CONSTRAINT_DEFAULT = "ALLOW"; + private static final String DISPLAY_NAME = "constraints-display-name"; + private static final String DESCRIPTION = + "Detailed description of what this Constraint controls as well as how and where it is enforced"; + private static final Integer VERSION = 1; + + private static final ConstraintInfo.ListConstraint LIST_CONSTRAINT = + new ConstraintInfo.ListConstraint("suggested-value", true); + private static ConstraintInfo constraintInfo; + private static BooleanConstraint booleanConstraint; + + private ResourceManager serviceMockReturnsOptions = createStrictMock(ResourceManager.class); + private ResourceManagerOptions mockOptions = createMock(ResourceManagerOptions.class); + private ResourceManager resourceManager; + private Constraint expectedConstraint; + + @Before + public void setUp() { + resourceManager = createStrictMock(ResourceManager.class); + booleanConstraint = new BooleanConstraint(); + booleanConstraint.set("booleanField", Boolean.class); + constraintInfo = + ConstraintInfo.newBuilder(NAME) + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setListConstraint(LIST_CONSTRAINT) + .setBooleanConstraint(booleanConstraint) + .setVersion(VERSION) + .build(); + } + + @After + public void tearDown() { + verify(resourceManager); + } + + private void initializeExpectedConstraint(int optionsCalls) { + expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).times(optionsCalls); + replay(serviceMockReturnsOptions); + expectedConstraint = + new Constraint(serviceMockReturnsOptions, new ConstraintInfo.BuilderImpl(constraintInfo)); + } + + @Test + public void testToBuilder() { + initializeExpectedConstraint(4); + replay(resourceManager); + compareConstraint(expectedConstraint, expectedConstraint.toBuilder().build()); + } + + @Test + public void testFromPb() { + initializeExpectedConstraint(2); + expect(resourceManager.getOptions()).andReturn(mockOptions).times(2); + replay(resourceManager); + compareConstraint( + expectedConstraint, Constraint.fromPb(resourceManager, expectedConstraint.toPb())); + } + + @Test + public void testBuilder() { + expect(resourceManager.getOptions()).andReturn(mockOptions).times(4); + replay(resourceManager); + Constraint.Builder builder = + new Constraint.Builder( + new Constraint(resourceManager, new ConstraintInfo.BuilderImpl(NAME))); + Constraint constraint = + builder + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setName(NAME) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setListConstraint(LIST_CONSTRAINT) + .setBooleanConstraint(booleanConstraint) + .setVersion(VERSION) + .build(); + assertEquals(NAME, constraint.getName()); + assertEquals(CONSTRAINT_DEFAULT, constraint.getConstraintDefault()); + assertEquals(DISPLAY_NAME, constraint.getDisplayName()); + assertEquals(DESCRIPTION, constraint.getDescription()); + assertEquals(LIST_CONSTRAINT, constraint.getListConstraint()); + assertEquals(booleanConstraint, constraint.getBooleanConstraint()); + assertEquals(VERSION, constraint.getVersion()); + assertEquals(resourceManager.getOptions(), constraint.getResourceManager().getOptions()); + } + + @Test + public void testResourceManager() { + initializeExpectedConstraint(1); + replay(resourceManager); + assertEquals(serviceMockReturnsOptions, expectedConstraint.getResourceManager()); + } + + private void compareConstraint(Constraint expected, Constraint value) { + assertEquals(expected, value); + compareConstraintInfo(expected, value); + assertEquals( + expected.getResourceManager().getOptions(), value.getResourceManager().getOptions()); + } + + private void compareConstraintInfo(ConstraintInfo expected, ConstraintInfo value) { + assertEquals(expected, value); + assertEquals(expected.hashCode(), value.hashCode()); + assertEquals(expected.toString(), value.toString()); + assertEquals(expected.getName(), value.getName()); + assertEquals(expected.getConstraintDefault(), value.getConstraintDefault()); + assertEquals(expected.getDisplayName(), value.getDisplayName()); + assertEquals(expected.getDescription(), value.getDescription()); + assertEquals(expected.getListConstraint(), value.getListConstraint()); + assertEquals(expected.getVersion(), value.getVersion()); + } +} diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index a8e8373a..13de9b20 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -16,9 +16,12 @@ package com.google.cloud.resourcemanager; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import com.google.api.services.cloudresourcemanager.model.RestoreDefault; import java.util.Arrays; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -39,56 +42,95 @@ public class OrgPolicyInfoTest { Arrays.asList("deniedValue-1", "deniedValue-2"), true, "suggestedValue"); - private static final OrgPolicyInfo ORG_POLICY_INFO = - OrgPolicy.newBuilder() - .setBooleanPolicy(BOOLEAN_POLICY) - .setConstraint(CONSTRAINTS_NAME) - .setListPolicy(LIST_POLICY) - .setEtag(ETAG) - .setUpdateTime(UPDATE_TIME) - .setVersion(VERSION) - .build(); + private static RestoreDefault restoreDefault; + private static OrgPolicyInfo orgPolicyInfo; + + @Before + public void setUp() { + restoreDefault = new RestoreDefault(); + restoreDefault.set("fields", String.class); + orgPolicyInfo = + OrgPolicy.newBuilder() + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS_NAME) + .setListPolicy(LIST_POLICY) + .setRestoreDefault(restoreDefault) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build(); + } @Test public void testBuilder() { - assertEquals(CONSTRAINTS_NAME, ORG_POLICY_INFO.getConstraint()); - assertEquals(BOOLEAN_POLICY, ORG_POLICY_INFO.getBooleanPolicy()); - assertEquals(LIST_POLICY, ORG_POLICY_INFO.getListPolicy()); - assertEquals(UPDATE_TIME, ORG_POLICY_INFO.getUpdateTime()); - assertEquals(VERSION, ORG_POLICY_INFO.getVersion()); + assertEquals(CONSTRAINTS_NAME, orgPolicyInfo.getConstraint()); + assertEquals(BOOLEAN_POLICY, orgPolicyInfo.getBooleanPolicy()); + assertEquals(LIST_POLICY, orgPolicyInfo.getListPolicy()); + assertEquals(UPDATE_TIME, orgPolicyInfo.getUpdateTime()); + assertEquals(VERSION, orgPolicyInfo.getVersion()); + assertEquals(restoreDefault, orgPolicyInfo.getRestoreDefault()); } @Test public void testToBuilder() { - compareLiens(ORG_POLICY_INFO, ORG_POLICY_INFO.toBuilder().build()); + compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.toBuilder().build()); } @Test public void testToAndFromPb() { - assertTrue(ORG_POLICY_INFO.toPb().getUpdateTime().endsWith("Z")); - compareLiens(ORG_POLICY_INFO, ORG_POLICY_INFO.fromPb(ORG_POLICY_INFO.toPb())); + assertTrue(orgPolicyInfo.toPb().getUpdateTime().endsWith("Z")); + compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.fromPb(orgPolicyInfo.toPb())); + assertNotNull(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo)); + assertNotNull( + OrgPolicyInfo.FROM_PB_FUNCTION.apply(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo))); } @Test public void testEquals() { - compareLiens( - ORG_POLICY_INFO, + compareOrgPolicy( + orgPolicyInfo, OrgPolicyInfo.newBuilder() .setBooleanPolicy(BOOLEAN_POLICY) .setConstraint(CONSTRAINTS_NAME) .setListPolicy(LIST_POLICY) + .setRestoreDefault(restoreDefault) .setEtag(ETAG) .setUpdateTime(UPDATE_TIME) .setVersion(VERSION) .build()); - compareLiens(ORG_POLICY_INFO, new OrgPolicyInfo.BuilderImpl(ORG_POLICY_INFO).build()); + compareOrgPolicy(orgPolicyInfo, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo).build()); } - private void compareLiens(OrgPolicyInfo expected, OrgPolicyInfo value) { + @Test + public void testToString() { + assertTrue(BOOLEAN_POLICY.toString().contains("enforce=" + BOOLEAN_POLICY.getEnforce())); + } + + @Test + public void testListPolicyToAndFromPb() { + compareListPolicies(LIST_POLICY, LIST_POLICY.fromPb(LIST_POLICY.toPb())); + } + + private void compareOrgPolicy(OrgPolicyInfo expected, OrgPolicyInfo value) { + assertEquals(expected, value); + assertEquals(expected.hashCode(), value.hashCode()); assertEquals(expected.getConstraint(), value.getConstraint()); assertEquals(expected.getBooleanPolicy(), value.getBooleanPolicy()); + assertEquals(expected.getBooleanPolicy().toString(), value.getBooleanPolicy().toString()); assertEquals(expected.getListPolicy(), value.getListPolicy()); + assertEquals(expected.getRestoreDefault(), value.getRestoreDefault()); assertEquals(expected.getUpdateTime(), value.getUpdateTime()); assertEquals(expected.getVersion(), value.getVersion()); } + + private void compareListPolicies( + OrgPolicyInfo.ListPolicy expected, OrgPolicyInfo.ListPolicy value) { + assertEquals(expected, value); + assertEquals(expected.hashCode(), value.hashCode()); + assertEquals(expected.toString(), value.toString()); + assertEquals(expected.getAllowedValues(), value.getAllowedValues()); + assertEquals(expected.getAllValues(), value.getAllValues()); + assertEquals(expected.getDeniedValues(), value.getDeniedValues()); + assertEquals(expected.getInheritFromParent(), value.getInheritFromParent()); + } } diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java new file mode 100644 index 00000000..7e2df3e2 --- /dev/null +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java @@ -0,0 +1,152 @@ +/* + * Copyright 2020 Google LLC + * + * 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.cloud.resourcemanager; + +import static org.easymock.EasyMock.createMock; +import static org.easymock.EasyMock.createStrictMock; +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 com.google.api.services.cloudresourcemanager.model.RestoreDefault; +import java.util.Arrays; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class OrgPolicyTest { + private static final String CONSTRAINTS_NAME = "constraints/serviceuser.services"; + private static final String ETAG = "abcd12"; + private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; + private static final Integer VERSION = 1; + private static final OrgPolicyInfo.BooleanPolicy BOOLEAN_POLICY = + new OrgPolicyInfo.BooleanPolicy(true); + private static final OrgPolicyInfo.ListPolicy LIST_POLICY = + new OrgPolicyInfo.ListPolicy( + "allvaluse", + Arrays.asList("allowedValue-1", "allowedValue-2"), + Arrays.asList("deniedValue-1", "deniedValue-2"), + true, + "suggestedValue"); + + private ResourceManager serviceMockReturnsOptions = createStrictMock(ResourceManager.class); + private ResourceManagerOptions mockOptions = createMock(ResourceManagerOptions.class); + private ResourceManager resourceManager; + private OrgPolicy expectedOrgPolicy; + private RestoreDefault restoreDefault; + private OrgPolicyInfo orgPolicyInfo; + + @Before + public void setUp() { + resourceManager = createStrictMock(ResourceManager.class); + restoreDefault = new RestoreDefault(); + restoreDefault.set("fields", String.class); + orgPolicyInfo = + OrgPolicyInfo.newBuilder() + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS_NAME) + .setListPolicy(LIST_POLICY) + .setRestoreDefault(restoreDefault) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build(); + } + + @After + public void tearDown() { + verify(resourceManager); + } + + private void initializeExpectedOrgPolicy(int optionsCalls) { + expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).times(optionsCalls); + replay(serviceMockReturnsOptions); + expectedOrgPolicy = + new OrgPolicy(serviceMockReturnsOptions, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo)); + } + + @Test + public void testToBuilder() { + initializeExpectedOrgPolicy(4); + replay(resourceManager); + compareOrgPolicy(expectedOrgPolicy, expectedOrgPolicy.toBuilder().build()); + } + + @Test + public void testFromPb() { + initializeExpectedOrgPolicy(2); + expect(resourceManager.getOptions()).andReturn(mockOptions).times(2); + replay(resourceManager); + compareOrgPolicy( + expectedOrgPolicy, OrgPolicy.fromPb(resourceManager, expectedOrgPolicy.toPb())); + } + + @Test + public void testBuilder() { + expect(resourceManager.getOptions()).andReturn(mockOptions).times(4); + replay(resourceManager); + OrgPolicy.Builder builder = + new OrgPolicy.Builder( + new OrgPolicy(resourceManager, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo))); + OrgPolicy orgPolicy = + builder + .setBooleanPolicy(BOOLEAN_POLICY) + .setConstraint(CONSTRAINTS_NAME) + .setListPolicy(LIST_POLICY) + .setRestoreDefault(restoreDefault) + .setEtag(ETAG) + .setUpdateTime(UPDATE_TIME) + .setVersion(VERSION) + .build(); + assertEquals(CONSTRAINTS_NAME, orgPolicy.getConstraint()); + assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); + assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); + assertEquals(restoreDefault, orgPolicy.getRestoreDefault()); + assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); + assertEquals(VERSION, orgPolicy.getVersion()); + assertEquals(resourceManager.getOptions(), orgPolicy.getResourceManager().getOptions()); + } + + @Test + public void testResourceManager() { + initializeExpectedOrgPolicy(1); + replay(resourceManager); + assertEquals(serviceMockReturnsOptions, expectedOrgPolicy.getResourceManager()); + } + + private void compareOrgPolicy(OrgPolicy expected, OrgPolicy value) { + assertEquals(expected, value); + compareOrgPolicyInfo(expected, value); + assertEquals( + expected.getResourceManager().getOptions(), value.getResourceManager().getOptions()); + } + + private void compareOrgPolicyInfo(OrgPolicyInfo expected, OrgPolicyInfo value) { + assertEquals(expected, value); + assertEquals(expected.hashCode(), value.hashCode()); + assertEquals(expected.getConstraint(), value.getConstraint()); + assertEquals(expected.getBooleanPolicy(), value.getBooleanPolicy()); + assertEquals(expected.getBooleanPolicy().toString(), value.getBooleanPolicy().toString()); + assertEquals(expected.getListPolicy(), value.getListPolicy()); + assertEquals(expected.getRestoreDefault(), value.getRestoreDefault()); + assertEquals(expected.getUpdateTime(), value.getUpdateTime()); + assertEquals(expected.getVersion(), value.getVersion()); + } +} From ab4b90ee20d74657cc674d48b372ca3f3adba2d3 Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Fri, 20 Mar 2020 14:50:16 +0530 Subject: [PATCH 04/14] feat: add more checks to fix code coverage --- .../spi/v1beta1/HttpResourceManagerRpc.java | 24 +--- .../ResourceManagerImplTest.java | 109 ++++++++++++++---- 2 files changed, 91 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java index 3e68d86b..30778117 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java @@ -349,13 +349,7 @@ public OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyReq try { return resourceManager.folders().getEffectiveOrgPolicy(resource, request).execute(); } catch (IOException ex) { - ResourceManagerException translated = translate(ex); - if (translated.getCode() == HTTP_FORBIDDEN) { - // Service returns permission denied if policy doesn't exist. - return null; - } else { - throw translated; - } + throw translate(ex); } } @@ -364,13 +358,7 @@ public OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request) { try { return resourceManager.folders().getOrgPolicy(resource, request).execute(); } catch (IOException ex) { - ResourceManagerException translated = translate(ex); - if (translated.getCode() == HTTP_FORBIDDEN) { - // Service returns permission denied if policy doesn't exist. - return null; - } else { - throw translated; - } + throw translate(ex); } } @@ -405,13 +393,7 @@ public OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request) { try { return resourceManager.folders().setOrgPolicy(resource, request).execute(); } catch (IOException ex) { - ResourceManagerException translated = translate(ex); - if (translated.getCode() == HTTP_FORBIDDEN) { - // Service returns permission denied if policy doesn't exist. - return null; - } else { - throw translated; - } + throw translate(ex); } } } diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index 4a7608c2..d01a1174 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -528,6 +528,31 @@ public void testTestOrgPermissions() throws IOException { verify(resourceManagerRpcMock).testOrgPermissions(organization, permissions); } + @Test + public void testTestOrgPermissionsWithResourceManagerException() throws IOException { + String organization = "organizations/12345"; + String exceptionMessage = "Not Found"; + List permissions = + ImmutableList.of( + "resourcemanager.organizations.get", "resourcemanager.organizations.getIamPolicy"); + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .testOrgPermissions(organization, permissions); + try { + resourceManager.testOrgPermissions(organization, permissions); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertEquals(exceptionMessage, expected.getMessage()); + } + } + @Test public void testClearOrgPolicy() { try { @@ -568,6 +593,19 @@ public void testGetEffectiveOrgPolicy() { assertEquals(VERSION, orgPolicy.getVersion()); } + @Test + public void testGetEffectiveOrgPolicyWithException() { + try { + GetEffectiveOrgPolicyRequest request = new GetEffectiveOrgPolicyRequest(); + request.setConstraint(CONSTRAINTS); + RESOURCE_MANAGER.getEffectiveOrgPolicy(RESOURCE, request); + fail(); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); + } + } + @Test public void testGetOrgPolicy() { ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); @@ -595,27 +633,15 @@ public void testGetOrgPolicy() { } @Test - public void testTestOrgPermissionsWithResourceManagerException() throws IOException { - String organization = "organizations/12345"; - String exceptionMessage = "Not Found"; - List permissions = - ImmutableList.of( - "resourcemanager.organizations.get", "resourcemanager.organizations.getIamPolicy"); - when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) - .thenReturn(resourceManagerRpcMock); - ResourceManager resourceManager = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerRpcMock) - .testOrgPermissions(organization, permissions); + public void testGetOrgPolicyWithException() { try { - resourceManager.testOrgPermissions(organization, permissions); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertEquals(exceptionMessage, expected.getMessage()); + GetOrgPolicyRequest request = new GetOrgPolicyRequest(); + request.setConstraint(CONSTRAINTS); + RESOURCE_MANAGER.getOrgPolicy(RESOURCE, request); + fail(); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); } } @@ -631,7 +657,6 @@ public void testListAvailableOrgPolicyConstraints() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - ConstraintInfo.ListConstraint LIST_CONSTRAINT = new ConstraintInfo.ListConstraint(null, true); ImmutableList constraints = ImmutableList.of( new Constraint( @@ -654,6 +679,21 @@ public void testListAvailableOrgPolicyConstraints() { assertArrayEquals(constraints.toArray(), Iterables.toArray(page.getValues(), Constraint.class)); } + @Test + public void listAvailableOrgPolicyConstraintsWithException() { + try { + ListAvailableOrgPolicyConstraintsRequest request = + new ListAvailableOrgPolicyConstraintsRequest(); + request.setPageSize(1); + request.setPageToken("page-token"); + RESOURCE_MANAGER.listAvailableOrgPolicyConstraints(RESOURCE, request); + fail(); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); + } + } + @Test public void testListOrgPolicies() { ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); @@ -682,6 +722,20 @@ public void testListOrgPolicies() { assertArrayEquals(orgPolicies.toArray(), Iterables.toArray(page.getValues(), OrgPolicy.class)); } + @Test + public void testListOrgPoliciesWithException() { + try { + ListOrgPoliciesRequest request = new ListOrgPoliciesRequest(); + request.setPageSize(1); + request.setPageToken("page-token"); + RESOURCE_MANAGER.listOrgPolicies(RESOURCE, request); + fail(); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); + } + } + @Test public void testSetOrgPolicy() { ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); @@ -707,4 +761,17 @@ public void testSetOrgPolicy() { assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); assertEquals(VERSION, orgPolicy.getVersion()); } + + @Test + public void testSetOrgPolicyWithException() { + try { + SetOrgPolicyRequest request = new SetOrgPolicyRequest(); + request.setPolicy(ORG_POLICY_INFO.toPb()); + RESOURCE_MANAGER.setOrgPolicy(RESOURCE, request); + fail(); + } catch (ResourceManagerException e) { + assertEquals(404, e.getCode()); + assertTrue(e.getMessage().contains("Not Found")); + } + } } From 2719c067b515443ab6a93aff5f4a7c6b3b5afbc0 Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Fri, 20 Mar 2020 18:09:58 +0530 Subject: [PATCH 05/14] feat: simplified the code as per the existing design --- clirr-ignored-differences.xml | 25 +++--- .../resourcemanager/ResourceManager.java | 46 +++++++---- .../resourcemanager/ResourceManagerImpl.java | 77 +++++++------------ .../spi/v1beta1/HttpResourceManagerRpc.java | 55 ++++++++++--- .../spi/v1beta1/ResourceManagerRpc.java | 19 ++--- .../ResourceManagerImplTest.java | 71 +++++------------ 6 files changed, 139 insertions(+), 154 deletions(-) diff --git a/clirr-ignored-differences.xml b/clirr-ignored-differences.xml index d59ef378..6bf9e2f4 100644 --- a/clirr-ignored-differences.xml +++ b/clirr-ignored-differences.xml @@ -8,32 +8,32 @@ com/google/cloud/resourcemanager/ResourceManager - void clearOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest) + void clearOrgPolicy(java.lang.String, com.google.cloud.resourcemanager.OrgPolicyInfo) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy getEffectiveOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest) + com.google.cloud.resourcemanager.OrgPolicy getEffectiveOrgPolicy(java.lang.String, java.lang.String) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy getOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest) + com.google.cloud.resourcemanager.OrgPolicy getOrgPolicy(java.lang.String, java.lang.String) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.api.gax.paging.Page listAvailableOrgPolicyConstraints(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest) + com.google.api.gax.paging.Page listAvailableOrgPolicyConstraints(java.lang.String, com.google.cloud.resourcemanager.ResourceManager$ListOption[]) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.api.gax.paging.Page listOrgPolicies(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest) + com.google.api.gax.paging.Page listOrgPolicies(java.lang.String, com.google.cloud.resourcemanager.ResourceManager$ListOption[]) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy setOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest) + com.google.cloud.resourcemanager.OrgPolicy replaceOrgPolicy(java.lang.String, com.google.cloud.resourcemanager.OrgPolicyInfo) 7012 @@ -43,33 +43,32 @@ com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - void clearOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest) + void clearOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.OrgPolicy) 7012 com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.api.services.cloudresourcemanager.model.OrgPolicy getEffectiveOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest) + com.google.api.services.cloudresourcemanager.model.OrgPolicy getEffectiveOrgPolicy(java.lang.String, java.lang.String) 7012 com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.api.services.cloudresourcemanager.model.OrgPolicy getOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest) + com.google.api.services.cloudresourcemanager.model.OrgPolicy getOrgPolicy(java.lang.String, java.lang.String) 7012 com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.cloud.Tuple listAvailableOrgPolicyConstraints(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest) + com.google.cloud.Tuple listAvailableOrgPolicyConstraints(java.lang.String, java.util.Map) 7012 - com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.cloud.Tuple listOrgPolicies(java.lang.String, com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest) + com.google.cloud.Tuple listOrgPolicies(java.lang.String, java.util.Map) 7012 com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.api.services.cloudresourcemanager.model.OrgPolicy setOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest) + com.google.api.services.cloudresourcemanager.model.OrgPolicy replaceOrgPolicy(java.lang.String, com.google.api.services.cloudresourcemanager.model.OrgPolicy) 7012 diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java index 06f7bf79..222cd00a 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java @@ -17,12 +17,6 @@ package com.google.cloud.resourcemanager; import com.google.api.gax.paging.Page; -import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; -import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; -import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.FieldSelector; import com.google.cloud.FieldSelector.Helper; import com.google.cloud.Policy; @@ -345,6 +339,33 @@ public static ProjectListOption fields(ProjectField... fields) { */ List testPermissions(String projectId, List permissions); + /** Class for specifying project list options. */ + class ListOption extends Option { + + private ListOption(ResourceManagerRpc.Option option, Object value) { + super(option, value); + } + + /** + * Returns an option to specify a page token. + * + *

The page token (returned from a previous call to list) indicates from where listing should + * continue. + */ + public static ListOption pageToken(String pageToken) { + return new ListOption(ResourceManagerRpc.Option.PAGE_TOKEN, pageToken); + } + + /** + * The maximum number of records to return per RPC. + * + *

The server can return fewer records than requested. When there are more results than the + * page size, the server will return a page token that can be used to fetch other results. + */ + public static ListOption pageSize(int pageSize) { + return new ListOption(ResourceManagerRpc.Option.PAGE_SIZE, pageSize); + } + } /** * Returns the permissions and their results representing whether the caller has the permissions * on the specified Organization. @@ -369,7 +390,7 @@ public static ProjectListOption fields(ProjectField... fields) { * "https://cloud.google.com/resource-manager/reference/rest/v1/folders/clearOrgPolicy">Resource * Manager clearOrgPolicy */ - void clearOrgPolicy(String resource, ClearOrgPolicyRequest request); + void clearOrgPolicy(String resource, OrgPolicyInfo orgPolicy); /** * Gets the effective Policy on a resource @@ -383,7 +404,7 @@ public static ProjectListOption fields(ProjectField... fields) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/getEffectiveOrgPolicy">Resource * Manager getEffectiveOrgPolicy */ - OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); + OrgPolicy getEffectiveOrgPolicy(String resource, String constraint); /** * Gets the Policy on a resource. @@ -397,7 +418,7 @@ public static ProjectListOption fields(ProjectField... fields) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/getOrgPolicy">Resource * Manager getOrgPolicy */ - OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); + OrgPolicy getOrgPolicy(String resource, String constraint); /** * Lists all the Constraints that could be applied on the specified resource. @@ -407,8 +428,7 @@ public static ProjectListOption fields(ProjectField... fields) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/listAvailableOrgPolicyConstraints">Resource * Manager listAvailableOrgPolicyConstraints */ - Page listAvailableOrgPolicyConstraints( - String resource, ListAvailableOrgPolicyConstraintsRequest request); + Page listAvailableOrgPolicyConstraints(String resource, ListOption... options); /** * Lists all the Policies set for a particular resource. @@ -418,7 +438,7 @@ Page listAvailableOrgPolicyConstraints( * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/listOrgPolicies">Resource * Manager listOrgPolicies */ - Page listOrgPolicies(String resource, ListOrgPoliciesRequest request); + Page listOrgPolicies(String resource, ListOption... options); /** * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the @@ -431,5 +451,5 @@ Page listAvailableOrgPolicyConstraints( * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/setOrgPolicy">Resource * Manager setOrgPolicy */ - OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request); + OrgPolicy replaceOrgPolicy(String resource, OrgPolicyInfo orgPolicy); } diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java index b55202d8..add5a7af 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java @@ -20,12 +20,6 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.api.gax.paging.Page; -import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; -import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; -import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.BaseService; import com.google.cloud.PageImpl; import com.google.cloud.PageImpl.NextPageFetcher; @@ -39,7 +33,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -301,13 +294,13 @@ public Map call() throws IOException { } @Override - public void clearOrgPolicy(final String resource, final ClearOrgPolicyRequest request) { + public void clearOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) { try { runWithRetries( new Callable() { @Override public Void call() { - resourceManagerRpc.clearOrgPolicy(resource, request); + resourceManagerRpc.clearOrgPolicy(resource, orgPolicy.toPb()); return null; } }, @@ -320,41 +313,40 @@ public Void call() { } @Override - public OrgPolicy getEffectiveOrgPolicy( - final String resource, final GetEffectiveOrgPolicyRequest request) { + public OrgPolicy getEffectiveOrgPolicy(final String resource, final String constraint) { try { - com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + return OrgPolicy.fromPb( + this, runWithRetries( new Callable() { @Override public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { - return resourceManagerRpc.getEffectiveOrgPolicy(resource, request); + return resourceManagerRpc.getEffectiveOrgPolicy(resource, constraint); } }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, - getOptions().getClock()); - return answer == null ? null : OrgPolicy.fromPb(this, answer); + getOptions().getClock())); } catch (RetryHelperException ex) { throw ResourceManagerException.translateAndThrow(ex); } } @Override - public OrgPolicy getOrgPolicy(final String resource, final GetOrgPolicyRequest request) { + public OrgPolicy getOrgPolicy(final String resource, final String constraint) { try { - com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + return OrgPolicy.fromPb( + this, runWithRetries( new Callable() { @Override public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { - return resourceManagerRpc.getOrgPolicy(resource, request); + return resourceManagerRpc.getOrgPolicy(resource, constraint); } }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, - getOptions().getClock()); - return answer == null ? null : OrgPolicy.fromPb(this, answer); + getOptions().getClock())); } catch (RetryHelperException ex) { throw ResourceManagerException.translateAndThrow(ex); } @@ -364,18 +356,15 @@ private static class ConstraintPageFetcher implements NextPageFetcher requestOptions; private final ResourceManagerOptions serviceOptions; ConstraintPageFetcher( String resource, - ListAvailableOrgPolicyConstraintsRequest request, ResourceManagerOptions serviceOptions, String cursor, Map optionMap) { this.resource = resource; - this.request = request; this.requestOptions = PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap); this.serviceOptions = serviceOptions; @@ -383,22 +372,18 @@ private static class ConstraintPageFetcher implements NextPageFetcher getNextPage() { - return listAvailableOrgPolicyConstraints(resource, request, serviceOptions, requestOptions); + return listAvailableOrgPolicyConstraints(resource, serviceOptions, requestOptions); } } @Override public Page listAvailableOrgPolicyConstraints( - String resource, ListAvailableOrgPolicyConstraintsRequest request) { - Map optionsMap = new HashMap<>(); - optionsMap.put(ResourceManagerRpc.Option.PAGE_TOKEN, request.getPageToken()); - optionsMap.put(ResourceManagerRpc.Option.PAGE_SIZE, request.getPageSize()); - return listAvailableOrgPolicyConstraints(resource, request, getOptions(), optionsMap); + String resource, ListOption... options) { + return listAvailableOrgPolicyConstraints(resource, getOptions(), optionMap(options)); } private static Page listAvailableOrgPolicyConstraints( final String resource, - final ListAvailableOrgPolicyConstraintsRequest request, final ResourceManagerOptions serviceOptions, final Map optionsMap) { try { @@ -417,7 +402,7 @@ private static Page listAvailableOrgPolicyConstraints( call() { return serviceOptions .getResourceManagerRpcV1Beta1() - .listAvailableOrgPolicyConstraints(resource, request); + .listAvailableOrgPolicyConstraints(resource, optionsMap); } }, serviceOptions.getRetrySettings(), @@ -441,7 +426,7 @@ public Constraint apply( } }); return new PageImpl<>( - new ConstraintPageFetcher(resource, request, serviceOptions, cursor, optionsMap), + new ConstraintPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, constraints); } catch (RetryHelperException ex) { @@ -453,18 +438,15 @@ private static class OrgPolicyPageFetcher implements NextPageFetcher private static final long serialVersionUID = 2158209410430566961L; private final String resource; - private final ListOrgPoliciesRequest request; private final Map requestOptions; private final ResourceManagerOptions serviceOptions; OrgPolicyPageFetcher( String resource, - ListOrgPoliciesRequest request, ResourceManagerOptions serviceOptions, String cursor, Map optionMap) { this.resource = resource; - this.request = request; this.requestOptions = PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap); this.serviceOptions = serviceOptions; @@ -472,22 +454,17 @@ private static class OrgPolicyPageFetcher implements NextPageFetcher @Override public Page getNextPage() { - return listOrgPolicies(resource, request, serviceOptions, requestOptions); + return listOrgPolicies(resource, serviceOptions, requestOptions); } } @Override - public Page listOrgPolicies( - final String resource, final ListOrgPoliciesRequest request) { - Map optionsMap = new HashMap<>(); - optionsMap.put(ResourceManagerRpc.Option.PAGE_TOKEN, request.getPageToken()); - optionsMap.put(ResourceManagerRpc.Option.PAGE_SIZE, request.getPageSize()); - return listOrgPolicies(resource, request, getOptions(), optionsMap); + public Page listOrgPolicies(final String resource, ListOption... options) { + return listOrgPolicies(resource, getOptions(), optionMap(options)); } private static Page listOrgPolicies( final String resource, - final ListOrgPoliciesRequest request, final ResourceManagerOptions serviceOptions, final Map optionsMap) { try { @@ -504,7 +481,7 @@ private static Page listOrgPolicies( call() { return serviceOptions .getResourceManagerRpcV1Beta1() - .listOrgPolicies(resource, request); + .listOrgPolicies(resource, optionsMap); } }, serviceOptions.getRetrySettings(), @@ -527,7 +504,7 @@ public OrgPolicy apply( } }); return new PageImpl<>( - new OrgPolicyPageFetcher(resource, request, serviceOptions, cursor, optionsMap), + new OrgPolicyPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, orgPolicies); } catch (RetryHelperException ex) { @@ -536,20 +513,20 @@ public OrgPolicy apply( } @Override - public OrgPolicy setOrgPolicy(final String resource, final SetOrgPolicyRequest request) { + public OrgPolicy replaceOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) { try { - com.google.api.services.cloudresourcemanager.model.OrgPolicy answer = + return OrgPolicy.fromPb( + this, runWithRetries( new Callable() { @Override public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { - return resourceManagerRpc.setOrgPolicy(resource, request); + return resourceManagerRpc.replaceOrgPolicy(resource, orgPolicy.toPb()); } }, getOptions().getRetrySettings(), EXCEPTION_HANDLER, - getOptions().getClock()); - return answer == null ? null : OrgPolicy.fromPb(this, answer); + getOptions().getClock())); } catch (RetryHelperException ex) { throw ResourceManagerException.translateAndThrow(ex); } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java index 30778117..9c7ac55f 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java @@ -336,27 +336,41 @@ resource, new TestIamPermissionsRequest().setPermissions(permissions)) } @Override - public void clearOrgPolicy(String resource, ClearOrgPolicyRequest request) { + public void clearOrgPolicy(String resource, OrgPolicy orgPolicy) { try { - resourceManager.folders().clearOrgPolicy(resource, request).execute(); + resourceManager + .folders() + .clearOrgPolicy( + resource, + new ClearOrgPolicyRequest() + .setConstraint(orgPolicy.getConstraint()) + .setEtag(orgPolicy.getEtag())) + .execute(); } catch (IOException ex) { throw translate(ex); } } @Override - public OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request) { + public OrgPolicy getEffectiveOrgPolicy(String resource, String constraint) { try { - return resourceManager.folders().getEffectiveOrgPolicy(resource, request).execute(); + return resourceManager + .folders() + .getEffectiveOrgPolicy( + resource, new GetEffectiveOrgPolicyRequest().setConstraint(constraint)) + .execute(); } catch (IOException ex) { throw translate(ex); } } @Override - public OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request) { + public OrgPolicy getOrgPolicy(String resource, String constraint) { try { - return resourceManager.folders().getOrgPolicy(resource, request).execute(); + return resourceManager + .folders() + .getOrgPolicy(resource, new GetOrgPolicyRequest().setConstraint(constraint)) + .execute(); } catch (IOException ex) { throw translate(ex); } @@ -364,10 +378,17 @@ public OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request) { @Override public Tuple> listAvailableOrgPolicyConstraints( - String resource, ListAvailableOrgPolicyConstraintsRequest request) { + String resource, Map options) { try { ListAvailableOrgPolicyConstraintsResponse response = - resourceManager.folders().listAvailableOrgPolicyConstraints(resource, request).execute(); + resourceManager + .folders() + .listAvailableOrgPolicyConstraints( + resource, + new ListAvailableOrgPolicyConstraintsRequest() + .setPageSize(Option.PAGE_SIZE.getInt(options)) + .setPageToken(Option.PAGE_TOKEN.getString(options))) + .execute(); return Tuple.>of( response.getNextPageToken(), response.getConstraints()); } catch (IOException ex) { @@ -377,10 +398,17 @@ public Tuple> listAvailableOrgPolicyConstraints( @Override public Tuple> listOrgPolicies( - String resource, ListOrgPoliciesRequest request) { + String resource, Map options) { try { ListOrgPoliciesResponse response = - resourceManager.folders().listOrgPolicies(resource, request).execute(); + resourceManager + .folders() + .listOrgPolicies( + resource, + new ListOrgPoliciesRequest() + .setPageSize(Option.PAGE_SIZE.getInt(options)) + .setPageToken(Option.PAGE_TOKEN.getString(options))) + .execute(); return Tuple.>of( response.getNextPageToken(), response.getPolicies()); } catch (IOException ex) { @@ -389,9 +417,12 @@ public Tuple> listOrgPolicies( } @Override - public OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request) { + public OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy) { try { - return resourceManager.folders().setOrgPolicy(resource, request).execute(); + return resourceManager + .folders() + .setOrgPolicy(resource, new SetOrgPolicyRequest().setPolicy(orgPolicy)) + .execute(); } catch (IOException ex) { throw translate(ex); } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index 5f11d99d..7fdeb8a9 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -16,16 +16,10 @@ package com.google.cloud.resourcemanager.spi.v1beta1; -import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; import com.google.api.services.cloudresourcemanager.model.Constraint; -import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; -import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.api.services.cloudresourcemanager.model.Policy; import com.google.api.services.cloudresourcemanager.model.Project; -import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.ServiceRpc; import com.google.cloud.Tuple; import com.google.cloud.resourcemanager.ResourceManagerException; @@ -145,7 +139,7 @@ Map testOrgPermissions(String resource, List permission // TODO(ajaykannan): implement "Organization" functionality when available (issue #319) /** Clears the Policy from a resource. */ - void clearOrgPolicy(String resource, ClearOrgPolicyRequest request); + void clearOrgPolicy(String resource, OrgPolicy orgPolicy); /** * Gets the effective Policy on a resource @@ -156,7 +150,7 @@ Map testOrgPermissions(String resource, List permission * * @throws ResourceManagerException upon failure */ - OrgPolicy getEffectiveOrgPolicy(String resource, GetEffectiveOrgPolicyRequest request); + OrgPolicy getEffectiveOrgPolicy(String resource, String constraint); /** * Gets the Policy on a resource. @@ -167,7 +161,7 @@ Map testOrgPermissions(String resource, List permission * * @throws ResourceManagerException upon failure */ - OrgPolicy getOrgPolicy(String resource, GetOrgPolicyRequest request); + OrgPolicy getOrgPolicy(String resource, String constraint); /** * Lists all the Constraints that could be applied on the specified resource. @@ -175,15 +169,14 @@ Map testOrgPermissions(String resource, List permission * @throws ResourceManagerException upon failure */ Tuple> listAvailableOrgPolicyConstraints( - String resource, ListAvailableOrgPolicyConstraintsRequest request); + String resource, Map options); /** * Lists all the Policies set for a particular resource. * * @throws ResourceManagerException upon failure */ - Tuple> listOrgPolicies( - String resource, ListOrgPoliciesRequest request); + Tuple> listOrgPolicies(String resource, Map options); /** * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the @@ -193,5 +186,5 @@ Tuple> listOrgPolicies( * * @throws ResourceManagerException upon failure */ - OrgPolicy setOrgPolicy(String resource, SetOrgPolicyRequest request); + OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy); } diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index d01a1174..f2657059 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -30,12 +30,7 @@ import static org.mockito.Mockito.when; import com.google.api.gax.paging.Page; -import com.google.api.services.cloudresourcemanager.model.ClearOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.GetEffectiveOrgPolicyRequest; import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; -import com.google.api.services.cloudresourcemanager.model.ListAvailableOrgPolicyConstraintsRequest; -import com.google.api.services.cloudresourcemanager.model.ListOrgPoliciesRequest; -import com.google.api.services.cloudresourcemanager.model.SetOrgPolicyRequest; import com.google.cloud.Identity; import com.google.cloud.Policy; import com.google.cloud.Role; @@ -556,10 +551,7 @@ public void testTestOrgPermissionsWithResourceManagerException() throws IOExcept @Test public void testClearOrgPolicy() { try { - ClearOrgPolicyRequest requestBody = new ClearOrgPolicyRequest(); - requestBody.setConstraint(CONSTRAINTS); - requestBody.setEtag(ETAG); - RESOURCE_MANAGER.clearOrgPolicy(RESOURCE, requestBody); + RESOURCE_MANAGER.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); fail("Should fail because the organization policy doesn't exist."); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); @@ -579,13 +571,11 @@ public void testGetEffectiveOrgPolicy() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - GetEffectiveOrgPolicyRequest request = new GetEffectiveOrgPolicyRequest(); - request.setConstraint(CONSTRAINTS); - EasyMock.expect(resourceManagerRpcMock.getEffectiveOrgPolicy(RESOURCE, request)) + EasyMock.expect(resourceManagerRpcMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS)) .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, request); + OrgPolicy orgPolicy = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); @@ -596,9 +586,7 @@ public void testGetEffectiveOrgPolicy() { @Test public void testGetEffectiveOrgPolicyWithException() { try { - GetEffectiveOrgPolicyRequest request = new GetEffectiveOrgPolicyRequest(); - request.setConstraint(CONSTRAINTS); - RESOURCE_MANAGER.getEffectiveOrgPolicy(RESOURCE, request); + RESOURCE_MANAGER.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); fail(); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); @@ -618,13 +606,11 @@ public void testGetOrgPolicy() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - GetOrgPolicyRequest request = new GetOrgPolicyRequest(); - request.setConstraint(CONSTRAINTS); - EasyMock.expect(resourceManagerRpcMock.getOrgPolicy(RESOURCE, request)) + EasyMock.expect(resourceManagerRpcMock.getOrgPolicy(RESOURCE, CONSTRAINTS)) .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.getOrgPolicy(RESOURCE, request); + OrgPolicy orgPolicy = resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); @@ -637,7 +623,7 @@ public void testGetOrgPolicyWithException() { try { GetOrgPolicyRequest request = new GetOrgPolicyRequest(); request.setConstraint(CONSTRAINTS); - RESOURCE_MANAGER.getOrgPolicy(RESOURCE, request); + RESOURCE_MANAGER.getOrgPolicy(RESOURCE, CONSTRAINTS); fail(); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); @@ -662,19 +648,12 @@ public void testListAvailableOrgPolicyConstraints() { new Constraint( resourceManagerMock, new ConstraintInfo.BuilderImpl(ConstraintInfo.newBuilder(CONSTRAINTS).build()))); - Tuple> result = - Tuple.of(CURSOR, Iterables.transform(constraints, ConstraintInfo.TO_PB_FUNCTION)); - ListAvailableOrgPolicyConstraintsRequest policyConstraintsRequest = - new ListAvailableOrgPolicyConstraintsRequest(); - policyConstraintsRequest.setPageSize(1); - policyConstraintsRequest.setPageToken("page-token"); EasyMock.expect( - resourceManagerRpcMock.listAvailableOrgPolicyConstraints( - RESOURCE, policyConstraintsRequest)) - .andReturn(result); + resourceManagerRpcMock.listAvailableOrgPolicyConstraints(RESOURCE, EMPTY_RPC_OPTIONS)) + .andReturn( + Tuple.of(CURSOR, Iterables.transform(constraints, ConstraintInfo.TO_PB_FUNCTION))); EasyMock.replay(resourceManagerRpcMock); - Page page = - resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE, policyConstraintsRequest); + Page page = resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE); assertEquals(CURSOR, page.getNextPageToken()); assertArrayEquals(constraints.toArray(), Iterables.toArray(page.getValues(), Constraint.class)); } @@ -682,11 +661,7 @@ public void testListAvailableOrgPolicyConstraints() { @Test public void listAvailableOrgPolicyConstraintsWithException() { try { - ListAvailableOrgPolicyConstraintsRequest request = - new ListAvailableOrgPolicyConstraintsRequest(); - request.setPageSize(1); - request.setPageToken("page-token"); - RESOURCE_MANAGER.listAvailableOrgPolicyConstraints(RESOURCE, request); + RESOURCE_MANAGER.listAvailableOrgPolicyConstraints(RESOURCE); fail(); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); @@ -711,13 +686,10 @@ public void testListOrgPolicies() { new OrgPolicy(resourceManagerMock, new OrgPolicyInfo.BuilderImpl(ORG_POLICY_INFO))); Tuple> result = Tuple.of(CURSOR, Iterables.transform(orgPolicies, OrgPolicyInfo.TO_PB_FUNCTION)); - ListOrgPoliciesRequest orgPoliciesRequest = new ListOrgPoliciesRequest(); - orgPoliciesRequest.setPageSize(1); - orgPoliciesRequest.setPageToken("page-token"); - EasyMock.expect(resourceManagerRpcMock.listOrgPolicies(RESOURCE, orgPoliciesRequest)) + EasyMock.expect(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) .andReturn(result); EasyMock.replay(resourceManagerRpcMock); - Page page = resourceManagerMock.listOrgPolicies(RESOURCE, orgPoliciesRequest); + Page page = resourceManagerMock.listOrgPolicies(RESOURCE); assertEquals(CURSOR, page.getNextPageToken()); assertArrayEquals(orgPolicies.toArray(), Iterables.toArray(page.getValues(), OrgPolicy.class)); } @@ -725,10 +697,7 @@ public void testListOrgPolicies() { @Test public void testListOrgPoliciesWithException() { try { - ListOrgPoliciesRequest request = new ListOrgPoliciesRequest(); - request.setPageSize(1); - request.setPageToken("page-token"); - RESOURCE_MANAGER.listOrgPolicies(RESOURCE, request); + RESOURCE_MANAGER.listOrgPolicies(RESOURCE); fail(); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); @@ -748,13 +717,11 @@ public void testSetOrgPolicy() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - SetOrgPolicyRequest request = new SetOrgPolicyRequest(); - request.setPolicy(ORG_POLICY_INFO.toPb()); - EasyMock.expect(resourceManagerRpcMock.setOrgPolicy(RESOURCE, request)) + EasyMock.expect(resourceManagerRpcMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO.toPb())) .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.setOrgPolicy(RESOURCE, request); + OrgPolicy orgPolicy = resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); @@ -765,9 +732,7 @@ public void testSetOrgPolicy() { @Test public void testSetOrgPolicyWithException() { try { - SetOrgPolicyRequest request = new SetOrgPolicyRequest(); - request.setPolicy(ORG_POLICY_INFO.toPb()); - RESOURCE_MANAGER.setOrgPolicy(RESOURCE, request); + RESOURCE_MANAGER.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); fail(); } catch (ResourceManagerException e) { assertEquals(404, e.getCode()); From e17290ebd391885953245a6ea830b0979ff642e6 Mon Sep 17 00:00:00 2001 From: athakor Date: Tue, 31 Mar 2020 17:13:12 +0530 Subject: [PATCH 06/14] feat: fix the review changes as well as simplified the code --- clirr-ignored-differences.xml | 10 +- .../cloud/resourcemanager/Constraint.java | 134 ---------- .../cloud/resourcemanager/ConstraintInfo.java | 170 ++++++------- .../cloud/resourcemanager/OrgPolicy.java | 129 ---------- .../cloud/resourcemanager/OrgPolicyInfo.java | 232 ++++++++---------- .../resourcemanager/ResourceManager.java | 14 +- .../resourcemanager/ResourceManagerImpl.java | 139 ++++------- .../spi/v1beta1/HttpResourceManagerRpc.java | 11 +- .../spi/v1beta1/ResourceManagerRpc.java | 30 ++- .../resourcemanager/ConstraintInfoTest.java | 52 ++-- .../cloud/resourcemanager/ConstraintTest.java | 147 ----------- .../resourcemanager/OrgPolicyInfoTest.java | 33 ++- .../cloud/resourcemanager/OrgPolicyTest.java | 152 ------------ .../ResourceManagerImplTest.java | 135 +++++----- 14 files changed, 381 insertions(+), 1007 deletions(-) delete mode 100644 src/main/java/com/google/cloud/resourcemanager/Constraint.java delete mode 100644 src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java delete mode 100644 src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java delete mode 100644 src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java diff --git a/clirr-ignored-differences.xml b/clirr-ignored-differences.xml index 6bf9e2f4..24266840 100644 --- a/clirr-ignored-differences.xml +++ b/clirr-ignored-differences.xml @@ -13,12 +13,12 @@ com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy getEffectiveOrgPolicy(java.lang.String, java.lang.String) + com.google.cloud.resourcemanager.OrgPolicyInfo getEffectiveOrgPolicy(java.lang.String, java.lang.String) 7012 com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy getOrgPolicy(java.lang.String, java.lang.String) + com.google.cloud.resourcemanager.OrgPolicyInfo getOrgPolicy(java.lang.String, java.lang.String) 7012 @@ -33,7 +33,7 @@ com/google/cloud/resourcemanager/ResourceManager - com.google.cloud.resourcemanager.OrgPolicy replaceOrgPolicy(java.lang.String, com.google.cloud.resourcemanager.OrgPolicyInfo) + com.google.cloud.resourcemanager.OrgPolicyInfo replaceOrgPolicy(java.lang.String, com.google.cloud.resourcemanager.OrgPolicyInfo) 7012 @@ -58,12 +58,12 @@ com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.cloud.Tuple listAvailableOrgPolicyConstraints(java.lang.String, java.util.Map) + com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc$ListResult listAvailableOrgPolicyConstraints(java.lang.String, java.util.Map) 7012 com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc - com.google.cloud.Tuple listOrgPolicies(java.lang.String, java.util.Map) + com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc$ListResult listOrgPolicies(java.lang.String, java.util.Map) 7012 diff --git a/src/main/java/com/google/cloud/resourcemanager/Constraint.java b/src/main/java/com/google/cloud/resourcemanager/Constraint.java deleted file mode 100644 index b751fb73..00000000 --- a/src/main/java/com/google/cloud/resourcemanager/Constraint.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2020 Google LLC - * - * 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.cloud.resourcemanager; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; -import java.util.Objects; - -/** - * A Google Cloud Resource Manager constraint object. - * - *

A Constraint describes a way in which a resource's configuration can be restricted. For - * example, it controls which cloud services can be activated across an organization, or whether a - * Compute Engine instance can have serial port connections established. Constraints can be - * configured by the organization's policy administrator to fit the needs of the organization by - * setting Policies for Constraints at different locations in the organization's resource hierarchy. - * Policies are inherited down the resource hierarchy from higher levels, but can also be - * overridden. For details about the inheritance rules please read about - * [Policies][google.cloud.OrgPolicy.v1.Policy]. - */ -public class Constraint extends ConstraintInfo { - private static final long serialVersionUID = 6767630161335155133L; - - private final ResourceManagerOptions options; - private transient ResourceManager resourceManager; - - /** Builder for {@code Constraint}. */ - public static class Builder extends ConstraintInfo.Builder { - private ResourceManager resourceManager; - private ConstraintInfo.BuilderImpl infoBuilder; - - Builder(Constraint constraint) { - this.resourceManager = constraint.resourceManager; - this.infoBuilder = new ConstraintInfo.BuilderImpl(constraint); - } - - @Override - public Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { - infoBuilder.setBooleanConstraint(booleanConstraint); - return this; - } - - @Override - public Builder setConstraintDefault(String constraintDefault) { - infoBuilder.setConstraintDefault(constraintDefault); - return this; - } - - @Override - public Builder setDescription(String description) { - infoBuilder.setDescription(description); - return this; - } - - @Override - public Builder setDisplayName(String displayName) { - infoBuilder.setDisplayName(displayName); - return this; - } - - @Override - public Builder setListConstraint(ListConstraint listConstraint) { - infoBuilder.setListConstraint(listConstraint); - return this; - } - - @Override - public Builder setName(String name) { - infoBuilder.setName(name); - return this; - } - - @Override - public Builder setVersion(Integer version) { - infoBuilder.setVersion(version); - return this; - } - - @Override - public Constraint build() { - return new Constraint(resourceManager, infoBuilder); - } - } - - Constraint(ResourceManager resourceManager, ConstraintInfo.BuilderImpl infoBuilder) { - super(infoBuilder); - this.resourceManager = checkNotNull(resourceManager); - this.options = resourceManager.getOptions(); - } - - /** Returns the {@link ResourceManager} service object associated with this Constraint. */ - public ResourceManager getResourceManager() { - return resourceManager; - } - - @Override - public Constraint.Builder toBuilder() { - return new Constraint.Builder(this); - } - - @Override - public final boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(Constraint.class) - && Objects.equals(toPb(), ((Constraint) obj).toPb()); - } - - @Override - public final int hashCode() { - return Objects.hash(super.hashCode(), options); - } - - static Constraint fromPb( - ResourceManager resourceManager, - com.google.api.services.cloudresourcemanager.model.Constraint answer) { - ConstraintInfo info = ConstraintInfo.fromPb(answer); - return new Constraint(resourceManager, new ConstraintInfo.BuilderImpl(info)); - } -} diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index 15f7181f..b8ae84bb 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -16,6 +16,8 @@ package com.google.cloud.resourcemanager; import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; +import com.google.api.services.cloudresourcemanager.model.Constraint; +import com.google.api.services.cloudresourcemanager.model.ListConstraint; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import java.io.Serializable; @@ -26,34 +28,26 @@ public class ConstraintInfo implements Serializable { private static final long serialVersionUID = 9148970963697734236L; - static final Function< - com.google.api.services.cloudresourcemanager.model.Constraint, ConstraintInfo> - FROM_PB_FUNCTION = - new Function< - com.google.api.services.cloudresourcemanager.model.Constraint, ConstraintInfo>() { - @Override - public ConstraintInfo apply( - com.google.api.services.cloudresourcemanager.model.Constraint pb) { - return ConstraintInfo.fromPb(pb); - } - }; - static final Function< - ConstraintInfo, com.google.api.services.cloudresourcemanager.model.Constraint> - TO_PB_FUNCTION = - new Function< - ConstraintInfo, com.google.api.services.cloudresourcemanager.model.Constraint>() { - @Override - public com.google.api.services.cloudresourcemanager.model.Constraint apply( - ConstraintInfo constraintInfo) { - return constraintInfo.toPb(); - } - }; + static final Function FROM_PB_FUNCTION = + new Function() { + @Override + public ConstraintInfo apply(Constraint pb) { + return ConstraintInfo.fromPb(pb); + } + }; + static final Function TO_PB_FUNCTION = + new Function() { + @Override + public Constraint apply(ConstraintInfo constraintInfo) { + return constraintInfo.toPb(); + } + }; private BooleanConstraint booleanConstraint; private String constraintDefault; private String description; private String displayName; - private ListConstraint listConstraint; + private Constraints constraints; private String name; private Integer version; @@ -61,14 +55,14 @@ public com.google.api.services.cloudresourcemanager.model.Constraint apply( * A Constraint that allows or disallows a list of string values, which are configured by an * Organization's policy administrator with a Policy. */ - public static class ListConstraint implements Serializable { + static class Constraints implements Serializable { private static final long serialVersionUID = -2133042982786959352L; private final String suggestedValue; private final Boolean supportsUnder; - ListConstraint(String suggestedValue, Boolean supportsUnder) { + Constraints(String suggestedValue, Boolean supportsUnder) { this.suggestedValue = suggestedValue; this.supportsUnder = supportsUnder; } @@ -91,202 +85,181 @@ public String toString() { @Override public int hashCode() { - return Objects.hash(getSuggestedValue(), getSupportsUnder()); + return Objects.hash(suggestedValue, supportsUnder); } @Override - public final boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(ListConstraint.class) - && Objects.equals(toPb(), ((ListConstraint) obj).toPb()); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Constraints that = (Constraints) o; + return Objects.equals(suggestedValue, that.suggestedValue) + && Objects.equals(supportsUnder, that.supportsUnder); } - com.google.api.services.cloudresourcemanager.model.ListConstraint toPb() { - return new com.google.api.services.cloudresourcemanager.model.ListConstraint() - .setSuggestedValue(suggestedValue) - .setSupportsUnder(supportsUnder); + ListConstraint toPb() { + return new ListConstraint().setSuggestedValue(suggestedValue).setSupportsUnder(supportsUnder); } - static ListConstraint fromPb( - com.google.api.services.cloudresourcemanager.model.ListConstraint listConstraint) { - return new ListConstraint( - listConstraint.getSuggestedValue(), listConstraint.getSupportsUnder()); + static Constraints fromPb(ListConstraint listConstraint) { + return new Constraints(listConstraint.getSuggestedValue(), listConstraint.getSupportsUnder()); } } - public abstract static class Builder { - public abstract Builder setBooleanConstraint(BooleanConstraint booleanConstraint); - - public abstract Builder setConstraintDefault(String constraintDefault); - - public abstract Builder setDescription(String description); - - public abstract Builder setDisplayName(String displayName); - - public abstract Builder setListConstraint(ListConstraint listConstraint); - - public abstract Builder setName(String name); - - public abstract Builder setVersion(Integer version); - - public abstract ConstraintInfo build(); - } - - static class BuilderImpl extends Builder { + /** Builder for {@code ConstraintInfo}. */ + static class Builder { private BooleanConstraint booleanConstraint; private String constraintDefault; private String description; private String displayName; - private ListConstraint listConstraint; + private Constraints constraints; private String name; private Integer version; - BuilderImpl(String name) { + Builder(String name) { this.name = name; } - BuilderImpl(ConstraintInfo info) { + Builder(ConstraintInfo info) { this.booleanConstraint = info.booleanConstraint; this.constraintDefault = info.constraintDefault; this.description = info.description; this.displayName = info.displayName; - this.listConstraint = info.listConstraint; + this.constraints = info.constraints; this.name = info.name; this.version = info.version; } - @Override public Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { this.booleanConstraint = booleanConstraint; return this; } - @Override public Builder setConstraintDefault(String constraintDefault) { this.constraintDefault = constraintDefault; return this; } - @Override public Builder setDescription(String description) { this.description = description; return this; } - @Override public Builder setDisplayName(String displayName) { this.displayName = displayName; return this; } - @Override - public Builder setListConstraint(ListConstraint listConstraint) { - this.listConstraint = listConstraint; + public Builder setConstraints(Constraints constraints) { + this.constraints = constraints; return this; } - @Override public Builder setName(String name) { this.name = name; return this; } - @Override public Builder setVersion(Integer version) { this.version = version; return this; } - @Override public ConstraintInfo build() { return new ConstraintInfo(this); } } - ConstraintInfo(BuilderImpl builder) { + ConstraintInfo(Builder builder) { this.booleanConstraint = builder.booleanConstraint; this.constraintDefault = builder.constraintDefault; this.description = builder.description; this.displayName = builder.displayName; - this.listConstraint = builder.listConstraint; + this.constraints = builder.constraints; this.name = builder.name; this.version = builder.version; } + /** Returns the boolean constraint to check whether the constraint is enforced or not. */ public BooleanConstraint getBooleanConstraint() { return booleanConstraint; } + /** Returns the default behavior of the constraint. */ public String getConstraintDefault() { return constraintDefault; } + /** Returns the detailed description of the constraint. */ public String getDescription() { return description; } + /** Returns the human readable name of the constraint. */ public String getDisplayName() { return displayName; } - public ListConstraint getListConstraint() { - return listConstraint; + /** Returns the listConstraintInfo. */ + public Constraints getConstraints() { + return constraints; } + /** Returns the globally unique name of the constraint. */ public String getName() { return name; } + /** Returns the version of the Constraint. Default version is 0. */ public Integer getVersion() { return version; } @Override - public boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(ConstraintInfo.class) - && Objects.equals(toPb(), ((ConstraintInfo) obj).toPb()); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ConstraintInfo that = (ConstraintInfo) o; + return Objects.equals(booleanConstraint, that.booleanConstraint) + && Objects.equals(constraintDefault, that.constraintDefault) + && Objects.equals(description, that.description) + && Objects.equals(displayName, that.displayName) + && Objects.equals(constraints, that.constraints) + && Objects.equals(name, that.name) + && Objects.equals(version, that.version); } @Override public int hashCode() { return Objects.hash( - booleanConstraint, - constraintDefault, - description, - displayName, - listConstraint, - name, - version); + booleanConstraint, constraintDefault, description, displayName, constraints, name, version); } + /** Returns a builder for the {@link ConstraintInfo} object. */ public static Builder newBuilder(String name) { - return new BuilderImpl(name); + return new Builder(name); } + /** Returns a builder for the {@link ConstraintInfo} object. */ public Builder toBuilder() { - return new BuilderImpl(this); + return new Builder(this); } - com.google.api.services.cloudresourcemanager.model.Constraint toPb() { - com.google.api.services.cloudresourcemanager.model.Constraint constraintPb = - new com.google.api.services.cloudresourcemanager.model.Constraint(); + Constraint toPb() { + Constraint constraintPb = new Constraint(); constraintPb.setBooleanConstraint(booleanConstraint); constraintPb.setConstraintDefault(constraintDefault); constraintPb.setDescription(description); constraintPb.setDisplayName(displayName); - if (listConstraint != null) { - constraintPb.setListConstraint(listConstraint.toPb()); + if (constraints != null) { + constraintPb.setListConstraint(constraints.toPb()); } constraintPb.setName(name); constraintPb.setVersion(version); return constraintPb; } - static ConstraintInfo fromPb( - com.google.api.services.cloudresourcemanager.model.Constraint constraintPb) { + static ConstraintInfo fromPb(Constraint constraintPb) { Builder builder = newBuilder(constraintPb.getName()); if (constraintPb.getBooleanConstraint() != null) { builder.setBooleanConstraint(constraintPb.getBooleanConstraint()); @@ -301,8 +274,7 @@ static ConstraintInfo fromPb( builder.setDisplayName(constraintPb.getDisplayName()); } if (constraintPb.getListConstraint() != null) { - builder.setListConstraint( - ConstraintInfo.ListConstraint.fromPb(constraintPb.getListConstraint())); + builder.setConstraints(Constraints.fromPb(constraintPb.getListConstraint())); } if (constraintPb.getName() != null && !constraintPb.getName().equals("Unnamed")) { builder.setName(constraintPb.getName()); diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java deleted file mode 100644 index ec8a0862..00000000 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicy.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright 2020 Google LLC - * - * 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.cloud.resourcemanager; - -import static com.google.common.base.Preconditions.checkNotNull; - -import com.google.api.services.cloudresourcemanager.model.RestoreDefault; -import java.util.Objects; - -/** - * A Google Cloud Resource Manager organization policy object. - * - *

Defines a Cloud Organization Policy which is used to specify constraints for configurations of - * Cloud Platform resources. - */ -public class OrgPolicy extends OrgPolicyInfo { - - private static final long serialVersionUID = 6767630161335155133L; - - private final ResourceManagerOptions options; - private transient ResourceManager resourceManager; - - /** Builder for {@code OrgPolicy}. */ - public static class Builder extends OrgPolicyInfo.Builder { - private final ResourceManager resourceManager; - private final OrgPolicyInfo.BuilderImpl infoBuilder; - - Builder(OrgPolicy orgPolicy) { - this.resourceManager = orgPolicy.resourceManager; - this.infoBuilder = new OrgPolicyInfo.BuilderImpl(orgPolicy); - } - - @Override - public Builder setBooleanPolicy(BooleanPolicy booleanPolicy) { - infoBuilder.setBooleanPolicy(booleanPolicy); - return this; - } - - @Override - public Builder setConstraint(String constraint) { - infoBuilder.setConstraint(constraint); - return this; - } - - @Override - public Builder setEtag(String etag) { - infoBuilder.setEtag(etag); - return this; - } - - @Override - public Builder setListPolicy(ListPolicy listPolicy) { - infoBuilder.setListPolicy(listPolicy); - return this; - } - - @Override - public Builder setRestoreDefault(RestoreDefault restoreDefault) { - infoBuilder.setRestoreDefault(restoreDefault); - return this; - } - - @Override - public Builder setUpdateTime(String updateTime) { - infoBuilder.setUpdateTime(updateTime); - return this; - } - - @Override - public Builder setVersion(Integer version) { - infoBuilder.setVersion(version); - return this; - } - - @Override - public OrgPolicy build() { - return new OrgPolicy(resourceManager, infoBuilder); - } - } - - OrgPolicy(ResourceManager resourceManager, OrgPolicyInfo.BuilderImpl infoBuilder) { - super(infoBuilder); - this.resourceManager = checkNotNull(resourceManager); - this.options = resourceManager.getOptions(); - } - - /** Returns the {@link ResourceManager} service object associated with this OrgPolicy. */ - public ResourceManager getResourceManager() { - return resourceManager; - } - - @Override - public Builder toBuilder() { - return new OrgPolicy.Builder(this); - } - - @Override - public final boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(OrgPolicy.class) - && Objects.equals(toPb(), ((OrgPolicy) obj).toPb()); - } - - @Override - public final int hashCode() { - return Objects.hash(super.hashCode(), options); - } - - static OrgPolicy fromPb( - ResourceManager resourceManager, - com.google.api.services.cloudresourcemanager.model.OrgPolicy answer) { - OrgPolicyInfo info = OrgPolicyInfo.fromPb(answer); - return new OrgPolicy(resourceManager, new OrgPolicyInfo.BuilderImpl(info)); - } -} diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 721fcc08..68211609 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -15,6 +15,8 @@ */ package com.google.cloud.resourcemanager; +import com.google.api.services.cloudresourcemanager.model.BooleanPolicy; +import com.google.api.services.cloudresourcemanager.model.ListPolicy; import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.api.services.cloudresourcemanager.model.RestoreDefault; import com.google.common.base.Function; @@ -25,40 +27,39 @@ /** A Google Cloud Resource Manager organization policy metadata object. */ public class OrgPolicyInfo implements Serializable { + + private static final long serialVersionUID = 9148970963697734236L; + static final Function FROM_PB_FUNCTION = - new Function() { + new Function() { @Override - public OrgPolicyInfo apply( - com.google.api.services.cloudresourcemanager.model.OrgPolicy pb) { + public OrgPolicyInfo apply(OrgPolicy pb) { return OrgPolicyInfo.fromPb(pb); } }; - static final Function - TO_PB_FUNCTION = - new Function< - OrgPolicyInfo, com.google.api.services.cloudresourcemanager.model.OrgPolicy>() { - @Override - public com.google.api.services.cloudresourcemanager.model.OrgPolicy apply( - OrgPolicyInfo orgPolicyInfo) { - return orgPolicyInfo.toPb(); - } - }; - private static final long serialVersionUID = 9148970963697734236L; + static final Function TO_PB_FUNCTION = + new Function() { + @Override + public OrgPolicy apply(OrgPolicyInfo orgPolicyInfo) { + return orgPolicyInfo.toPb(); + } + }; - private BooleanPolicy booleanPolicy; + private BoolPolicy boolPolicy; private String constraint; private String etag; - private ListPolicy listPolicy; + private Policies policies; private RestoreDefault restoreDefault; private String updateTime; private Integer version; /** Used in policy_type to specify how booleanPolicy will behave at this resource. */ - public static class BooleanPolicy implements Serializable { + static class BoolPolicy implements Serializable { + private static final long serialVersionUID = -2133042982786959351L; private final Boolean enforce; - BooleanPolicy(Boolean enforce) { + BoolPolicy(Boolean enforce) { this.enforce = enforce; } @@ -72,46 +73,45 @@ public String toString() { } @Override - public int hashCode() { - return Objects.hash(getEnforce()); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BoolPolicy that = (BoolPolicy) o; + return Objects.equals(enforce, that.enforce); } @Override - public final boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(BooleanPolicy.class) - && Objects.equals(toPb(), ((BooleanPolicy) obj).toPb()); + public int hashCode() { + return Objects.hash(enforce); } - com.google.api.services.cloudresourcemanager.model.BooleanPolicy toPb() { - return new com.google.api.services.cloudresourcemanager.model.BooleanPolicy() - .setEnforced(enforce); + BooleanPolicy toPb() { + return new BooleanPolicy().setEnforced(enforce); } - static BooleanPolicy fromPb( - com.google.api.services.cloudresourcemanager.model.BooleanPolicy booleanPolicy) { - return new BooleanPolicy(booleanPolicy.getEnforced()); + static BoolPolicy fromPb(BooleanPolicy booleanPolicy) { + return new BoolPolicy(booleanPolicy.getEnforced()); } } /** - * Used in policy_type to specify how listPolicy behaves at this resource. + * The organization ListPolicy object. * *

ListPolicy can define specific values and subtrees of Cloud Resource Manager resource * hierarchy (Organizations, Folders, Projects) that are allowed or denied by setting the * allowedValues and deniedValues fields. This is achieved by using the under: and optional is: - * prefixes. The under: prefix is used to denote resource subtree values. The is: prefix is used - * to denote specific values, and is required only if the value contains a ":". Values prefixed - * with "is:" are treated the same as values with no prefix. Ancestry subtrees must be in one of - * the following formats: - "projects/", e.g. "projects/tokyo-rain-123" - "folders/", e.g. + * prefixes. The under: prefix denotes resource subtree values. The is: prefix is used to denote + * specific values, and is required only if the value contains a ":". Values prefixed with "is:" + * are treated the same as values with no prefix. Ancestry subtrees must be in one of the + * following formats: - "projects/", e.g. "projects/tokyo-rain-123" - "folders/", e.g. * "folders/1234" - "organizations/", e.g. "organizations/1234" The supportsUnder field of the * associated Constraint defines whether ancestry prefixes can be used. You can set allowedValues * and deniedValues in the same Policy if allValues is ALL_VALUES_UNSPECIFIED. ALLOW or DENY are * used to allow or deny all values. If allValues is set to either ALLOW or DENY, allowedValues * and deniedValues must be unset. */ - public static class ListPolicy implements Serializable { + static class Policies implements Serializable { + private static final long serialVersionUID = -2133042982786959352L; private final String allValues; @@ -120,7 +120,7 @@ public static class ListPolicy implements Serializable { private final Boolean inheritFromParent; private final String suggestedValue; - public ListPolicy( + public Policies( String allValues, List allowedValues, List deniedValues, @@ -133,22 +133,27 @@ public ListPolicy( this.suggestedValue = suggestedValue; } + /** Returns all the Values state of this policy. */ public String getAllValues() { return allValues; } + /** Returns the list of allowed values of this resource */ public List getAllowedValues() { return allowedValues; } + /** Returns the list of denied values of this resource. */ public List getDeniedValues() { return deniedValues; } + /** Returns the inheritance behavior for this Policy */ public Boolean getInheritFromParent() { return inheritFromParent; } + /** Returns the suggested value of this policy. */ public String getSuggestedValue() { return suggestedValue; } @@ -165,21 +170,25 @@ public String toString() { } @Override - public final boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(ListPolicy.class) - && Objects.equals(toPb(), ((ListPolicy) obj).toPb()); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Policies policies = (Policies) o; + return Objects.equals(allValues, policies.allValues) + && Objects.equals(allowedValues, policies.allowedValues) + && Objects.equals(deniedValues, policies.deniedValues) + && Objects.equals(inheritFromParent, policies.inheritFromParent) + && Objects.equals(suggestedValue, policies.suggestedValue); } @Override public int hashCode() { return Objects.hash( - allowedValues, allowedValues, deniedValues, inheritFromParent, suggestedValue); + allValues, allowedValues, deniedValues, inheritFromParent, suggestedValue); } - com.google.api.services.cloudresourcemanager.model.ListPolicy toPb() { - return new com.google.api.services.cloudresourcemanager.model.ListPolicy() + ListPolicy toPb() { + return new ListPolicy() .setAllValues(allValues) .setAllowedValues(allowedValues) .setDeniedValues(deniedValues) @@ -187,9 +196,8 @@ com.google.api.services.cloudresourcemanager.model.ListPolicy toPb() { .setSuggestedValue(suggestedValue); } - static ListPolicy fromPb( - com.google.api.services.cloudresourcemanager.model.ListPolicy listPolicy) { - return new ListPolicy( + static Policies fromPb(ListPolicy listPolicy) { + return new Policies( listPolicy.getAllValues(), listPolicy.getAllowedValues(), listPolicy.getDeniedValues(), @@ -198,168 +206,145 @@ static ListPolicy fromPb( } } - public abstract static class Builder { - public abstract Builder setBooleanPolicy(BooleanPolicy booleanPolicy); - - public abstract Builder setConstraint(String constraint); - - public abstract Builder setEtag(String etag); - - public abstract Builder setListPolicy(ListPolicy listPolicy); - - public abstract Builder setRestoreDefault(RestoreDefault restoreDefault); - - public abstract Builder setUpdateTime(String updateTime); - - public abstract Builder setVersion(Integer version); - - public abstract OrgPolicyInfo build(); - } - - static class BuilderImpl extends Builder { - private BooleanPolicy booleanPolicy; + /** Builder for {@code OrganizationPolicyInfo}. */ + static class Builder { + private BoolPolicy boolPolicy; private String constraint; private String etag; - private ListPolicy listPolicy; + private Policies policies; private RestoreDefault restoreDefault; private String updateTime; private Integer version; - BuilderImpl() {} + Builder() {} - BuilderImpl(OrgPolicyInfo info) { - this.booleanPolicy = info.booleanPolicy; + Builder(OrgPolicyInfo info) { + this.boolPolicy = info.boolPolicy; this.constraint = info.constraint; this.etag = info.etag; - this.listPolicy = info.listPolicy; + this.policies = info.policies; this.restoreDefault = info.restoreDefault; this.updateTime = info.updateTime; this.version = info.version; } - @Override - public Builder setBooleanPolicy(BooleanPolicy booleanPolicy) { - this.booleanPolicy = booleanPolicy; + public Builder setBoolPolicy(BoolPolicy boolPolicy) { + this.boolPolicy = boolPolicy; return this; } - @Override public Builder setConstraint(String constraint) { this.constraint = constraint; return this; } - @Override public Builder setEtag(String etag) { this.etag = etag; return this; } - @Override - public Builder setListPolicy(ListPolicy listPolicy) { - this.listPolicy = listPolicy; + public Builder setListPolicy(Policies policies) { + this.policies = policies; return this; } - @Override public Builder setRestoreDefault(RestoreDefault restoreDefault) { this.restoreDefault = restoreDefault; return this; } - @Override public Builder setUpdateTime(String updateTime) { this.updateTime = updateTime; return this; } - @Override public Builder setVersion(Integer version) { this.version = version; return this; } - @Override public OrgPolicyInfo build() { return new OrgPolicyInfo(this); } } - OrgPolicyInfo(BuilderImpl builder) { - this.booleanPolicy = builder.booleanPolicy; + OrgPolicyInfo(Builder builder) { + this.boolPolicy = builder.boolPolicy; this.constraint = builder.constraint; this.etag = builder.etag; - this.listPolicy = builder.listPolicy; + this.policies = builder.policies; this.restoreDefault = builder.restoreDefault; this.updateTime = builder.updateTime; this.version = builder.version; } - public BooleanPolicy getBooleanPolicy() { - return booleanPolicy; + /** Returns the boolean constraint to check whether the constraint is enforced or not. */ + public BoolPolicy getBoolPolicy() { + return boolPolicy; } - + /** Returns the name of the Constraint. */ public String getConstraint() { return constraint; } - + /** */ public String getEtag() { return etag; } - - public ListPolicy getListPolicy() { - return listPolicy; + /** Return the policies. */ + public Policies getPolicies() { + return policies; } - + /** Restores the default behavior of the constraint. */ public RestoreDefault getRestoreDefault() { return restoreDefault; } - + /** Returns the updated timestamp of policy. */ public String getUpdateTime() { return updateTime; } - + /** Returns the version of the Policy, Default version is 0. */ public Integer getVersion() { return version; } @Override - public boolean equals(Object obj) { - return obj == this - || obj != null - && obj.getClass().equals(OrgPolicyInfo.class) - && Objects.equals(toPb(), ((OrgPolicyInfo) obj).toPb()); + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + OrgPolicyInfo that = (OrgPolicyInfo) o; + return Objects.equals(boolPolicy, that.boolPolicy) + && Objects.equals(constraint, that.constraint) + && Objects.equals(etag, that.etag) + && Objects.equals(policies, that.policies) + && Objects.equals(restoreDefault, that.restoreDefault) + && Objects.equals(updateTime, that.updateTime) + && Objects.equals(version, that.version); } @Override public int hashCode() { return Objects.hash( - getBooleanPolicy(), - getConstraint(), - getEtag(), - getListPolicy(), - getRestoreDefault(), - getUpdateTime(), - getVersion()); + boolPolicy, constraint, etag, policies, restoreDefault, updateTime, version); } + /** Returns a builder for the {@link OrgPolicyInfo} object. */ public static Builder newBuilder() { - return new BuilderImpl(); + return new Builder(); } + /** Returns a builder for the {@link OrgPolicyInfo} object. */ public Builder toBuilder() { - return new BuilderImpl(this); + return new Builder(this); } - com.google.api.services.cloudresourcemanager.model.OrgPolicy toPb() { - com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb = - new com.google.api.services.cloudresourcemanager.model.OrgPolicy(); - if (booleanPolicy != null) { - orgPolicyPb.setBooleanPolicy(booleanPolicy.toPb()); + OrgPolicy toPb() { + OrgPolicy orgPolicyPb = new OrgPolicy(); + if (boolPolicy != null) { + orgPolicyPb.setBooleanPolicy(boolPolicy.toPb()); } orgPolicyPb.setConstraint(constraint); - if (listPolicy != null) { - orgPolicyPb.setListPolicy(listPolicy.toPb()); + if (policies != null) { + orgPolicyPb.setListPolicy(policies.toPb()); } orgPolicyPb.setRestoreDefault(restoreDefault); orgPolicyPb.setEtag(etag); @@ -368,17 +353,16 @@ com.google.api.services.cloudresourcemanager.model.OrgPolicy toPb() { return orgPolicyPb; } - static OrgPolicyInfo fromPb( - com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb) { + static OrgPolicyInfo fromPb(OrgPolicy orgPolicyPb) { Builder builder = newBuilder(); if (orgPolicyPb.getBooleanPolicy() != null) { - builder.setBooleanPolicy(BooleanPolicy.fromPb(orgPolicyPb.getBooleanPolicy())); + builder.setBoolPolicy(BoolPolicy.fromPb(orgPolicyPb.getBooleanPolicy())); } if (orgPolicyPb.getConstraint() != null) { builder.setConstraint(orgPolicyPb.getConstraint()); } if (orgPolicyPb.getListPolicy() != null) { - builder.setListPolicy(ListPolicy.fromPb(orgPolicyPb.getListPolicy())); + builder.setListPolicy(Policies.fromPb(orgPolicyPb.getListPolicy())); } if (orgPolicyPb.getRestoreDefault() != null) { builder.setRestoreDefault(orgPolicyPb.getRestoreDefault()); diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java index 222cd00a..57d49b6a 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java @@ -393,18 +393,18 @@ public static ListOption pageSize(int pageSize) { void clearOrgPolicy(String resource, OrgPolicyInfo orgPolicy); /** - * Gets the effective Policy on a resource + * Gets the effective Policy on a resource. * *

This is the result of merging Policies in the resource hierarchy. The returned Policy will * not have an etag set because it is a computed Policy across multiple resources. Subtrees of - * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. + * Resource Manager resource hierarchy with 'under:' prefix are not expanded. * * @throws ResourceManagerException upon failure * @see Resource * Manager getEffectiveOrgPolicy */ - OrgPolicy getEffectiveOrgPolicy(String resource, String constraint); + OrgPolicyInfo getEffectiveOrgPolicy(String resource, String constraint); /** * Gets the Policy on a resource. @@ -418,7 +418,7 @@ public static ListOption pageSize(int pageSize) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/getOrgPolicy">Resource * Manager getOrgPolicy */ - OrgPolicy getOrgPolicy(String resource, String constraint); + OrgPolicyInfo getOrgPolicy(String resource, String constraint); /** * Lists all the Constraints that could be applied on the specified resource. @@ -428,7 +428,7 @@ public static ListOption pageSize(int pageSize) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/listAvailableOrgPolicyConstraints">Resource * Manager listAvailableOrgPolicyConstraints */ - Page listAvailableOrgPolicyConstraints(String resource, ListOption... options); + Page listAvailableOrgPolicyConstraints(String resource, ListOption... options); /** * Lists all the Policies set for a particular resource. @@ -438,7 +438,7 @@ public static ListOption pageSize(int pageSize) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/listOrgPolicies">Resource * Manager listOrgPolicies */ - Page listOrgPolicies(String resource, ListOption... options); + Page listOrgPolicies(String resource, ListOption... options); /** * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the @@ -451,5 +451,5 @@ public static ListOption pageSize(int pageSize) { * href="https://cloud.google.com/resource-manager/reference/rest/v1/folders/setOrgPolicy">Resource * Manager setOrgPolicy */ - OrgPolicy replaceOrgPolicy(String resource, OrgPolicyInfo orgPolicy); + OrgPolicyInfo replaceOrgPolicy(String resource, OrgPolicyInfo orgPolicy); } diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java index add5a7af..aee5e31d 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java @@ -20,6 +20,8 @@ import static com.google.common.base.Preconditions.checkArgument; import com.google.api.gax.paging.Page; +import com.google.api.services.cloudresourcemanager.model.Constraint; +import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.cloud.BaseService; import com.google.cloud.PageImpl; import com.google.cloud.PageImpl.NextPageFetcher; @@ -27,6 +29,7 @@ import com.google.cloud.RetryHelper.RetryHelperException; import com.google.cloud.Tuple; import com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc; +import com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc.ListResult; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -313,14 +316,13 @@ public Void call() { } @Override - public OrgPolicy getEffectiveOrgPolicy(final String resource, final String constraint) { + public OrgPolicyInfo getEffectiveOrgPolicy(final String resource, final String constraint) { try { - return OrgPolicy.fromPb( - this, + return OrgPolicyInfo.fromPb( runWithRetries( - new Callable() { + new Callable() { @Override - public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + public OrgPolicy call() { return resourceManagerRpc.getEffectiveOrgPolicy(resource, constraint); } }, @@ -333,14 +335,13 @@ public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { } @Override - public OrgPolicy getOrgPolicy(final String resource, final String constraint) { + public OrgPolicyInfo getOrgPolicy(final String resource, final String constraint) { try { - return OrgPolicy.fromPb( - this, + return OrgPolicyInfo.fromPb( runWithRetries( - new Callable() { + new Callable() { @Override - public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + public OrgPolicy call() { return resourceManagerRpc.getOrgPolicy(resource, constraint); } }, @@ -352,7 +353,7 @@ public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { } } - private static class ConstraintPageFetcher implements NextPageFetcher { + private static class ConstraintPageFetcher implements NextPageFetcher { private static final long serialVersionUID = 2158209410430566961L; private final String resource; @@ -371,60 +372,39 @@ private static class ConstraintPageFetcher implements NextPageFetcher getNextPage() { + public Page getNextPage() { return listAvailableOrgPolicyConstraints(resource, serviceOptions, requestOptions); } } @Override - public Page listAvailableOrgPolicyConstraints( + public Page listAvailableOrgPolicyConstraints( String resource, ListOption... options) { return listAvailableOrgPolicyConstraints(resource, getOptions(), optionMap(options)); } - private static Page listAvailableOrgPolicyConstraints( + private static Page listAvailableOrgPolicyConstraints( final String resource, final ResourceManagerOptions serviceOptions, final Map optionsMap) { try { - Tuple> - result = - runWithRetries( - new Callable< - Tuple< - String, - Iterable< - com.google.api.services.cloudresourcemanager.model.Constraint>>>() { - @Override - public Tuple< - String, - Iterable> - call() { - return serviceOptions - .getResourceManagerRpcV1Beta1() - .listAvailableOrgPolicyConstraints(resource, optionsMap); - } - }, - serviceOptions.getRetrySettings(), - EXCEPTION_HANDLER, - serviceOptions.getClock()); - String cursor = result.x(); - Iterable constraints = - result.y() == null - ? ImmutableList.of() - : Iterables.transform( - result.y(), - new Function< - com.google.api.services.cloudresourcemanager.model.Constraint, Constraint>() { - @Override - public Constraint apply( - com.google.api.services.cloudresourcemanager.model.Constraint - constraintPb) { - return new Constraint( - serviceOptions.getService(), - new ConstraintInfo.BuilderImpl(ConstraintInfo.fromPb(constraintPb))); - } - }); + final ResourceManagerRpc rpc = serviceOptions.getResourceManagerRpcV1Beta1(); + ListResult constraintList = + runWithRetries( + new Callable>() { + @Override + public ListResult call() { + return rpc.listAvailableOrgPolicyConstraints(resource, optionsMap); + } + }, + serviceOptions.getRetrySettings(), + EXCEPTION_HANDLER, + serviceOptions.getClock()); + String cursor = constraintList.pageToken(); + Iterable constraints = + constraintList.results() == null + ? ImmutableList.of() + : Iterables.transform(constraintList.results(), ConstraintInfo.FROM_PB_FUNCTION); return new PageImpl<>( new ConstraintPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, @@ -434,7 +414,7 @@ public Constraint apply( } } - private static class OrgPolicyPageFetcher implements NextPageFetcher { + private static class OrgPolicyPageFetcher implements NextPageFetcher { private static final long serialVersionUID = 2158209410430566961L; private final String resource; @@ -453,56 +433,38 @@ private static class OrgPolicyPageFetcher implements NextPageFetcher } @Override - public Page getNextPage() { + public Page getNextPage() { return listOrgPolicies(resource, serviceOptions, requestOptions); } } @Override - public Page listOrgPolicies(final String resource, ListOption... options) { + public Page listOrgPolicies(final String resource, ListOption... options) { return listOrgPolicies(resource, getOptions(), optionMap(options)); } - private static Page listOrgPolicies( + private static PageImpl listOrgPolicies( final String resource, final ResourceManagerOptions serviceOptions, final Map optionsMap) { try { - Tuple> result = + final ResourceManagerRpc rpc = serviceOptions.getResourceManagerRpcV1Beta1(); + ListResult orgPolicy = runWithRetries( - new Callable< - Tuple< - String, - Iterable>>() { + new Callable>() { @Override - public Tuple< - String, - Iterable> - call() { - return serviceOptions - .getResourceManagerRpcV1Beta1() - .listOrgPolicies(resource, optionsMap); + public ListResult call() { + return rpc.listOrgPolicies(resource, optionsMap); } }, serviceOptions.getRetrySettings(), EXCEPTION_HANDLER, serviceOptions.getClock()); - String cursor = result.x(); - Iterable orgPolicies = - result.y() == null - ? ImmutableList.of() - : Iterables.transform( - result.y(), - new Function< - com.google.api.services.cloudresourcemanager.model.OrgPolicy, OrgPolicy>() { - @Override - public OrgPolicy apply( - com.google.api.services.cloudresourcemanager.model.OrgPolicy orgPolicyPb) { - return new OrgPolicy( - serviceOptions.getService(), - new OrgPolicyInfo.BuilderImpl(OrgPolicyInfo.fromPb(orgPolicyPb))); - } - }); + String cursor = orgPolicy.pageToken(); + Iterable orgPolicies = + orgPolicy.results() == null + ? ImmutableList.of() + : Iterables.transform(orgPolicy.results(), OrgPolicyInfo.FROM_PB_FUNCTION); return new PageImpl<>( new OrgPolicyPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, @@ -513,14 +475,13 @@ public OrgPolicy apply( } @Override - public OrgPolicy replaceOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) { + public OrgPolicyInfo replaceOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) { try { - return OrgPolicy.fromPb( - this, + return OrgPolicyInfo.fromPb( runWithRetries( - new Callable() { + new Callable() { @Override - public com.google.api.services.cloudresourcemanager.model.OrgPolicy call() { + public OrgPolicy call() { return resourceManagerRpc.replaceOrgPolicy(resource, orgPolicy.toPb()); } }, diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java index 9c7ac55f..d16e6a13 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java @@ -377,7 +377,7 @@ public OrgPolicy getOrgPolicy(String resource, String constraint) { } @Override - public Tuple> listAvailableOrgPolicyConstraints( + public ListResult listAvailableOrgPolicyConstraints( String resource, Map options) { try { ListAvailableOrgPolicyConstraintsResponse response = @@ -389,16 +389,14 @@ public Tuple> listAvailableOrgPolicyConstraints( .setPageSize(Option.PAGE_SIZE.getInt(options)) .setPageToken(Option.PAGE_TOKEN.getString(options))) .execute(); - return Tuple.>of( - response.getNextPageToken(), response.getConstraints()); + return ListResult.of(response.getNextPageToken(), response.getConstraints()); } catch (IOException ex) { throw translate(ex); } } @Override - public Tuple> listOrgPolicies( - String resource, Map options) { + public ListResult listOrgPolicies(String resource, Map options) { try { ListOrgPoliciesResponse response = resourceManager @@ -409,8 +407,7 @@ public Tuple> listOrgPolicies( .setPageSize(Option.PAGE_SIZE.getInt(options)) .setPageToken(Option.PAGE_TOKEN.getString(options))) .execute(); - return Tuple.>of( - response.getNextPageToken(), response.getPolicies()); + return ListResult.of(response.getNextPageToken(), response.getPolicies()); } catch (IOException ex) { throw translate(ex); } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index 7fdeb8a9..db99aa87 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -23,6 +23,7 @@ import com.google.cloud.ServiceRpc; import com.google.cloud.Tuple; import com.google.cloud.resourcemanager.ResourceManagerException; +import com.google.common.collect.ImmutableList; import java.io.IOException; import java.util.List; import java.util.Map; @@ -59,6 +60,28 @@ Integer getInt(Map options) { } } + class ListResult { + + private final Iterable results; + private final String pageToken; + + public ListResult(String pageToken, Iterable results) { + this.results = ImmutableList.copyOf(results); + this.pageToken = pageToken; + } + + public static ListResult of(String pageToken, Iterable list) { + return new ListResult<>(pageToken, list); + } + + public Iterable results() { + return results; + } + + public String pageToken() { + return pageToken; + } + } /** * Creates a new project. * @@ -164,19 +187,18 @@ Map testOrgPermissions(String resource, List permission OrgPolicy getOrgPolicy(String resource, String constraint); /** - * Lists all the Constraints that could be applied on the specified resource. + * Lists all the Constraints that can be applied on the specified resource. * * @throws ResourceManagerException upon failure */ - Tuple> listAvailableOrgPolicyConstraints( - String resource, Map options); + ListResult listAvailableOrgPolicyConstraints(String resource, Map options); /** * Lists all the Policies set for a particular resource. * * @throws ResourceManagerException upon failure */ - Tuple> listOrgPolicies(String resource, Map options); + ListResult listOrgPolicies(String resource, Map options); /** * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java index addc3665..0f2b0377 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertTrue; import com.google.api.services.cloudresourcemanager.model.BooleanConstraint; -import com.google.cloud.resourcemanager.ConstraintInfo.ListConstraint; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,70 +27,71 @@ @RunWith(JUnit4.class) public class ConstraintInfoTest { + private static final String NAME = "constraints/serviceuser.services"; private static final String CONSTRAINT_DEFAULT = "ALLOW"; private static final String DISPLAY_NAME = "constraints-display-name"; private static final String DESCRIPTION = "Detailed description of what this Constraint controls as well as how and where it is enforced"; private static final Integer VERSION = 1; + private static final ConstraintInfo.Constraints LIST_CONSTRAINT = + new ConstraintInfo.Constraints("suggested-value", true); - private static final ListConstraint LIST_CONSTRAINT = new ListConstraint("suggested-value", true); - private static ConstraintInfo CONSTRAINT_INFO; - private static BooleanConstraint BOOLEAN_CONSTRAINT; + private ConstraintInfo constraintInfo; + private BooleanConstraint booleanConstraint; @Before public void setUp() { - BOOLEAN_CONSTRAINT = new BooleanConstraint(); - BOOLEAN_CONSTRAINT.set("boolean", Boolean.class); - CONSTRAINT_INFO = + booleanConstraint = new BooleanConstraint(); + booleanConstraint.set("boolean", Boolean.class); + constraintInfo = ConstraintInfo.newBuilder(NAME) .setConstraintDefault(CONSTRAINT_DEFAULT) .setDisplayName(DISPLAY_NAME) .setDescription(DESCRIPTION) - .setListConstraint(LIST_CONSTRAINT) - .setBooleanConstraint(BOOLEAN_CONSTRAINT) + .setConstraints(LIST_CONSTRAINT) + .setBooleanConstraint(booleanConstraint) .setVersion(VERSION) .build(); } @Test public void testBuilder() { - assertEquals(NAME, CONSTRAINT_INFO.getName()); - assertEquals(CONSTRAINT_DEFAULT, CONSTRAINT_INFO.getConstraintDefault()); - assertEquals(DISPLAY_NAME, CONSTRAINT_INFO.getDisplayName()); - assertEquals(DESCRIPTION, CONSTRAINT_INFO.getDescription()); - assertEquals(LIST_CONSTRAINT, CONSTRAINT_INFO.getListConstraint()); - assertEquals(BOOLEAN_CONSTRAINT, CONSTRAINT_INFO.getBooleanConstraint()); - assertEquals(VERSION, CONSTRAINT_INFO.getVersion()); + assertEquals(NAME, constraintInfo.getName()); + assertEquals(CONSTRAINT_DEFAULT, constraintInfo.getConstraintDefault()); + assertEquals(DISPLAY_NAME, constraintInfo.getDisplayName()); + assertEquals(DESCRIPTION, constraintInfo.getDescription()); + assertEquals(LIST_CONSTRAINT, constraintInfo.getConstraints()); + assertEquals(booleanConstraint, constraintInfo.getBooleanConstraint()); + assertEquals(VERSION, constraintInfo.getVersion()); } @Test public void testToBuilder() { - compareConstraints(CONSTRAINT_INFO, CONSTRAINT_INFO.toBuilder().build()); + compareConstraints(constraintInfo, constraintInfo.toBuilder().build()); } @Test public void testToAndFromPb() { - compareConstraints(CONSTRAINT_INFO, ConstraintInfo.fromPb(CONSTRAINT_INFO.toPb())); - assertNotNull(ConstraintInfo.TO_PB_FUNCTION.apply(CONSTRAINT_INFO)); + compareConstraints(constraintInfo, ConstraintInfo.fromPb(constraintInfo.toPb())); + assertNotNull(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo)); assertNotNull( - ConstraintInfo.FROM_PB_FUNCTION.apply( - ConstraintInfo.TO_PB_FUNCTION.apply(CONSTRAINT_INFO))); + ConstraintInfo.FROM_PB_FUNCTION.apply(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo))); } @Test public void testEquals() { compareConstraints( - CONSTRAINT_INFO, + constraintInfo, ConstraintInfo.newBuilder(NAME) .setConstraintDefault(CONSTRAINT_DEFAULT) .setDisplayName(DISPLAY_NAME) .setDescription(DESCRIPTION) - .setListConstraint(LIST_CONSTRAINT) - .setBooleanConstraint(BOOLEAN_CONSTRAINT) + .setConstraints(LIST_CONSTRAINT) + .setBooleanConstraint(booleanConstraint) .setVersion(VERSION) .build()); - compareConstraints(CONSTRAINT_INFO, new ConstraintInfo.BuilderImpl(CONSTRAINT_INFO).build()); + compareConstraints(constraintInfo, new ConstraintInfo.Builder(constraintInfo).build()); } @Test @@ -112,7 +112,7 @@ private void compareConstraints(ConstraintInfo expected, ConstraintInfo value) { assertEquals(expected.getConstraintDefault(), value.getConstraintDefault()); assertEquals(expected.getDisplayName(), value.getDisplayName()); assertEquals(expected.getDescription(), value.getDescription()); - assertEquals(expected.getListConstraint(), value.getListConstraint()); + assertEquals(expected.getConstraints(), value.getConstraints()); assertEquals(expected.getVersion(), value.getVersion()); } } diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java deleted file mode 100644 index cce123c0..00000000 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintTest.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2020 Google LLC - * - * 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.cloud.resourcemanager; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -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 com.google.api.services.cloudresourcemanager.model.BooleanConstraint; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class ConstraintTest { - private static final String NAME = "constraints/serviceuser.services"; - private static final String CONSTRAINT_DEFAULT = "ALLOW"; - private static final String DISPLAY_NAME = "constraints-display-name"; - private static final String DESCRIPTION = - "Detailed description of what this Constraint controls as well as how and where it is enforced"; - private static final Integer VERSION = 1; - - private static final ConstraintInfo.ListConstraint LIST_CONSTRAINT = - new ConstraintInfo.ListConstraint("suggested-value", true); - private static ConstraintInfo constraintInfo; - private static BooleanConstraint booleanConstraint; - - private ResourceManager serviceMockReturnsOptions = createStrictMock(ResourceManager.class); - private ResourceManagerOptions mockOptions = createMock(ResourceManagerOptions.class); - private ResourceManager resourceManager; - private Constraint expectedConstraint; - - @Before - public void setUp() { - resourceManager = createStrictMock(ResourceManager.class); - booleanConstraint = new BooleanConstraint(); - booleanConstraint.set("booleanField", Boolean.class); - constraintInfo = - ConstraintInfo.newBuilder(NAME) - .setConstraintDefault(CONSTRAINT_DEFAULT) - .setDisplayName(DISPLAY_NAME) - .setDescription(DESCRIPTION) - .setListConstraint(LIST_CONSTRAINT) - .setBooleanConstraint(booleanConstraint) - .setVersion(VERSION) - .build(); - } - - @After - public void tearDown() { - verify(resourceManager); - } - - private void initializeExpectedConstraint(int optionsCalls) { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).times(optionsCalls); - replay(serviceMockReturnsOptions); - expectedConstraint = - new Constraint(serviceMockReturnsOptions, new ConstraintInfo.BuilderImpl(constraintInfo)); - } - - @Test - public void testToBuilder() { - initializeExpectedConstraint(4); - replay(resourceManager); - compareConstraint(expectedConstraint, expectedConstraint.toBuilder().build()); - } - - @Test - public void testFromPb() { - initializeExpectedConstraint(2); - expect(resourceManager.getOptions()).andReturn(mockOptions).times(2); - replay(resourceManager); - compareConstraint( - expectedConstraint, Constraint.fromPb(resourceManager, expectedConstraint.toPb())); - } - - @Test - public void testBuilder() { - expect(resourceManager.getOptions()).andReturn(mockOptions).times(4); - replay(resourceManager); - Constraint.Builder builder = - new Constraint.Builder( - new Constraint(resourceManager, new ConstraintInfo.BuilderImpl(NAME))); - Constraint constraint = - builder - .setConstraintDefault(CONSTRAINT_DEFAULT) - .setName(NAME) - .setDisplayName(DISPLAY_NAME) - .setDescription(DESCRIPTION) - .setListConstraint(LIST_CONSTRAINT) - .setBooleanConstraint(booleanConstraint) - .setVersion(VERSION) - .build(); - assertEquals(NAME, constraint.getName()); - assertEquals(CONSTRAINT_DEFAULT, constraint.getConstraintDefault()); - assertEquals(DISPLAY_NAME, constraint.getDisplayName()); - assertEquals(DESCRIPTION, constraint.getDescription()); - assertEquals(LIST_CONSTRAINT, constraint.getListConstraint()); - assertEquals(booleanConstraint, constraint.getBooleanConstraint()); - assertEquals(VERSION, constraint.getVersion()); - assertEquals(resourceManager.getOptions(), constraint.getResourceManager().getOptions()); - } - - @Test - public void testResourceManager() { - initializeExpectedConstraint(1); - replay(resourceManager); - assertEquals(serviceMockReturnsOptions, expectedConstraint.getResourceManager()); - } - - private void compareConstraint(Constraint expected, Constraint value) { - assertEquals(expected, value); - compareConstraintInfo(expected, value); - assertEquals( - expected.getResourceManager().getOptions(), value.getResourceManager().getOptions()); - } - - private void compareConstraintInfo(ConstraintInfo expected, ConstraintInfo value) { - assertEquals(expected, value); - assertEquals(expected.hashCode(), value.hashCode()); - assertEquals(expected.toString(), value.toString()); - assertEquals(expected.getName(), value.getName()); - assertEquals(expected.getConstraintDefault(), value.getConstraintDefault()); - assertEquals(expected.getDisplayName(), value.getDisplayName()); - assertEquals(expected.getDescription(), value.getDescription()); - assertEquals(expected.getListConstraint(), value.getListConstraint()); - assertEquals(expected.getVersion(), value.getVersion()); - } -} diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index 13de9b20..5b352cf7 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -33,25 +33,25 @@ public class OrgPolicyInfoTest { private static final String ETAG = "abcd12"; private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; private static final Integer VERSION = 1; - private static final OrgPolicyInfo.BooleanPolicy BOOLEAN_POLICY = - new OrgPolicyInfo.BooleanPolicy(true); - private static final OrgPolicyInfo.ListPolicy LIST_POLICY = - new OrgPolicyInfo.ListPolicy( + private static final OrgPolicyInfo.BoolPolicy BOOLEAN_POLICY = new OrgPolicyInfo.BoolPolicy(true); + private static final OrgPolicyInfo.Policies LIST_POLICY = + new OrgPolicyInfo.Policies( "allvaluse", Arrays.asList("allowedValue-1", "allowedValue-2"), Arrays.asList("deniedValue-1", "deniedValue-2"), true, "suggestedValue"); - private static RestoreDefault restoreDefault; - private static OrgPolicyInfo orgPolicyInfo; + + private RestoreDefault restoreDefault; + private OrgPolicyInfo orgPolicyInfo; @Before public void setUp() { restoreDefault = new RestoreDefault(); restoreDefault.set("fields", String.class); orgPolicyInfo = - OrgPolicy.newBuilder() - .setBooleanPolicy(BOOLEAN_POLICY) + OrgPolicyInfo.newBuilder() + .setBoolPolicy(BOOLEAN_POLICY) .setConstraint(CONSTRAINTS_NAME) .setListPolicy(LIST_POLICY) .setRestoreDefault(restoreDefault) @@ -64,8 +64,8 @@ public void setUp() { @Test public void testBuilder() { assertEquals(CONSTRAINTS_NAME, orgPolicyInfo.getConstraint()); - assertEquals(BOOLEAN_POLICY, orgPolicyInfo.getBooleanPolicy()); - assertEquals(LIST_POLICY, orgPolicyInfo.getListPolicy()); + assertEquals(BOOLEAN_POLICY, orgPolicyInfo.getBoolPolicy()); + assertEquals(LIST_POLICY, orgPolicyInfo.getPolicies()); assertEquals(UPDATE_TIME, orgPolicyInfo.getUpdateTime()); assertEquals(VERSION, orgPolicyInfo.getVersion()); assertEquals(restoreDefault, orgPolicyInfo.getRestoreDefault()); @@ -90,7 +90,7 @@ public void testEquals() { compareOrgPolicy( orgPolicyInfo, OrgPolicyInfo.newBuilder() - .setBooleanPolicy(BOOLEAN_POLICY) + .setBoolPolicy(BOOLEAN_POLICY) .setConstraint(CONSTRAINTS_NAME) .setListPolicy(LIST_POLICY) .setRestoreDefault(restoreDefault) @@ -98,7 +98,7 @@ public void testEquals() { .setUpdateTime(UPDATE_TIME) .setVersion(VERSION) .build()); - compareOrgPolicy(orgPolicyInfo, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo).build()); + compareOrgPolicy(orgPolicyInfo, new OrgPolicyInfo.Builder(orgPolicyInfo).build()); } @Test @@ -115,16 +115,15 @@ private void compareOrgPolicy(OrgPolicyInfo expected, OrgPolicyInfo value) { assertEquals(expected, value); assertEquals(expected.hashCode(), value.hashCode()); assertEquals(expected.getConstraint(), value.getConstraint()); - assertEquals(expected.getBooleanPolicy(), value.getBooleanPolicy()); - assertEquals(expected.getBooleanPolicy().toString(), value.getBooleanPolicy().toString()); - assertEquals(expected.getListPolicy(), value.getListPolicy()); + assertEquals(expected.getBoolPolicy(), value.getBoolPolicy()); + assertEquals(expected.getBoolPolicy().toString(), value.getBoolPolicy().toString()); + assertEquals(expected.getPolicies(), value.getPolicies()); assertEquals(expected.getRestoreDefault(), value.getRestoreDefault()); assertEquals(expected.getUpdateTime(), value.getUpdateTime()); assertEquals(expected.getVersion(), value.getVersion()); } - private void compareListPolicies( - OrgPolicyInfo.ListPolicy expected, OrgPolicyInfo.ListPolicy value) { + private void compareListPolicies(OrgPolicyInfo.Policies expected, OrgPolicyInfo.Policies value) { assertEquals(expected, value); assertEquals(expected.hashCode(), value.hashCode()); assertEquals(expected.toString(), value.toString()); diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java deleted file mode 100644 index 7e2df3e2..00000000 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyTest.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2020 Google LLC - * - * 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.cloud.resourcemanager; - -import static org.easymock.EasyMock.createMock; -import static org.easymock.EasyMock.createStrictMock; -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 com.google.api.services.cloudresourcemanager.model.RestoreDefault; -import java.util.Arrays; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -@RunWith(JUnit4.class) -public class OrgPolicyTest { - private static final String CONSTRAINTS_NAME = "constraints/serviceuser.services"; - private static final String ETAG = "abcd12"; - private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; - private static final Integer VERSION = 1; - private static final OrgPolicyInfo.BooleanPolicy BOOLEAN_POLICY = - new OrgPolicyInfo.BooleanPolicy(true); - private static final OrgPolicyInfo.ListPolicy LIST_POLICY = - new OrgPolicyInfo.ListPolicy( - "allvaluse", - Arrays.asList("allowedValue-1", "allowedValue-2"), - Arrays.asList("deniedValue-1", "deniedValue-2"), - true, - "suggestedValue"); - - private ResourceManager serviceMockReturnsOptions = createStrictMock(ResourceManager.class); - private ResourceManagerOptions mockOptions = createMock(ResourceManagerOptions.class); - private ResourceManager resourceManager; - private OrgPolicy expectedOrgPolicy; - private RestoreDefault restoreDefault; - private OrgPolicyInfo orgPolicyInfo; - - @Before - public void setUp() { - resourceManager = createStrictMock(ResourceManager.class); - restoreDefault = new RestoreDefault(); - restoreDefault.set("fields", String.class); - orgPolicyInfo = - OrgPolicyInfo.newBuilder() - .setBooleanPolicy(BOOLEAN_POLICY) - .setConstraint(CONSTRAINTS_NAME) - .setListPolicy(LIST_POLICY) - .setRestoreDefault(restoreDefault) - .setEtag(ETAG) - .setUpdateTime(UPDATE_TIME) - .setVersion(VERSION) - .build(); - } - - @After - public void tearDown() { - verify(resourceManager); - } - - private void initializeExpectedOrgPolicy(int optionsCalls) { - expect(serviceMockReturnsOptions.getOptions()).andReturn(mockOptions).times(optionsCalls); - replay(serviceMockReturnsOptions); - expectedOrgPolicy = - new OrgPolicy(serviceMockReturnsOptions, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo)); - } - - @Test - public void testToBuilder() { - initializeExpectedOrgPolicy(4); - replay(resourceManager); - compareOrgPolicy(expectedOrgPolicy, expectedOrgPolicy.toBuilder().build()); - } - - @Test - public void testFromPb() { - initializeExpectedOrgPolicy(2); - expect(resourceManager.getOptions()).andReturn(mockOptions).times(2); - replay(resourceManager); - compareOrgPolicy( - expectedOrgPolicy, OrgPolicy.fromPb(resourceManager, expectedOrgPolicy.toPb())); - } - - @Test - public void testBuilder() { - expect(resourceManager.getOptions()).andReturn(mockOptions).times(4); - replay(resourceManager); - OrgPolicy.Builder builder = - new OrgPolicy.Builder( - new OrgPolicy(resourceManager, new OrgPolicyInfo.BuilderImpl(orgPolicyInfo))); - OrgPolicy orgPolicy = - builder - .setBooleanPolicy(BOOLEAN_POLICY) - .setConstraint(CONSTRAINTS_NAME) - .setListPolicy(LIST_POLICY) - .setRestoreDefault(restoreDefault) - .setEtag(ETAG) - .setUpdateTime(UPDATE_TIME) - .setVersion(VERSION) - .build(); - assertEquals(CONSTRAINTS_NAME, orgPolicy.getConstraint()); - assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); - assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); - assertEquals(restoreDefault, orgPolicy.getRestoreDefault()); - assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); - assertEquals(VERSION, orgPolicy.getVersion()); - assertEquals(resourceManager.getOptions(), orgPolicy.getResourceManager().getOptions()); - } - - @Test - public void testResourceManager() { - initializeExpectedOrgPolicy(1); - replay(resourceManager); - assertEquals(serviceMockReturnsOptions, expectedOrgPolicy.getResourceManager()); - } - - private void compareOrgPolicy(OrgPolicy expected, OrgPolicy value) { - assertEquals(expected, value); - compareOrgPolicyInfo(expected, value); - assertEquals( - expected.getResourceManager().getOptions(), value.getResourceManager().getOptions()); - } - - private void compareOrgPolicyInfo(OrgPolicyInfo expected, OrgPolicyInfo value) { - assertEquals(expected, value); - assertEquals(expected.hashCode(), value.hashCode()); - assertEquals(expected.getConstraint(), value.getConstraint()); - assertEquals(expected.getBooleanPolicy(), value.getBooleanPolicy()); - assertEquals(expected.getBooleanPolicy().toString(), value.getBooleanPolicy().toString()); - assertEquals(expected.getListPolicy(), value.getListPolicy()); - assertEquals(expected.getRestoreDefault(), value.getRestoreDefault()); - assertEquals(expected.getUpdateTime(), value.getUpdateTime()); - assertEquals(expected.getVersion(), value.getVersion()); - } -} diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index f2657059..81b7b1eb 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -16,7 +16,6 @@ package com.google.cloud.resourcemanager; -import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; @@ -30,13 +29,12 @@ import static org.mockito.Mockito.when; import com.google.api.gax.paging.Page; -import com.google.api.services.cloudresourcemanager.model.GetOrgPolicyRequest; +import com.google.api.services.cloudresourcemanager.model.Constraint; +import com.google.api.services.cloudresourcemanager.model.OrgPolicy; import com.google.cloud.Identity; import com.google.cloud.Policy; import com.google.cloud.Role; -import com.google.cloud.Tuple; -import com.google.cloud.resourcemanager.OrgPolicyInfo.BooleanPolicy; -import com.google.cloud.resourcemanager.OrgPolicyInfo.ListPolicy; +import com.google.cloud.resourcemanager.OrgPolicyInfo.BoolPolicy; import com.google.cloud.resourcemanager.ProjectInfo.ResourceId; import com.google.cloud.resourcemanager.ResourceManager.ProjectField; import com.google.cloud.resourcemanager.ResourceManager.ProjectGetOption; @@ -46,7 +44,6 @@ import com.google.cloud.resourcemanager.testing.LocalResourceManagerHelper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; import java.io.IOException; import java.util.Arrays; import java.util.Iterator; @@ -94,24 +91,39 @@ public class ResourceManagerImplTest { private static final String CONSTRAINTS = "constraints/serviceuser.services"; private static final String ETAG = "abcd12"; private static final String UPDATE_TIME = "014-10-02T15:01:23.045123456Z"; + private static final String NAME = "constraints/serviceuser.services"; + private static final String CONSTRAINT_DEFAULT = "ALLOW"; + private static final String DISPLAY_NAME = "constraints-display-name"; + private static final String DESCRIPTION = + "Detailed description of what this Constraint controls as well as how and where it is enforced"; private static final Integer VERSION = 1; - private static final BooleanPolicy BOOLEAN_POLICY = new BooleanPolicy(true); - private static final ListPolicy LIST_POLICY = - new ListPolicy( + private static final BoolPolicy BOOLEAN_POLICY = new BoolPolicy(true); + private static final OrgPolicyInfo.Policies LIST_POLICY = + new OrgPolicyInfo.Policies( "allvaluse", Arrays.asList("allowedValues"), Arrays.asList("deniedValues"), true, "suggestedValue"); private static final OrgPolicyInfo ORG_POLICY_INFO = - OrgPolicy.newBuilder() - .setBooleanPolicy(BOOLEAN_POLICY) + OrgPolicyInfo.newBuilder() + .setBoolPolicy(BOOLEAN_POLICY) .setConstraint(CONSTRAINTS) .setListPolicy(LIST_POLICY) .setEtag(ETAG) .setUpdateTime(UPDATE_TIME) .setVersion(VERSION) .build(); + private static final ConstraintInfo.Constraints LIST_CONSTRAINT = + new ConstraintInfo.Constraints("suggested-value", true); + private static final ConstraintInfo CONSTRAINT_INFO = + ConstraintInfo.newBuilder(NAME) + .setConstraintDefault(CONSTRAINT_DEFAULT) + .setDisplayName(DISPLAY_NAME) + .setDescription(DESCRIPTION) + .setConstraints(LIST_CONSTRAINT) + .setVersion(VERSION) + .build(); private ResourceManagerRpcFactory rpcFactoryMock = Mockito.mock(ResourceManagerRpcFactory.class); private ResourceManagerRpc resourceManagerRpcMock = Mockito.mock(ResourceManagerRpc.class); @@ -553,9 +565,9 @@ public void testClearOrgPolicy() { try { RESOURCE_MANAGER.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); fail("Should fail because the organization policy doesn't exist."); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } @@ -575,12 +587,12 @@ public void testGetEffectiveOrgPolicy() { .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); - assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); - assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); - assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); - assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); - assertEquals(VERSION, orgPolicy.getVersion()); + OrgPolicyInfo policyInfo = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); + assertEquals(CONSTRAINTS, policyInfo.getConstraint()); + assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); + assertEquals(LIST_POLICY, policyInfo.getPolicies()); + assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); + assertEquals(VERSION, policyInfo.getVersion()); } @Test @@ -588,9 +600,9 @@ public void testGetEffectiveOrgPolicyWithException() { try { RESOURCE_MANAGER.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); fail(); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } @@ -610,24 +622,22 @@ public void testGetOrgPolicy() { .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); - assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); - assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); - assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); - assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); - assertEquals(VERSION, orgPolicy.getVersion()); + OrgPolicyInfo policyInfo = resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); + assertEquals(CONSTRAINTS, policyInfo.getConstraint()); + assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); + assertEquals(LIST_POLICY, policyInfo.getPolicies()); + assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); + assertEquals(VERSION, policyInfo.getVersion()); } @Test public void testGetOrgPolicyWithException() { try { - GetOrgPolicyRequest request = new GetOrgPolicyRequest(); - request.setConstraint(CONSTRAINTS); RESOURCE_MANAGER.getOrgPolicy(RESOURCE, CONSTRAINTS); fail(); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } @@ -643,19 +653,14 @@ public void testListAvailableOrgPolicyConstraints() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - ImmutableList constraints = - ImmutableList.of( - new Constraint( - resourceManagerMock, - new ConstraintInfo.BuilderImpl(ConstraintInfo.newBuilder(CONSTRAINTS).build()))); + ResourceManagerRpc.ListResult constraintListResult = + ResourceManagerRpc.ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toPb())); EasyMock.expect( - resourceManagerRpcMock.listAvailableOrgPolicyConstraints(RESOURCE, EMPTY_RPC_OPTIONS)) - .andReturn( - Tuple.of(CURSOR, Iterables.transform(constraints, ConstraintInfo.TO_PB_FUNCTION))); + resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) + .andReturn(constraintListResult); EasyMock.replay(resourceManagerRpcMock); - Page page = resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE); + Page page = resourceManagerMock.listAvailableOrgPolicyConstraints(NAME); assertEquals(CURSOR, page.getNextPageToken()); - assertArrayEquals(constraints.toArray(), Iterables.toArray(page.getValues(), Constraint.class)); } @Test @@ -663,9 +668,9 @@ public void listAvailableOrgPolicyConstraintsWithException() { try { RESOURCE_MANAGER.listAvailableOrgPolicyConstraints(RESOURCE); fail(); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } @@ -681,17 +686,13 @@ public void testListOrgPolicies() { .setServiceRpcFactory(rpcFactoryMock) .build() .getService(); - ImmutableList orgPolicies = - ImmutableList.of( - new OrgPolicy(resourceManagerMock, new OrgPolicyInfo.BuilderImpl(ORG_POLICY_INFO))); - Tuple> result = - Tuple.of(CURSOR, Iterables.transform(orgPolicies, OrgPolicyInfo.TO_PB_FUNCTION)); + ResourceManagerRpc.ListResult orgPolicies = + ResourceManagerRpc.ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toPb())); EasyMock.expect(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) - .andReturn(result); + .andReturn(orgPolicies); EasyMock.replay(resourceManagerRpcMock); - Page page = resourceManagerMock.listOrgPolicies(RESOURCE); + Page page = resourceManagerMock.listOrgPolicies(RESOURCE); assertEquals(CURSOR, page.getNextPageToken()); - assertArrayEquals(orgPolicies.toArray(), Iterables.toArray(page.getValues(), OrgPolicy.class)); } @Test @@ -699,9 +700,9 @@ public void testListOrgPoliciesWithException() { try { RESOURCE_MANAGER.listOrgPolicies(RESOURCE); fail(); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } @@ -721,12 +722,12 @@ public void testSetOrgPolicy() { .andReturn(ORG_POLICY_INFO.toPb()) .times(2); EasyMock.replay(resourceManagerRpcMock); - OrgPolicy orgPolicy = resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); - assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); - assertEquals(BOOLEAN_POLICY, orgPolicy.getBooleanPolicy()); - assertEquals(LIST_POLICY, orgPolicy.getListPolicy()); - assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); - assertEquals(VERSION, orgPolicy.getVersion()); + OrgPolicyInfo policyInfo = resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); + assertEquals(CONSTRAINTS, policyInfo.getConstraint()); + assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); + assertEquals(LIST_POLICY, policyInfo.getPolicies()); + assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); + assertEquals(VERSION, policyInfo.getVersion()); } @Test @@ -734,9 +735,9 @@ public void testSetOrgPolicyWithException() { try { RESOURCE_MANAGER.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); fail(); - } catch (ResourceManagerException e) { - assertEquals(404, e.getCode()); - assertTrue(e.getMessage().contains("Not Found")); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); + assertTrue(expected.getMessage().contains("Not Found")); } } } From bcf5335eb62b1fc89ddbfd6f976adcc8095acfc4 Mon Sep 17 00:00:00 2001 From: athakor Date: Wed, 1 Apr 2020 19:30:59 +0530 Subject: [PATCH 07/14] feat: add mockito tests instead of easymock --- .../cloud/resourcemanager/OrgPolicyInfo.java | 2 +- .../resourcemanager/OrgPolicyInfoTest.java | 1 + .../ResourceManagerImplTest.java | 199 ++++++------------ 3 files changed, 72 insertions(+), 130 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 68211609..02786338 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -53,7 +53,7 @@ public OrgPolicy apply(OrgPolicyInfo orgPolicyInfo) { private String updateTime; private Integer version; - /** Used in policy_type to specify how booleanPolicy will behave at this resource. */ + /** Used For boolean Constraints, whether to enforce the Constraint or not. */ static class BoolPolicy implements Serializable { private static final long serialVersionUID = -2133042982786959351L; diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index 5b352cf7..2c1637d9 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -116,6 +116,7 @@ private void compareOrgPolicy(OrgPolicyInfo expected, OrgPolicyInfo value) { assertEquals(expected.hashCode(), value.hashCode()); assertEquals(expected.getConstraint(), value.getConstraint()); assertEquals(expected.getBoolPolicy(), value.getBoolPolicy()); + assertEquals(expected.getEtag(), value.getEtag()); assertEquals(expected.getBoolPolicy().toString(), value.getBoolPolicy().toString()); assertEquals(expected.getPolicies(), value.getPolicies()); assertEquals(expected.getRestoreDefault(), value.getRestoreDefault()); diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index 81b7b1eb..96bda368 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -41,6 +41,7 @@ import com.google.cloud.resourcemanager.ResourceManager.ProjectListOption; import com.google.cloud.resourcemanager.spi.ResourceManagerRpcFactory; import com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc; +import com.google.cloud.resourcemanager.spi.v1beta1.ResourceManagerRpc.ListResult; import com.google.cloud.resourcemanager.testing.LocalResourceManagerHelper; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -49,12 +50,12 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import org.easymock.EasyMock; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; @@ -128,6 +129,8 @@ public class ResourceManagerImplTest { private ResourceManagerRpcFactory rpcFactoryMock = Mockito.mock(ResourceManagerRpcFactory.class); private ResourceManagerRpc resourceManagerRpcMock = Mockito.mock(ResourceManagerRpc.class); + @Mock private ResourceManager resourceManagerMock; + @BeforeClass public static void beforeClass() { RESOURCE_MANAGER_HELPER.start(); @@ -440,73 +443,43 @@ public void testTestPermissions() { @Test public void testRetryableException() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - EasyMock.expect(resourceManagerRpcMock.get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS)) - .andThrow(new ResourceManagerException(500, "Internal Error")) - .andReturn(PARTIAL_PROJECT.toPb()); - EasyMock.replay(resourceManagerRpcMock); - Project returnedProject = resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); - assertEquals( - new Project(resourceManagerMock, new ProjectInfo.BuilderImpl(PARTIAL_PROJECT)), - returnedProject); + String exceptionMessage = "Internal Error"; + Mockito.doThrow(new ResourceManagerException(500, exceptionMessage)) + .when(resourceManagerMock) + .get(PARTIAL_PROJECT.getProjectId()); + try { + resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); + fail(); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); + } } @Test public void testNonRetryableException() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - EasyMock.expect(resourceManagerRpcMock.get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS)) - .andThrow( - new ResourceManagerException( - 403, "Project " + PARTIAL_PROJECT.getProjectId() + " not found.")) - .once(); - EasyMock.replay(resourceManagerRpcMock); + String exceptionMessage = "Project " + PARTIAL_PROJECT.getProjectId() + " not found."; + Mockito.doThrow(new ResourceManagerException(403, exceptionMessage)) + .when(resourceManagerMock) + .get(PARTIAL_PROJECT.getProjectId()); try { resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); fail(); - } catch (ResourceManagerException e) { - assertTrue(e.getMessage().contains("Project partial-project not found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @Test public void testRuntimeException() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); String exceptionMessage = "Artificial runtime exception"; - EasyMock.expect(resourceManagerRpcMock.get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS)) - .andThrow(new RuntimeException(exceptionMessage)); - EasyMock.replay(resourceManagerRpcMock); + Mockito.doThrow(new RuntimeException(exceptionMessage)) + .when(resourceManagerMock) + .get(PARTIAL_PROJECT.getProjectId()); try { resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); fail(); - } catch (ResourceManagerException exception) { - assertEquals(exceptionMessage, exception.getCause().getMessage()); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @@ -573,23 +546,12 @@ public void testClearOrgPolicy() { @Test public void testGetEffectiveOrgPolicy() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - EasyMock.expect(resourceManagerRpcMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS)) - .andReturn(ORG_POLICY_INFO.toPb()) - .times(2); - EasyMock.replay(resourceManagerRpcMock); + Mockito.when(resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS)) + .thenReturn(ORG_POLICY_INFO); OrgPolicyInfo policyInfo = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); + assertEquals(ETAG, policyInfo.getEtag()); assertEquals(LIST_POLICY, policyInfo.getPolicies()); assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); assertEquals(VERSION, policyInfo.getVersion()); @@ -608,20 +570,8 @@ public void testGetEffectiveOrgPolicyWithException() { @Test public void testGetOrgPolicy() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - EasyMock.expect(resourceManagerRpcMock.getOrgPolicy(RESOURCE, CONSTRAINTS)) - .andReturn(ORG_POLICY_INFO.toPb()) - .times(2); - EasyMock.replay(resourceManagerRpcMock); + Mockito.when(resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS)) + .thenReturn(ORG_POLICY_INFO); OrgPolicyInfo policyInfo = resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); @@ -643,24 +593,24 @@ public void testGetOrgPolicyWithException() { @Test public void testListAvailableOrgPolicyConstraints() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - ResourceManagerRpc.ListResult constraintListResult = - ResourceManagerRpc.ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toPb())); - EasyMock.expect( - resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) - .andReturn(constraintListResult); - EasyMock.replay(resourceManagerRpcMock); - Page page = resourceManagerMock.listAvailableOrgPolicyConstraints(NAME); - assertEquals(CURSOR, page.getNextPageToken()); + ListResult expectedResult = + ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toPb())); + Mockito.when(resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) + .thenReturn(expectedResult); + ListResult page = + resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS); + assertEquals(CURSOR, page.pageToken()); + for (Constraint constraint : page.results()) { + assertEquals(NAME, constraint.getName()); + assertEquals(CONSTRAINT_DEFAULT, constraint.getConstraintDefault()); + assertEquals(DISPLAY_NAME, constraint.getDisplayName()); + assertEquals(DESCRIPTION, constraint.getDescription()); + assertEquals( + LIST_CONSTRAINT.getSuggestedValue(), constraint.getListConstraint().getSuggestedValue()); + assertEquals( + LIST_CONSTRAINT.getSupportsUnder(), constraint.getListConstraint().getSupportsUnder()); + assertEquals(VERSION, constraint.getVersion()); + } } @Test @@ -676,23 +626,26 @@ public void listAvailableOrgPolicyConstraintsWithException() { @Test public void testListOrgPolicies() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - ResourceManagerRpc.ListResult orgPolicies = - ResourceManagerRpc.ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toPb())); - EasyMock.expect(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) - .andReturn(orgPolicies); - EasyMock.replay(resourceManagerRpcMock); - Page page = resourceManagerMock.listOrgPolicies(RESOURCE); - assertEquals(CURSOR, page.getNextPageToken()); + ListResult expectedResult = + ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toPb())); + Mockito.when(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) + .thenReturn(expectedResult); + ListResult results = + resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS); + assertEquals(CURSOR, results.pageToken()); + for (OrgPolicy orgPolicy : results.results()) { + assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); + assertEquals(ETAG, orgPolicy.getEtag()); + assertEquals(BOOLEAN_POLICY.getEnforce(), orgPolicy.getBooleanPolicy().getEnforced()); + assertEquals(LIST_POLICY.getAllValues(), orgPolicy.getListPolicy().getAllValues()); + assertEquals(LIST_POLICY.getAllowedValues(), orgPolicy.getListPolicy().getAllowedValues()); + assertEquals(LIST_POLICY.getDeniedValues(), orgPolicy.getListPolicy().getDeniedValues()); + assertEquals( + LIST_POLICY.getInheritFromParent(), orgPolicy.getListPolicy().getInheritFromParent()); + assertEquals(LIST_POLICY.getSuggestedValue(), orgPolicy.getListPolicy().getSuggestedValue()); + assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); + assertEquals(VERSION, orgPolicy.getVersion()); + } } @Test @@ -708,20 +661,8 @@ public void testListOrgPoliciesWithException() { @Test public void testSetOrgPolicy() { - ResourceManagerRpcFactory rpcFactoryMock = EasyMock.createMock(ResourceManagerRpcFactory.class); - ResourceManagerRpc resourceManagerRpcMock = EasyMock.createMock(ResourceManagerRpc.class); - EasyMock.expect(rpcFactoryMock.create(EasyMock.anyObject(ResourceManagerOptions.class))) - .andReturn(resourceManagerRpcMock); - EasyMock.replay(rpcFactoryMock); - ResourceManager resourceManagerMock = - ResourceManagerOptions.newBuilder() - .setServiceRpcFactory(rpcFactoryMock) - .build() - .getService(); - EasyMock.expect(resourceManagerRpcMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO.toPb())) - .andReturn(ORG_POLICY_INFO.toPb()) - .times(2); - EasyMock.replay(resourceManagerRpcMock); + Mockito.when(resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO)) + .thenReturn(ORG_POLICY_INFO); OrgPolicyInfo policyInfo = resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); From e314cf9e3fe07cee9994ed6ca65ed9fcdd1849d2 Mon Sep 17 00:00:00 2001 From: athakor Date: Wed, 1 Apr 2020 20:43:44 +0530 Subject: [PATCH 08/14] feat: review changes fixes --- .../cloud/resourcemanager/ConstraintInfo.java | 8 +++++-- .../cloud/resourcemanager/OrgPolicyInfo.java | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index b8ae84bb..da3980bf 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -217,8 +217,12 @@ public Integer getVersion() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } ConstraintInfo that = (ConstraintInfo) o; return Objects.equals(booleanConstraint, that.booleanConstraint) && Objects.equals(constraintDefault, that.constraintDefault) diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 02786338..2c8a684e 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -74,8 +74,12 @@ public String toString() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } BoolPolicy that = (BoolPolicy) o; return Objects.equals(enforce, that.enforce); } @@ -171,8 +175,12 @@ public String toString() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Policies policies = (Policies) o; return Objects.equals(allValues, policies.allValues) && Objects.equals(allowedValues, policies.allowedValues) @@ -309,8 +317,12 @@ public Integer getVersion() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } OrgPolicyInfo that = (OrgPolicyInfo) o; return Objects.equals(boolPolicy, that.boolPolicy) && Objects.equals(constraint, that.constraint) From 27519de0b6264a4882a60b388d2a02c3d77a389a Mon Sep 17 00:00:00 2001 From: athakor Date: Thu, 2 Apr 2020 14:18:41 +0530 Subject: [PATCH 09/14] feat: fix review changes --- .../cloud/resourcemanager/ConstraintInfo.java | 34 ++++----- .../cloud/resourcemanager/OrgPolicyInfo.java | 40 +++++----- .../resourcemanager/ResourceManagerImpl.java | 22 +++--- .../spi/v1beta1/HttpResourceManagerRpc.java | 37 ++++----- .../spi/v1beta1/ResourceManagerRpc.java | 13 ++-- .../resourcemanager/ConstraintInfoTest.java | 2 +- .../resourcemanager/OrgPolicyInfoTest.java | 6 +- .../ResourceManagerImplTest.java | 76 ++++++++++++------- 8 files changed, 125 insertions(+), 105 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index da3980bf..97e9d55e 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -31,15 +31,15 @@ public class ConstraintInfo implements Serializable { static final Function FROM_PB_FUNCTION = new Function() { @Override - public ConstraintInfo apply(Constraint pb) { - return ConstraintInfo.fromPb(pb); + public ConstraintInfo apply(Constraint protobuf) { + return ConstraintInfo.fromProtobuf(protobuf); } }; static final Function TO_PB_FUNCTION = new Function() { @Override public Constraint apply(ConstraintInfo constraintInfo) { - return constraintInfo.toPb(); + return constraintInfo.toProtobuf(); } }; @@ -97,11 +97,11 @@ public boolean equals(Object o) { && Objects.equals(supportsUnder, that.supportsUnder); } - ListConstraint toPb() { + ListConstraint toProtobuf() { return new ListConstraint().setSuggestedValue(suggestedValue).setSupportsUnder(supportsUnder); } - static Constraints fromPb(ListConstraint listConstraint) { + static Constraints fromProtobuf(ListConstraint listConstraint) { return new Constraints(listConstraint.getSuggestedValue(), listConstraint.getSupportsUnder()); } } @@ -249,21 +249,21 @@ public Builder toBuilder() { return new Builder(this); } - Constraint toPb() { - Constraint constraintPb = new Constraint(); - constraintPb.setBooleanConstraint(booleanConstraint); - constraintPb.setConstraintDefault(constraintDefault); - constraintPb.setDescription(description); - constraintPb.setDisplayName(displayName); + Constraint toProtobuf() { + Constraint constraintProto = new Constraint(); + constraintProto.setBooleanConstraint(booleanConstraint); + constraintProto.setConstraintDefault(constraintDefault); + constraintProto.setDescription(description); + constraintProto.setDisplayName(displayName); if (constraints != null) { - constraintPb.setListConstraint(constraints.toPb()); + constraintProto.setListConstraint(constraints.toProtobuf()); } - constraintPb.setName(name); - constraintPb.setVersion(version); - return constraintPb; + constraintProto.setName(name); + constraintProto.setVersion(version); + return constraintProto; } - static ConstraintInfo fromPb(Constraint constraintPb) { + static ConstraintInfo fromProtobuf(Constraint constraintPb) { Builder builder = newBuilder(constraintPb.getName()); if (constraintPb.getBooleanConstraint() != null) { builder.setBooleanConstraint(constraintPb.getBooleanConstraint()); @@ -278,7 +278,7 @@ static ConstraintInfo fromPb(Constraint constraintPb) { builder.setDisplayName(constraintPb.getDisplayName()); } if (constraintPb.getListConstraint() != null) { - builder.setConstraints(Constraints.fromPb(constraintPb.getListConstraint())); + builder.setConstraints(Constraints.fromProtobuf(constraintPb.getListConstraint())); } if (constraintPb.getName() != null && !constraintPb.getName().equals("Unnamed")) { builder.setName(constraintPb.getName()); diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 2c8a684e..aaa41124 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -33,15 +33,15 @@ public class OrgPolicyInfo implements Serializable { static final Function FROM_PB_FUNCTION = new Function() { @Override - public OrgPolicyInfo apply(OrgPolicy pb) { - return OrgPolicyInfo.fromPb(pb); + public OrgPolicyInfo apply(OrgPolicy protobuf) { + return OrgPolicyInfo.fromProtobuf(protobuf); } }; static final Function TO_PB_FUNCTION = new Function() { @Override public OrgPolicy apply(OrgPolicyInfo orgPolicyInfo) { - return orgPolicyInfo.toPb(); + return orgPolicyInfo.toProtobuf(); } }; @@ -89,11 +89,11 @@ public int hashCode() { return Objects.hash(enforce); } - BooleanPolicy toPb() { + BooleanPolicy toProtobuf() { return new BooleanPolicy().setEnforced(enforce); } - static BoolPolicy fromPb(BooleanPolicy booleanPolicy) { + static BoolPolicy fromProtobuf(BooleanPolicy booleanPolicy) { return new BoolPolicy(booleanPolicy.getEnforced()); } } @@ -195,7 +195,7 @@ public int hashCode() { allValues, allowedValues, deniedValues, inheritFromParent, suggestedValue); } - ListPolicy toPb() { + ListPolicy toProtobuf() { return new ListPolicy() .setAllValues(allValues) .setAllowedValues(allowedValues) @@ -204,7 +204,7 @@ ListPolicy toPb() { .setSuggestedValue(suggestedValue); } - static Policies fromPb(ListPolicy listPolicy) { + static Policies fromProtobuf(ListPolicy listPolicy) { return new Policies( listPolicy.getAllValues(), listPolicy.getAllowedValues(), @@ -349,32 +349,32 @@ public Builder toBuilder() { return new Builder(this); } - OrgPolicy toPb() { - OrgPolicy orgPolicyPb = new OrgPolicy(); + OrgPolicy toProtobuf() { + OrgPolicy orgPolicyProto = new OrgPolicy(); if (boolPolicy != null) { - orgPolicyPb.setBooleanPolicy(boolPolicy.toPb()); + orgPolicyProto.setBooleanPolicy(boolPolicy.toProtobuf()); } - orgPolicyPb.setConstraint(constraint); + orgPolicyProto.setConstraint(constraint); if (policies != null) { - orgPolicyPb.setListPolicy(policies.toPb()); + orgPolicyProto.setListPolicy(policies.toProtobuf()); } - orgPolicyPb.setRestoreDefault(restoreDefault); - orgPolicyPb.setEtag(etag); - orgPolicyPb.setUpdateTime(updateTime); - orgPolicyPb.setVersion(version); - return orgPolicyPb; + orgPolicyProto.setRestoreDefault(restoreDefault); + orgPolicyProto.setEtag(etag); + orgPolicyProto.setUpdateTime(updateTime); + orgPolicyProto.setVersion(version); + return orgPolicyProto; } - static OrgPolicyInfo fromPb(OrgPolicy orgPolicyPb) { + static OrgPolicyInfo fromProtobuf(OrgPolicy orgPolicyPb) { Builder builder = newBuilder(); if (orgPolicyPb.getBooleanPolicy() != null) { - builder.setBoolPolicy(BoolPolicy.fromPb(orgPolicyPb.getBooleanPolicy())); + builder.setBoolPolicy(BoolPolicy.fromProtobuf(orgPolicyPb.getBooleanPolicy())); } if (orgPolicyPb.getConstraint() != null) { builder.setConstraint(orgPolicyPb.getConstraint()); } if (orgPolicyPb.getListPolicy() != null) { - builder.setListPolicy(Policies.fromPb(orgPolicyPb.getListPolicy())); + builder.setListPolicy(Policies.fromProtobuf(orgPolicyPb.getListPolicy())); } if (orgPolicyPb.getRestoreDefault() != null) { builder.setRestoreDefault(orgPolicyPb.getRestoreDefault()); diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java index aee5e31d..45c8693f 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java @@ -302,8 +302,8 @@ public void clearOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) runWithRetries( new Callable() { @Override - public Void call() { - resourceManagerRpc.clearOrgPolicy(resource, orgPolicy.toPb()); + public Void call() throws IOException { + resourceManagerRpc.clearOrgPolicy(resource, orgPolicy.toProtobuf()); return null; } }, @@ -318,11 +318,11 @@ public Void call() { @Override public OrgPolicyInfo getEffectiveOrgPolicy(final String resource, final String constraint) { try { - return OrgPolicyInfo.fromPb( + return OrgPolicyInfo.fromProtobuf( runWithRetries( new Callable() { @Override - public OrgPolicy call() { + public OrgPolicy call() throws IOException { return resourceManagerRpc.getEffectiveOrgPolicy(resource, constraint); } }, @@ -337,11 +337,11 @@ public OrgPolicy call() { @Override public OrgPolicyInfo getOrgPolicy(final String resource, final String constraint) { try { - return OrgPolicyInfo.fromPb( + return OrgPolicyInfo.fromProtobuf( runWithRetries( new Callable() { @Override - public OrgPolicy call() { + public OrgPolicy call() throws IOException { return resourceManagerRpc.getOrgPolicy(resource, constraint); } }, @@ -393,7 +393,7 @@ private static Page listAvailableOrgPolicyConstraints( runWithRetries( new Callable>() { @Override - public ListResult call() { + public ListResult call() throws IOException { return rpc.listAvailableOrgPolicyConstraints(resource, optionsMap); } }, @@ -453,7 +453,7 @@ private static PageImpl listOrgPolicies( runWithRetries( new Callable>() { @Override - public ListResult call() { + public ListResult call() throws IOException { return rpc.listOrgPolicies(resource, optionsMap); } }, @@ -477,12 +477,12 @@ public ListResult call() { @Override public OrgPolicyInfo replaceOrgPolicy(final String resource, final OrgPolicyInfo orgPolicy) { try { - return OrgPolicyInfo.fromPb( + return OrgPolicyInfo.fromProtobuf( runWithRetries( new Callable() { @Override - public OrgPolicy call() { - return resourceManagerRpc.replaceOrgPolicy(resource, orgPolicy.toPb()); + public OrgPolicy call() throws IOException { + return resourceManagerRpc.replaceOrgPolicy(resource, orgPolicy.toProtobuf()); } }, getOptions().getRetrySettings(), diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java index d16e6a13..1995fcfb 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/HttpResourceManagerRpc.java @@ -336,7 +336,7 @@ resource, new TestIamPermissionsRequest().setPermissions(permissions)) } @Override - public void clearOrgPolicy(String resource, OrgPolicy orgPolicy) { + public void clearOrgPolicy(String resource, OrgPolicy orgPolicy) throws IOException { try { resourceManager .folders() @@ -346,39 +346,39 @@ public void clearOrgPolicy(String resource, OrgPolicy orgPolicy) { .setConstraint(orgPolicy.getConstraint()) .setEtag(orgPolicy.getEtag())) .execute(); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } @Override - public OrgPolicy getEffectiveOrgPolicy(String resource, String constraint) { + public OrgPolicy getEffectiveOrgPolicy(String resource, String constraint) throws IOException { try { return resourceManager .folders() .getEffectiveOrgPolicy( resource, new GetEffectiveOrgPolicyRequest().setConstraint(constraint)) .execute(); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } @Override - public OrgPolicy getOrgPolicy(String resource, String constraint) { + public OrgPolicy getOrgPolicy(String resource, String constraint) throws IOException { try { return resourceManager .folders() .getOrgPolicy(resource, new GetOrgPolicyRequest().setConstraint(constraint)) .execute(); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } @Override public ListResult listAvailableOrgPolicyConstraints( - String resource, Map options) { + String resource, Map options) throws IOException { try { ListAvailableOrgPolicyConstraintsResponse response = resourceManager @@ -390,13 +390,14 @@ public ListResult listAvailableOrgPolicyConstraints( .setPageToken(Option.PAGE_TOKEN.getString(options))) .execute(); return ListResult.of(response.getNextPageToken(), response.getConstraints()); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } @Override - public ListResult listOrgPolicies(String resource, Map options) { + public ListResult listOrgPolicies(String resource, Map options) + throws IOException { try { ListOrgPoliciesResponse response = resourceManager @@ -408,20 +409,20 @@ public ListResult listOrgPolicies(String resource, Map opt .setPageToken(Option.PAGE_TOKEN.getString(options))) .execute(); return ListResult.of(response.getNextPageToken(), response.getPolicies()); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } @Override - public OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy) { + public OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy) throws IOException { try { return resourceManager .folders() .setOrgPolicy(resource, new SetOrgPolicyRequest().setPolicy(orgPolicy)) .execute(); - } catch (IOException ex) { - throw translate(ex); + } catch (RetryHelper.RetryHelperException ex) { + throw ResourceManagerException.translateAndThrow(ex); } } } diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index db99aa87..a93d3e28 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -162,7 +162,7 @@ Map testOrgPermissions(String resource, List permission // TODO(ajaykannan): implement "Organization" functionality when available (issue #319) /** Clears the Policy from a resource. */ - void clearOrgPolicy(String resource, OrgPolicy orgPolicy); + void clearOrgPolicy(String resource, OrgPolicy orgPolicy) throws IOException; /** * Gets the effective Policy on a resource @@ -173,7 +173,7 @@ Map testOrgPermissions(String resource, List permission * * @throws ResourceManagerException upon failure */ - OrgPolicy getEffectiveOrgPolicy(String resource, String constraint); + OrgPolicy getEffectiveOrgPolicy(String resource, String constraint) throws IOException; /** * Gets the Policy on a resource. @@ -184,21 +184,22 @@ Map testOrgPermissions(String resource, List permission * * @throws ResourceManagerException upon failure */ - OrgPolicy getOrgPolicy(String resource, String constraint); + OrgPolicy getOrgPolicy(String resource, String constraint) throws IOException; /** * Lists all the Constraints that can be applied on the specified resource. * * @throws ResourceManagerException upon failure */ - ListResult listAvailableOrgPolicyConstraints(String resource, Map options); + ListResult listAvailableOrgPolicyConstraints(String resource, Map options) + throws IOException; /** * Lists all the Policies set for a particular resource. * * @throws ResourceManagerException upon failure */ - ListResult listOrgPolicies(String resource, Map options); + ListResult listOrgPolicies(String resource, Map options) throws IOException; /** * Updates the specified Policy on the resource. Creates a new Policy for that Constraint on the @@ -208,5 +209,5 @@ Map testOrgPermissions(String resource, List permission * * @throws ResourceManagerException upon failure */ - OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy); + OrgPolicy replaceOrgPolicy(String resource, OrgPolicy orgPolicy) throws IOException; } diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java index 0f2b0377..7aff93cc 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -73,7 +73,7 @@ public void testToBuilder() { @Test public void testToAndFromPb() { - compareConstraints(constraintInfo, ConstraintInfo.fromPb(constraintInfo.toPb())); + compareConstraints(constraintInfo, ConstraintInfo.fromProtobuf(constraintInfo.toProtobuf())); assertNotNull(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo)); assertNotNull( ConstraintInfo.FROM_PB_FUNCTION.apply(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo))); diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index 2c1637d9..ab8244a2 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -78,8 +78,8 @@ public void testToBuilder() { @Test public void testToAndFromPb() { - assertTrue(orgPolicyInfo.toPb().getUpdateTime().endsWith("Z")); - compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.fromPb(orgPolicyInfo.toPb())); + assertTrue(orgPolicyInfo.toProtobuf().getUpdateTime().endsWith("Z")); + compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.fromProtobuf(orgPolicyInfo.toProtobuf())); assertNotNull(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo)); assertNotNull( OrgPolicyInfo.FROM_PB_FUNCTION.apply(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo))); @@ -108,7 +108,7 @@ public void testToString() { @Test public void testListPolicyToAndFromPb() { - compareListPolicies(LIST_POLICY, LIST_POLICY.fromPb(LIST_POLICY.toPb())); + compareListPolicies(LIST_POLICY, LIST_POLICY.fromProtobuf(LIST_POLICY.toProtobuf())); } private void compareOrgPolicy(OrgPolicyInfo expected, OrgPolicyInfo value) { diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index 96bda368..7399f242 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -535,12 +535,15 @@ public void testTestOrgPermissionsWithResourceManagerException() throws IOExcept @Test public void testClearOrgPolicy() { + String exceptionMessage = "Should fail because the organization policy doesn't exist."; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); try { - RESOURCE_MANAGER.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); - fail("Should fail because the organization policy doesn't exist."); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + resourceManagerMock.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); + fail(); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @@ -559,12 +562,15 @@ public void testGetEffectiveOrgPolicy() { @Test public void testGetEffectiveOrgPolicyWithException() { + String exceptionMessage = "Not Found"; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); try { - RESOURCE_MANAGER.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); + resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); fail(); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @@ -582,19 +588,22 @@ public void testGetOrgPolicy() { @Test public void testGetOrgPolicyWithException() { + String exceptionMessage = "Not Found"; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .getOrgPolicy(RESOURCE, CONSTRAINTS); try { - RESOURCE_MANAGER.getOrgPolicy(RESOURCE, CONSTRAINTS); + resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); fail(); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @Test - public void testListAvailableOrgPolicyConstraints() { + public void testListAvailableOrgPolicyConstraints() throws IOException { ListResult expectedResult = - ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toPb())); + ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toProtobuf())); Mockito.when(resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) .thenReturn(expectedResult); ListResult page = @@ -615,19 +624,22 @@ public void testListAvailableOrgPolicyConstraints() { @Test public void listAvailableOrgPolicyConstraintsWithException() { + String exceptionMessage = "Not Found"; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .listAvailableOrgPolicyConstraints(RESOURCE); try { - RESOURCE_MANAGER.listAvailableOrgPolicyConstraints(RESOURCE); + resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE); fail(); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @Test - public void testListOrgPolicies() { + public void testListOrgPolicies() throws IOException { ListResult expectedResult = - ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toPb())); + ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toProtobuf())); Mockito.when(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) .thenReturn(expectedResult); ListResult results = @@ -650,12 +662,15 @@ public void testListOrgPolicies() { @Test public void testListOrgPoliciesWithException() { + String exceptionMessage = "Not Found"; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .listOrgPolicies(RESOURCE); try { - RESOURCE_MANAGER.listOrgPolicies(RESOURCE); + resourceManagerMock.listOrgPolicies(RESOURCE); fail(); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } @@ -673,12 +688,15 @@ public void testSetOrgPolicy() { @Test public void testSetOrgPolicyWithException() { + String exceptionMessage = "Not Found"; + Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerMock) + .replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); try { - RESOURCE_MANAGER.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); + resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); fail(); - } catch (ResourceManagerException expected) { - assertEquals(404, expected.getCode()); - assertTrue(expected.getMessage().contains("Not Found")); + } catch (RuntimeException expected) { + assertEquals(exceptionMessage, expected.getMessage()); } } } From e71b94b8a78820c18c5802b18b9dd195ee09cce8 Mon Sep 17 00:00:00 2001 From: athakor Date: Fri, 3 Apr 2020 14:52:49 +0530 Subject: [PATCH 10/14] feat: fix review changes --- .../cloud/resourcemanager/ConstraintInfo.java | 48 +++++++++++-------- .../cloud/resourcemanager/OrgPolicyInfo.java | 41 +++++++++------- .../resourcemanager/ResourceManagerImpl.java | 5 +- .../spi/v1beta1/ResourceManagerRpc.java | 6 +-- .../resourcemanager/ConstraintInfoTest.java | 5 +- .../resourcemanager/OrgPolicyInfoTest.java | 5 +- 6 files changed, 64 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index 97e9d55e..ba95e392 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -23,19 +23,29 @@ import java.io.Serializable; import java.util.Objects; -/** A Google Cloud Resource Manager constraint metadata object. */ +/** + * A Google Cloud Resource Manager constraint metadata object. + * + *

A Constraint describes a way in which a resource's configuration can be restricted. For + * example, it controls which cloud services can be activated across an organization, or whether a + * Compute Engine instance can have serial port connections established. Constraints can be + * configured by the organization's policy administrator to fit the needs of the organization by + * setting Policies for Constraints at different locations in the organization's resource hierarchy. + * Policies are inherited down the resource hierarchy from higher levels, but can also be + * overridden. For details about the inheritance rules please read about Policies. + */ public class ConstraintInfo implements Serializable { private static final long serialVersionUID = 9148970963697734236L; - static final Function FROM_PB_FUNCTION = + static final Function FROM_PROTOBUF_FUNCTION = new Function() { @Override public ConstraintInfo apply(Constraint protobuf) { return ConstraintInfo.fromProtobuf(protobuf); } }; - static final Function TO_PB_FUNCTION = + static final Function TO_PROTOBUF_FUNCTION = new Function() { @Override public Constraint apply(ConstraintInfo constraintInfo) { @@ -263,28 +273,28 @@ Constraint toProtobuf() { return constraintProto; } - static ConstraintInfo fromProtobuf(Constraint constraintPb) { - Builder builder = newBuilder(constraintPb.getName()); - if (constraintPb.getBooleanConstraint() != null) { - builder.setBooleanConstraint(constraintPb.getBooleanConstraint()); + static ConstraintInfo fromProtobuf(Constraint constraintProtobuf) { + Builder builder = newBuilder(constraintProtobuf.getName()); + if (constraintProtobuf.getBooleanConstraint() != null) { + builder.setBooleanConstraint(constraintProtobuf.getBooleanConstraint()); } - if (constraintPb.getConstraintDefault() != null) { - builder.setConstraintDefault(constraintPb.getConstraintDefault()); + if (constraintProtobuf.getConstraintDefault() != null) { + builder.setConstraintDefault(constraintProtobuf.getConstraintDefault()); } - if (constraintPb.getDescription() != null) { - builder.setDescription(constraintPb.getDescription()); + if (constraintProtobuf.getDescription() != null) { + builder.setDescription(constraintProtobuf.getDescription()); } - if (constraintPb.getDisplayName() != null) { - builder.setDisplayName(constraintPb.getDisplayName()); + if (constraintProtobuf.getDisplayName() != null) { + builder.setDisplayName(constraintProtobuf.getDisplayName()); } - if (constraintPb.getListConstraint() != null) { - builder.setConstraints(Constraints.fromProtobuf(constraintPb.getListConstraint())); + if (constraintProtobuf.getListConstraint() != null) { + builder.setConstraints(Constraints.fromProtobuf(constraintProtobuf.getListConstraint())); } - if (constraintPb.getName() != null && !constraintPb.getName().equals("Unnamed")) { - builder.setName(constraintPb.getName()); + if (constraintProtobuf.getName() != null && !constraintProtobuf.getName().equals("Unnamed")) { + builder.setName(constraintProtobuf.getName()); } - if (constraintPb.getVersion() != null) { - builder.setVersion(constraintPb.getVersion()); + if (constraintProtobuf.getVersion() != null) { + builder.setVersion(constraintProtobuf.getVersion()); } return builder.build(); } diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index aaa41124..953bd10f 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -25,19 +25,24 @@ import java.util.List; import java.util.Objects; -/** A Google Cloud Resource Manager organization policy metadata object. */ +/** + * A Google Cloud Resource Manager organization policy metadata object. + * + *

Defines a Cloud Organization Policy which specifies constraints for configurations of Cloud + * Platform resources. + */ public class OrgPolicyInfo implements Serializable { private static final long serialVersionUID = 9148970963697734236L; - static final Function FROM_PB_FUNCTION = + static final Function FROM_PROTOBUF_FUNCTION = new Function() { @Override public OrgPolicyInfo apply(OrgPolicy protobuf) { return OrgPolicyInfo.fromProtobuf(protobuf); } }; - static final Function TO_PB_FUNCTION = + static final Function TO_PROTOBUF_FUNCTION = new Function() { @Override public OrgPolicy apply(OrgPolicyInfo orgPolicyInfo) { @@ -365,28 +370,28 @@ OrgPolicy toProtobuf() { return orgPolicyProto; } - static OrgPolicyInfo fromProtobuf(OrgPolicy orgPolicyPb) { + static OrgPolicyInfo fromProtobuf(OrgPolicy orgPolicyProtobuf) { Builder builder = newBuilder(); - if (orgPolicyPb.getBooleanPolicy() != null) { - builder.setBoolPolicy(BoolPolicy.fromProtobuf(orgPolicyPb.getBooleanPolicy())); + if (orgPolicyProtobuf.getBooleanPolicy() != null) { + builder.setBoolPolicy(BoolPolicy.fromProtobuf(orgPolicyProtobuf.getBooleanPolicy())); } - if (orgPolicyPb.getConstraint() != null) { - builder.setConstraint(orgPolicyPb.getConstraint()); + if (orgPolicyProtobuf.getConstraint() != null) { + builder.setConstraint(orgPolicyProtobuf.getConstraint()); } - if (orgPolicyPb.getListPolicy() != null) { - builder.setListPolicy(Policies.fromProtobuf(orgPolicyPb.getListPolicy())); + if (orgPolicyProtobuf.getListPolicy() != null) { + builder.setListPolicy(Policies.fromProtobuf(orgPolicyProtobuf.getListPolicy())); } - if (orgPolicyPb.getRestoreDefault() != null) { - builder.setRestoreDefault(orgPolicyPb.getRestoreDefault()); + if (orgPolicyProtobuf.getRestoreDefault() != null) { + builder.setRestoreDefault(orgPolicyProtobuf.getRestoreDefault()); } - if (orgPolicyPb.getEtag() != null) { - builder.setEtag(orgPolicyPb.getEtag()); + if (orgPolicyProtobuf.getEtag() != null) { + builder.setEtag(orgPolicyProtobuf.getEtag()); } - if (orgPolicyPb.getUpdateTime() != null) { - builder.setUpdateTime(orgPolicyPb.getUpdateTime()); + if (orgPolicyProtobuf.getUpdateTime() != null) { + builder.setUpdateTime(orgPolicyProtobuf.getUpdateTime()); } - if (orgPolicyPb.getVersion() != null) { - builder.setVersion(orgPolicyPb.getVersion()); + if (orgPolicyProtobuf.getVersion() != null) { + builder.setVersion(orgPolicyProtobuf.getVersion()); } return builder.build(); } diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java index 45c8693f..f26d0e9b 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManagerImpl.java @@ -404,7 +404,8 @@ public ListResult call() throws IOException { Iterable constraints = constraintList.results() == null ? ImmutableList.of() - : Iterables.transform(constraintList.results(), ConstraintInfo.FROM_PB_FUNCTION); + : Iterables.transform( + constraintList.results(), ConstraintInfo.FROM_PROTOBUF_FUNCTION); return new PageImpl<>( new ConstraintPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, @@ -464,7 +465,7 @@ public ListResult call() throws IOException { Iterable orgPolicies = orgPolicy.results() == null ? ImmutableList.of() - : Iterables.transform(orgPolicy.results(), OrgPolicyInfo.FROM_PB_FUNCTION); + : Iterables.transform(orgPolicy.results(), OrgPolicyInfo.FROM_PROTOBUF_FUNCTION); return new PageImpl<>( new OrgPolicyPageFetcher(resource, serviceOptions, cursor, optionsMap), cursor, diff --git a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java index a93d3e28..ee091999 100644 --- a/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java +++ b/src/main/java/com/google/cloud/resourcemanager/spi/v1beta1/ResourceManagerRpc.java @@ -65,7 +65,7 @@ class ListResult { private final Iterable results; private final String pageToken; - public ListResult(String pageToken, Iterable results) { + ListResult(String pageToken, Iterable results) { this.results = ImmutableList.copyOf(results); this.pageToken = pageToken; } @@ -165,9 +165,9 @@ Map testOrgPermissions(String resource, List permission void clearOrgPolicy(String resource, OrgPolicy orgPolicy) throws IOException; /** - * Gets the effective Policy on a resource + * Gets the effective Policy on a resource. * - *

This is the result of merging Policies in the resource hierarchy. The returned Policy will + *

This is the result of merging Policies in the resource hierarchy. The returned Policy does * not have an etag set because it is a computed Policy across multiple resources. Subtrees of * Resource Manager resource hierarchy with 'under:' prefix will not be expanded. * diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java index 7aff93cc..c23d1e75 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -74,9 +74,10 @@ public void testToBuilder() { @Test public void testToAndFromPb() { compareConstraints(constraintInfo, ConstraintInfo.fromProtobuf(constraintInfo.toProtobuf())); - assertNotNull(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo)); + assertNotNull(ConstraintInfo.TO_PROTOBUF_FUNCTION.apply(constraintInfo)); assertNotNull( - ConstraintInfo.FROM_PB_FUNCTION.apply(ConstraintInfo.TO_PB_FUNCTION.apply(constraintInfo))); + ConstraintInfo.FROM_PROTOBUF_FUNCTION.apply( + ConstraintInfo.TO_PROTOBUF_FUNCTION.apply(constraintInfo))); } @Test diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index ab8244a2..ec6f049f 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -80,9 +80,10 @@ public void testToBuilder() { public void testToAndFromPb() { assertTrue(orgPolicyInfo.toProtobuf().getUpdateTime().endsWith("Z")); compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.fromProtobuf(orgPolicyInfo.toProtobuf())); - assertNotNull(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo)); + assertNotNull(OrgPolicyInfo.TO_PROTOBUF_FUNCTION.apply(orgPolicyInfo)); assertNotNull( - OrgPolicyInfo.FROM_PB_FUNCTION.apply(OrgPolicyInfo.TO_PB_FUNCTION.apply(orgPolicyInfo))); + OrgPolicyInfo.FROM_PROTOBUF_FUNCTION.apply( + OrgPolicyInfo.TO_PROTOBUF_FUNCTION.apply(orgPolicyInfo))); } @Test From 9d4e4a5a5607ef3dd5d7be4516620b77f085ca86 Mon Sep 17 00:00:00 2001 From: athakor Date: Mon, 6 Apr 2020 14:07:33 +0530 Subject: [PATCH 11/14] feat: fix all the testcases --- .../ResourceManagerImplTest.java | 313 ++++++++++++------ 1 file changed, 210 insertions(+), 103 deletions(-) diff --git a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java index 7399f242..7f5545e8 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ResourceManagerImplTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -55,7 +56,6 @@ import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; @@ -129,8 +129,6 @@ public class ResourceManagerImplTest { private ResourceManagerRpcFactory rpcFactoryMock = Mockito.mock(ResourceManagerRpcFactory.class); private ResourceManagerRpc resourceManagerRpcMock = Mockito.mock(ResourceManagerRpc.class); - @Mock private ResourceManager resourceManagerMock; - @BeforeClass public static void beforeClass() { RESOURCE_MANAGER_HELPER.start(); @@ -443,43 +441,63 @@ public void testTestPermissions() { @Test public void testRetryableException() { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Internal Error"; - Mockito.doThrow(new ResourceManagerException(500, exceptionMessage)) - .when(resourceManagerMock) - .get(PARTIAL_PROJECT.getProjectId()); + doThrow(new ResourceManagerException(500, exceptionMessage)) + .when(resourceManagerRpcMock) + .get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS); try { - resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); - fail(); - } catch (RuntimeException expected) { + resourceManager.get(PARTIAL_PROJECT.getProjectId()); + } catch (ResourceManagerException expected) { + assertEquals(500, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test public void testNonRetryableException() { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Project " + PARTIAL_PROJECT.getProjectId() + " not found."; - Mockito.doThrow(new ResourceManagerException(403, exceptionMessage)) - .when(resourceManagerMock) - .get(PARTIAL_PROJECT.getProjectId()); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS); try { - resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); - fail(); - } catch (RuntimeException expected) { + resourceManager.get(PARTIAL_PROJECT.getProjectId()); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test public void testRuntimeException() { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Artificial runtime exception"; - Mockito.doThrow(new RuntimeException(exceptionMessage)) - .when(resourceManagerMock) - .get(PARTIAL_PROJECT.getProjectId()); + doThrow(new RuntimeException(exceptionMessage)) + .when(resourceManagerRpcMock) + .get(PARTIAL_PROJECT.getProjectId(), EMPTY_RPC_OPTIONS); try { - resourceManagerMock.get(PARTIAL_PROJECT.getProjectId()); - fail(); + resourceManager.get(PARTIAL_PROJECT.getProjectId()); } catch (RuntimeException expected) { - assertEquals(exceptionMessage, expected.getMessage()); + assertTrue(expected.getMessage().contains(exceptionMessage)); } } @@ -534,168 +552,257 @@ public void testTestOrgPermissionsWithResourceManagerException() throws IOExcept } @Test - public void testClearOrgPolicy() { + public void testClearOrgPolicy() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + doNothing().when(resourceManagerRpcMock).clearOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf()); + resourceManager.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); + verify(resourceManagerRpcMock).clearOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf()); + } + + @Test + public void testClearOrgPolicyWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Should fail because the organization policy doesn't exist."; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) - .clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .clearOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf()); try { - resourceManagerMock.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); - fail(); - } catch (RuntimeException expected) { + resourceManager.clearOrgPolicy(RESOURCE, ORG_POLICY_INFO); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test - public void testGetEffectiveOrgPolicy() { - Mockito.when(resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS)) - .thenReturn(ORG_POLICY_INFO); - OrgPolicyInfo policyInfo = resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); + public void testGetEffectiveOrgPolicy() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + when(resourceManagerRpcMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS)) + .thenReturn(ORG_POLICY_INFO.toProtobuf()); + OrgPolicyInfo policyInfo = resourceManager.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); assertEquals(ETAG, policyInfo.getEtag()); assertEquals(LIST_POLICY, policyInfo.getPolicies()); assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); assertEquals(VERSION, policyInfo.getVersion()); + + verify(resourceManagerRpcMock).getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); } @Test - public void testGetEffectiveOrgPolicyWithException() { + public void testGetEffectiveOrgPolicyWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Not Found"; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) .getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); try { - resourceManagerMock.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); - fail(); - } catch (RuntimeException expected) { + resourceManager.getEffectiveOrgPolicy(RESOURCE, CONSTRAINTS); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test - public void testGetOrgPolicy() { - Mockito.when(resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS)) - .thenReturn(ORG_POLICY_INFO); - OrgPolicyInfo policyInfo = resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); + public void testGetOrgPolicy() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + when(resourceManagerRpcMock.getOrgPolicy(RESOURCE, CONSTRAINTS)) + .thenReturn(ORG_POLICY_INFO.toProtobuf()); + OrgPolicyInfo policyInfo = resourceManager.getOrgPolicy(RESOURCE, CONSTRAINTS); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); assertEquals(LIST_POLICY, policyInfo.getPolicies()); assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); assertEquals(VERSION, policyInfo.getVersion()); + + verify(resourceManagerRpcMock).getOrgPolicy(RESOURCE, CONSTRAINTS); } @Test - public void testGetOrgPolicyWithException() { + public void testGetOrgPolicyWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Not Found"; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) .getOrgPolicy(RESOURCE, CONSTRAINTS); try { - resourceManagerMock.getOrgPolicy(RESOURCE, CONSTRAINTS); - fail(); - } catch (RuntimeException expected) { + resourceManager.getOrgPolicy(RESOURCE, CONSTRAINTS); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test public void testListAvailableOrgPolicyConstraints() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); ListResult expectedResult = ListResult.of(CURSOR, ImmutableList.of(CONSTRAINT_INFO.toProtobuf())); - Mockito.when(resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) + when(resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS)) .thenReturn(expectedResult); - ListResult page = - resourceManagerRpcMock.listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS); - assertEquals(CURSOR, page.pageToken()); - for (Constraint constraint : page.results()) { - assertEquals(NAME, constraint.getName()); - assertEquals(CONSTRAINT_DEFAULT, constraint.getConstraintDefault()); - assertEquals(DISPLAY_NAME, constraint.getDisplayName()); - assertEquals(DESCRIPTION, constraint.getDescription()); - assertEquals( - LIST_CONSTRAINT.getSuggestedValue(), constraint.getListConstraint().getSuggestedValue()); - assertEquals( - LIST_CONSTRAINT.getSupportsUnder(), constraint.getListConstraint().getSupportsUnder()); - assertEquals(VERSION, constraint.getVersion()); + Page page = resourceManager.listAvailableOrgPolicyConstraints(NAME); + assertEquals(CURSOR, page.getNextPageToken()); + for (ConstraintInfo constraintInfo : page.getValues()) { + assertEquals(NAME, constraintInfo.getName()); + assertEquals(CONSTRAINT_DEFAULT, constraintInfo.getConstraintDefault()); + assertEquals(DISPLAY_NAME, constraintInfo.getDisplayName()); + assertEquals(DESCRIPTION, constraintInfo.getDescription()); + assertEquals(LIST_CONSTRAINT, constraintInfo.getConstraints()); + assertEquals(VERSION, constraintInfo.getVersion()); } + verify(resourceManagerRpcMock).listAvailableOrgPolicyConstraints(NAME, EMPTY_RPC_OPTIONS); } @Test - public void listAvailableOrgPolicyConstraintsWithException() { + public void listAvailableOrgPolicyConstraintsWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Not Found"; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) - .listAvailableOrgPolicyConstraints(RESOURCE); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .listAvailableOrgPolicyConstraints(RESOURCE, EMPTY_RPC_OPTIONS); try { - resourceManagerMock.listAvailableOrgPolicyConstraints(RESOURCE); - fail(); - } catch (RuntimeException expected) { + resourceManager.listAvailableOrgPolicyConstraints(RESOURCE); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test public void testListOrgPolicies() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); ListResult expectedResult = ListResult.of(CURSOR, ImmutableList.of(ORG_POLICY_INFO.toProtobuf())); - Mockito.when(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) + when(resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS)) .thenReturn(expectedResult); - ListResult results = - resourceManagerRpcMock.listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS); - assertEquals(CURSOR, results.pageToken()); - for (OrgPolicy orgPolicy : results.results()) { - assertEquals(CONSTRAINTS, orgPolicy.getConstraint()); - assertEquals(ETAG, orgPolicy.getEtag()); - assertEquals(BOOLEAN_POLICY.getEnforce(), orgPolicy.getBooleanPolicy().getEnforced()); - assertEquals(LIST_POLICY.getAllValues(), orgPolicy.getListPolicy().getAllValues()); - assertEquals(LIST_POLICY.getAllowedValues(), orgPolicy.getListPolicy().getAllowedValues()); - assertEquals(LIST_POLICY.getDeniedValues(), orgPolicy.getListPolicy().getDeniedValues()); - assertEquals( - LIST_POLICY.getInheritFromParent(), orgPolicy.getListPolicy().getInheritFromParent()); - assertEquals(LIST_POLICY.getSuggestedValue(), orgPolicy.getListPolicy().getSuggestedValue()); - assertEquals(UPDATE_TIME, orgPolicy.getUpdateTime()); - assertEquals(VERSION, orgPolicy.getVersion()); + Page policies = resourceManager.listOrgPolicies(RESOURCE); + assertEquals(CURSOR, policies.getNextPageToken()); + for (OrgPolicyInfo orgPolicyInfo : policies.getValues()) { + assertEquals(CONSTRAINTS, orgPolicyInfo.getConstraint()); + assertEquals(ETAG, orgPolicyInfo.getEtag()); + assertEquals(BOOLEAN_POLICY, orgPolicyInfo.getBoolPolicy()); + assertEquals(LIST_POLICY, orgPolicyInfo.getPolicies()); + assertEquals(UPDATE_TIME, orgPolicyInfo.getUpdateTime()); + assertEquals(VERSION, orgPolicyInfo.getVersion()); } + verify(resourceManagerRpcMock).listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS); } @Test - public void testListOrgPoliciesWithException() { + public void testListOrgPoliciesWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Not Found"; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) - .listOrgPolicies(RESOURCE); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .listOrgPolicies(RESOURCE, EMPTY_RPC_OPTIONS); try { - resourceManagerMock.listOrgPolicies(RESOURCE); - fail(); - } catch (RuntimeException expected) { + resourceManager.listOrgPolicies(RESOURCE); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } @Test - public void testSetOrgPolicy() { - Mockito.when(resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO)) - .thenReturn(ORG_POLICY_INFO); - OrgPolicyInfo policyInfo = resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); + public void testSetOrgPolicy() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); + when(resourceManagerRpcMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf())) + .thenReturn(ORG_POLICY_INFO.toProtobuf()); + OrgPolicyInfo policyInfo = resourceManager.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); assertEquals(CONSTRAINTS, policyInfo.getConstraint()); assertEquals(BOOLEAN_POLICY, policyInfo.getBoolPolicy()); assertEquals(LIST_POLICY, policyInfo.getPolicies()); assertEquals(UPDATE_TIME, policyInfo.getUpdateTime()); assertEquals(VERSION, policyInfo.getVersion()); + + verify(resourceManagerRpcMock).replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf()); } @Test - public void testSetOrgPolicyWithException() { + public void testSetOrgPolicyWithResourceManagerException() throws IOException { + when(rpcFactoryMock.create(Mockito.any(ResourceManagerOptions.class))) + .thenReturn(resourceManagerRpcMock); + ResourceManager resourceManager = + ResourceManagerOptions.newBuilder() + .setServiceRpcFactory(rpcFactoryMock) + .build() + .getService(); String exceptionMessage = "Not Found"; - Mockito.doThrow(new ResourceManagerException(404, exceptionMessage)) - .when(resourceManagerMock) - .replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); + doThrow(new ResourceManagerException(404, exceptionMessage)) + .when(resourceManagerRpcMock) + .replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO.toProtobuf()); try { - resourceManagerMock.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); - fail(); - } catch (RuntimeException expected) { + resourceManager.replaceOrgPolicy(RESOURCE, ORG_POLICY_INFO); + } catch (ResourceManagerException expected) { + assertEquals(404, expected.getCode()); assertEquals(exceptionMessage, expected.getMessage()); } } From 75d965edf4de0563f5c07976824ecee08a4a8ad8 Mon Sep 17 00:00:00 2001 From: athakor Date: Mon, 13 Apr 2020 13:29:22 +0530 Subject: [PATCH 12/14] feat: fix review changes --- .../cloud/resourcemanager/ConstraintInfo.java | 70 +++++++++---------- .../cloud/resourcemanager/OrgPolicyInfo.java | 68 ++++++++---------- .../resourcemanager/ConstraintInfoTest.java | 2 +- .../resourcemanager/OrgPolicyInfoTest.java | 4 +- 4 files changed, 63 insertions(+), 81 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index ba95e392..ad5b18eb 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -26,13 +26,8 @@ /** * A Google Cloud Resource Manager constraint metadata object. * - *

A Constraint describes a way in which a resource's configuration can be restricted. For - * example, it controls which cloud services can be activated across an organization, or whether a - * Compute Engine instance can have serial port connections established. Constraints can be - * configured by the organization's policy administrator to fit the needs of the organization by - * setting Policies for Constraints at different locations in the organization's resource hierarchy. - * Policies are inherited down the resource hierarchy from higher levels, but can also be - * overridden. For details about the inheritance rules please read about Policies. + * @see Constraint */ public class ConstraintInfo implements Serializable { @@ -65,9 +60,7 @@ public Constraint apply(ConstraintInfo constraintInfo) { * A Constraint that allows or disallows a list of string values, which are configured by an * Organization's policy administrator with a Policy. */ - static class Constraints implements Serializable { - - private static final long serialVersionUID = -2133042982786959352L; + static class Constraints { private final String suggestedValue; private final Boolean supportsUnder; @@ -77,11 +70,18 @@ static class Constraints implements Serializable { this.supportsUnder = supportsUnder; } - public String getSuggestedValue() { + /** + * The Google Cloud Console tries to default to a configuration that matches the value specified + * in this Constraint. + */ + String getSuggestedValue() { return suggestedValue; } - - public Boolean getSupportsUnder() { + /** + * Indicates whether subtrees of Cloud Resource Manager resource hierarchy can be used in + * Policy.allowed_values and Policy.denied_values. + */ + Boolean getSupportsUnder() { return supportsUnder; } @@ -100,8 +100,12 @@ public int hashCode() { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } Constraints that = (Constraints) o; return Objects.equals(suggestedValue, that.suggestedValue) && Objects.equals(supportsUnder, that.supportsUnder); @@ -140,42 +144,42 @@ static class Builder { this.version = info.version; } - public Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { + Builder setBooleanConstraint(BooleanConstraint booleanConstraint) { this.booleanConstraint = booleanConstraint; return this; } - public Builder setConstraintDefault(String constraintDefault) { + Builder setConstraintDefault(String constraintDefault) { this.constraintDefault = constraintDefault; return this; } - public Builder setDescription(String description) { + Builder setDescription(String description) { this.description = description; return this; } - public Builder setDisplayName(String displayName) { + Builder setDisplayName(String displayName) { this.displayName = displayName; return this; } - public Builder setConstraints(Constraints constraints) { + Builder setConstraints(Constraints constraints) { this.constraints = constraints; return this; } - public Builder setName(String name) { + Builder setName(String name) { this.name = name; return this; } - public Builder setVersion(Integer version) { + Builder setVersion(Integer version) { this.version = version; return this; } - public ConstraintInfo build() { + ConstraintInfo build() { return new ConstraintInfo(this); } } @@ -275,27 +279,17 @@ Constraint toProtobuf() { static ConstraintInfo fromProtobuf(Constraint constraintProtobuf) { Builder builder = newBuilder(constraintProtobuf.getName()); - if (constraintProtobuf.getBooleanConstraint() != null) { - builder.setBooleanConstraint(constraintProtobuf.getBooleanConstraint()); - } - if (constraintProtobuf.getConstraintDefault() != null) { - builder.setConstraintDefault(constraintProtobuf.getConstraintDefault()); - } - if (constraintProtobuf.getDescription() != null) { - builder.setDescription(constraintProtobuf.getDescription()); - } - if (constraintProtobuf.getDisplayName() != null) { - builder.setDisplayName(constraintProtobuf.getDisplayName()); - } + builder.setBooleanConstraint(constraintProtobuf.getBooleanConstraint()); + builder.setConstraintDefault(constraintProtobuf.getConstraintDefault()); + builder.setDescription(constraintProtobuf.getDescription()); + builder.setDisplayName(constraintProtobuf.getDisplayName()); if (constraintProtobuf.getListConstraint() != null) { builder.setConstraints(Constraints.fromProtobuf(constraintProtobuf.getListConstraint())); } if (constraintProtobuf.getName() != null && !constraintProtobuf.getName().equals("Unnamed")) { builder.setName(constraintProtobuf.getName()); } - if (constraintProtobuf.getVersion() != null) { - builder.setVersion(constraintProtobuf.getVersion()); - } + builder.setVersion(constraintProtobuf.getVersion()); return builder.build(); } } diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 953bd10f..6cf1078c 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -119,9 +119,7 @@ static BoolPolicy fromProtobuf(BooleanPolicy booleanPolicy) { * used to allow or deny all values. If allValues is set to either ALLOW or DENY, allowedValues * and deniedValues must be unset. */ - static class Policies implements Serializable { - - private static final long serialVersionUID = -2133042982786959352L; + static class Policies { private final String allValues; private final List allowedValues; @@ -129,7 +127,7 @@ static class Policies implements Serializable { private final Boolean inheritFromParent; private final String suggestedValue; - public Policies( + Policies( String allValues, List allowedValues, List deniedValues, @@ -143,27 +141,27 @@ public Policies( } /** Returns all the Values state of this policy. */ - public String getAllValues() { + String getAllValues() { return allValues; } /** Returns the list of allowed values of this resource */ - public List getAllowedValues() { + List getAllowedValues() { return allowedValues; } /** Returns the list of denied values of this resource. */ - public List getDeniedValues() { + List getDeniedValues() { return deniedValues; } /** Returns the inheritance behavior for this Policy */ - public Boolean getInheritFromParent() { + Boolean getInheritFromParent() { return inheritFromParent; } /** Returns the suggested value of this policy. */ - public String getSuggestedValue() { + String getSuggestedValue() { return suggestedValue; } @@ -241,42 +239,42 @@ static class Builder { this.version = info.version; } - public Builder setBoolPolicy(BoolPolicy boolPolicy) { + Builder setBoolPolicy(BoolPolicy boolPolicy) { this.boolPolicy = boolPolicy; return this; } - public Builder setConstraint(String constraint) { + Builder setConstraint(String constraint) { this.constraint = constraint; return this; } - public Builder setEtag(String etag) { + Builder setEtag(String etag) { this.etag = etag; return this; } - public Builder setListPolicy(Policies policies) { + Builder setListPolicy(Policies policies) { this.policies = policies; return this; } - public Builder setRestoreDefault(RestoreDefault restoreDefault) { + Builder setRestoreDefault(RestoreDefault restoreDefault) { this.restoreDefault = restoreDefault; return this; } - public Builder setUpdateTime(String updateTime) { + Builder setUpdateTime(String updateTime) { this.updateTime = updateTime; return this; } - public Builder setVersion(Integer version) { + Builder setVersion(Integer version) { this.version = version; return this; } - public OrgPolicyInfo build() { + OrgPolicyInfo build() { return new OrgPolicyInfo(this); } } @@ -328,14 +326,14 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) { return false; } - OrgPolicyInfo that = (OrgPolicyInfo) o; - return Objects.equals(boolPolicy, that.boolPolicy) - && Objects.equals(constraint, that.constraint) - && Objects.equals(etag, that.etag) - && Objects.equals(policies, that.policies) - && Objects.equals(restoreDefault, that.restoreDefault) - && Objects.equals(updateTime, that.updateTime) - && Objects.equals(version, that.version); + OrgPolicyInfo policyInfo = (OrgPolicyInfo) o; + return Objects.equals(boolPolicy, policyInfo.boolPolicy) + && Objects.equals(constraint, policyInfo.constraint) + && Objects.equals(etag, policyInfo.etag) + && Objects.equals(policies, policyInfo.policies) + && Objects.equals(restoreDefault, policyInfo.restoreDefault) + && Objects.equals(updateTime, policyInfo.updateTime) + && Objects.equals(version, policyInfo.version); } @Override @@ -375,24 +373,14 @@ static OrgPolicyInfo fromProtobuf(OrgPolicy orgPolicyProtobuf) { if (orgPolicyProtobuf.getBooleanPolicy() != null) { builder.setBoolPolicy(BoolPolicy.fromProtobuf(orgPolicyProtobuf.getBooleanPolicy())); } - if (orgPolicyProtobuf.getConstraint() != null) { - builder.setConstraint(orgPolicyProtobuf.getConstraint()); - } + builder.setConstraint(orgPolicyProtobuf.getConstraint()); if (orgPolicyProtobuf.getListPolicy() != null) { builder.setListPolicy(Policies.fromProtobuf(orgPolicyProtobuf.getListPolicy())); } - if (orgPolicyProtobuf.getRestoreDefault() != null) { - builder.setRestoreDefault(orgPolicyProtobuf.getRestoreDefault()); - } - if (orgPolicyProtobuf.getEtag() != null) { - builder.setEtag(orgPolicyProtobuf.getEtag()); - } - if (orgPolicyProtobuf.getUpdateTime() != null) { - builder.setUpdateTime(orgPolicyProtobuf.getUpdateTime()); - } - if (orgPolicyProtobuf.getVersion() != null) { - builder.setVersion(orgPolicyProtobuf.getVersion()); - } + builder.setRestoreDefault(orgPolicyProtobuf.getRestoreDefault()); + builder.setEtag(orgPolicyProtobuf.getEtag()); + builder.setUpdateTime(orgPolicyProtobuf.getUpdateTime()); + builder.setVersion(orgPolicyProtobuf.getVersion()); return builder.build(); } } diff --git a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java index c23d1e75..a8c870cc 100644 --- a/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/ConstraintInfoTest.java @@ -72,7 +72,7 @@ public void testToBuilder() { } @Test - public void testToAndFromPb() { + public void testToAndFromProtobuf() { compareConstraints(constraintInfo, ConstraintInfo.fromProtobuf(constraintInfo.toProtobuf())); assertNotNull(ConstraintInfo.TO_PROTOBUF_FUNCTION.apply(constraintInfo)); assertNotNull( diff --git a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java index ec6f049f..b021ed56 100644 --- a/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java +++ b/src/test/java/com/google/cloud/resourcemanager/OrgPolicyInfoTest.java @@ -77,7 +77,7 @@ public void testToBuilder() { } @Test - public void testToAndFromPb() { + public void testToAndFromProtobuf() { assertTrue(orgPolicyInfo.toProtobuf().getUpdateTime().endsWith("Z")); compareOrgPolicy(orgPolicyInfo, orgPolicyInfo.fromProtobuf(orgPolicyInfo.toProtobuf())); assertNotNull(OrgPolicyInfo.TO_PROTOBUF_FUNCTION.apply(orgPolicyInfo)); @@ -108,7 +108,7 @@ public void testToString() { } @Test - public void testListPolicyToAndFromPb() { + public void testListPolicyToAndFromProtobuf() { compareListPolicies(LIST_POLICY, LIST_POLICY.fromProtobuf(LIST_POLICY.toProtobuf())); } From b427ee190a8ba96d6d8d08646e5f22ce826c36ca Mon Sep 17 00:00:00 2001 From: athakor Date: Mon, 13 Apr 2020 19:09:43 +0530 Subject: [PATCH 13/14] feat: address feedback --- .../com/google/cloud/resourcemanager/ConstraintInfo.java | 6 ++---- .../com/google/cloud/resourcemanager/OrgPolicyInfo.java | 8 ++------ .../com/google/cloud/resourcemanager/ResourceManager.java | 4 ++-- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java index ad5b18eb..b6ddc915 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/ConstraintInfo.java @@ -20,7 +20,6 @@ import com.google.api.services.cloudresourcemanager.model.ListConstraint; import com.google.common.base.Function; import com.google.common.base.MoreObjects; -import java.io.Serializable; import java.util.Objects; /** @@ -29,9 +28,7 @@ * @see Constraint */ -public class ConstraintInfo implements Serializable { - - private static final long serialVersionUID = 9148970963697734236L; +public class ConstraintInfo { static final Function FROM_PROTOBUF_FUNCTION = new Function() { @@ -77,6 +74,7 @@ static class Constraints { String getSuggestedValue() { return suggestedValue; } + /** * Indicates whether subtrees of Cloud Resource Manager resource hierarchy can be used in * Policy.allowed_values and Policy.denied_values. diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 6cf1078c..2c2da58f 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -21,7 +21,6 @@ import com.google.api.services.cloudresourcemanager.model.RestoreDefault; import com.google.common.base.Function; import com.google.common.base.MoreObjects; -import java.io.Serializable; import java.util.List; import java.util.Objects; @@ -31,9 +30,7 @@ *

Defines a Cloud Organization Policy which specifies constraints for configurations of Cloud * Platform resources. */ -public class OrgPolicyInfo implements Serializable { - - private static final long serialVersionUID = 9148970963697734236L; +public class OrgPolicyInfo { static final Function FROM_PROTOBUF_FUNCTION = new Function() { @@ -59,9 +56,8 @@ public OrgPolicy apply(OrgPolicyInfo orgPolicyInfo) { private Integer version; /** Used For boolean Constraints, whether to enforce the Constraint or not. */ - static class BoolPolicy implements Serializable { + static class BoolPolicy { - private static final long serialVersionUID = -2133042982786959351L; private final Boolean enforce; BoolPolicy(Boolean enforce) { diff --git a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java index 57d49b6a..873db051 100644 --- a/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java +++ b/src/main/java/com/google/cloud/resourcemanager/ResourceManager.java @@ -421,7 +421,7 @@ public static ListOption pageSize(int pageSize) { OrgPolicyInfo getOrgPolicy(String resource, String constraint); /** - * Lists all the Constraints that could be applied on the specified resource. + * Lists the Constraints that could be applied on the specified resource. * * @throws ResourceManagerException upon failure * @see listAvailableOrgPolicyConstraints(String resource, ListOption... options); /** - * Lists all the Policies set for a particular resource. + * Lists the Policies set for a particular resource. * * @throws ResourceManagerException upon failure * @see Date: Mon, 13 Apr 2020 19:37:38 +0530 Subject: [PATCH 14/14] feat: address feedback --- .../com/google/cloud/resourcemanager/OrgPolicyInfo.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java index 2c2da58f..55dc2001 100644 --- a/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java +++ b/src/main/java/com/google/cloud/resourcemanager/OrgPolicyInfo.java @@ -289,26 +289,32 @@ OrgPolicyInfo build() { public BoolPolicy getBoolPolicy() { return boolPolicy; } + /** Returns the name of the Constraint. */ public String getConstraint() { return constraint; } - /** */ + + /** Returns the etag value of policy. */ public String getEtag() { return etag; } + /** Return the policies. */ public Policies getPolicies() { return policies; } + /** Restores the default behavior of the constraint. */ public RestoreDefault getRestoreDefault() { return restoreDefault; } + /** Returns the updated timestamp of policy. */ public String getUpdateTime() { return updateTime; } + /** Returns the version of the Policy, Default version is 0. */ public Integer getVersion() { return version;