com.google.gcloud.resourcemanager.ResourceManagerImpl Maven / Gradle / Ivy
/*
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.gcloud.resourcemanager;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.gcloud.RetryHelper.runWithRetries;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.gcloud.BaseService;
import com.google.gcloud.Page;
import com.google.gcloud.PageImpl;
import com.google.gcloud.PageImpl.NextPageFetcher;
import com.google.gcloud.RetryHelper.RetryHelperException;
import com.google.gcloud.resourcemanager.spi.ResourceManagerRpc;
import com.google.gcloud.resourcemanager.spi.ResourceManagerRpc.Tuple;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
final class ResourceManagerImpl
extends BaseService implements ResourceManager {
private final ResourceManagerRpc resourceManagerRpc;
ResourceManagerImpl(ResourceManagerOptions options) {
super(options);
resourceManagerRpc = options.rpc();
}
@Override
public Project create(final ProjectInfo project) {
try {
return Project.fromPb(this, runWithRetries(
new Callable() {
@Override
public com.google.api.services.cloudresourcemanager.model.Project call() {
return resourceManagerRpc.create(project.toPb());
}
}, options().retryParams(), EXCEPTION_HANDLER));
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public void delete(final String projectId) {
try {
runWithRetries(new Callable() {
@Override
public Void call() {
resourceManagerRpc.delete(projectId);
return null;
}
}, options().retryParams(), EXCEPTION_HANDLER);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public Project get(final String projectId, ProjectGetOption... options) {
final Map optionsMap = optionMap(options);
try {
com.google.api.services.cloudresourcemanager.model.Project answer = runWithRetries(
new Callable() {
@Override
public com.google.api.services.cloudresourcemanager.model.Project call() {
return resourceManagerRpc.get(projectId, optionsMap);
}
}, options().retryParams(), EXCEPTION_HANDLER);
return answer == null ? null : Project.fromPb(this, answer);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
private static class ProjectPageFetcher implements NextPageFetcher {
private static final long serialVersionUID = 2158209410430566961L;
private final Map requestOptions;
private final ResourceManagerOptions serviceOptions;
ProjectPageFetcher(ResourceManagerOptions serviceOptions, String cursor,
Map optionMap) {
this.requestOptions =
PageImpl.nextRequestOptions(ResourceManagerRpc.Option.PAGE_TOKEN, cursor, optionMap);
this.serviceOptions = serviceOptions;
}
@Override
public Page nextPage() {
return listProjects(serviceOptions, requestOptions);
}
}
@Override
public Page list(ProjectListOption... options) {
return listProjects(options(), optionMap(options));
}
private static Page listProjects(final ResourceManagerOptions serviceOptions,
final Map optionsMap) {
try {
Tuple> result =
runWithRetries(new Callable>>() {
@Override
public Tuple> call() {
return serviceOptions.rpc().list(optionsMap);
}
},
serviceOptions.retryParams(), EXCEPTION_HANDLER);
String cursor = result.x();
Iterable projects =
result.y() == null
? ImmutableList.of() : Iterables.transform(
result.y(),
new Function() {
@Override
public Project apply(
com.google.api.services.cloudresourcemanager.model.Project projectPb) {
return new Project(
serviceOptions.service(),
new ProjectInfo.BuilderImpl(ProjectInfo.fromPb(projectPb)));
}
});
return new PageImpl<>(
new ProjectPageFetcher(serviceOptions, cursor, optionsMap), cursor, projects);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public Project replace(final ProjectInfo newProject) {
try {
return Project.fromPb(this, runWithRetries(
new Callable() {
@Override
public com.google.api.services.cloudresourcemanager.model.Project call() {
return resourceManagerRpc.replace(newProject.toPb());
}
}, options().retryParams(), EXCEPTION_HANDLER));
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public void undelete(final String projectId) {
try {
runWithRetries(new Callable() {
@Override
public Void call() {
resourceManagerRpc.undelete(projectId);
return null;
}
}, options().retryParams(), EXCEPTION_HANDLER);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public Policy getPolicy(final String projectId) {
try {
com.google.api.services.cloudresourcemanager.model.Policy answer =
runWithRetries(
new Callable() {
@Override
public com.google.api.services.cloudresourcemanager.model.Policy call() {
return resourceManagerRpc.getPolicy(projectId);
}
}, options().retryParams(), EXCEPTION_HANDLER);
return answer == null ? null : Policy.fromPb(answer);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public Policy replacePolicy(final String projectId, final Policy newPolicy) {
try {
return Policy.fromPb(runWithRetries(
new Callable() {
@Override
public com.google.api.services.cloudresourcemanager.model.Policy call() {
return resourceManagerRpc.replacePolicy(projectId, newPolicy.toPb());
}
}, options().retryParams(), EXCEPTION_HANDLER));
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
@Override
public List testPermissions(final String projectId, final List permissions) {
try {
return runWithRetries(
new Callable>() {
@Override
public List call() {
return resourceManagerRpc.testPermissions(projectId, permissions);
}
}, options().retryParams(), EXCEPTION_HANDLER);
} catch (RetryHelperException ex) {
throw ResourceManagerException.translateAndThrow(ex);
}
}
private Map optionMap(Option... options) {
Map temp = Maps.newEnumMap(ResourceManagerRpc.Option.class);
for (Option option : options) {
Object prev = temp.put(option.rpcOption(), option.value());
checkArgument(prev == null, "Duplicate option %s", option);
}
return ImmutableMap.copyOf(temp);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy