YARN-5323. Policies APIs for Federation Router and AMRMProxy policies. (Carlo Curino via Subru).
(cherry picked from commit f8208fe0b536f29aa65af71d20c3b3e3765679fd) (cherry picked from commit 81472778d7ef013ea6b2714bc734bc6fc3ca32fa) Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/23c42408 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/23c42408 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/23c42408 Branch: refs/heads/branch-2 Commit: 23c42408ba2722f8298a921614a5d2080ef8fe7b Parents: aac8755 Author: Subru Krishnan <su...@apache.org> Authored: Wed Sep 7 17:33:34 2016 -0700 Committer: Carlo Curino <cur...@apache.org> Committed: Thu Sep 21 16:23:41 2017 -0700 ---------------------------------------------------------------------- .../policies/ConfigurableFederationPolicy.java | 44 +++++++ .../policies/FederationPolicyConfigurator.java | 91 +++++++++++++ .../FederationPolicyInitializationContext.java | 109 ++++++++++++++++ ...ionPolicyInitializationContextValidator.java | 82 ++++++++++++ .../policies/FederationPolicyWriter.java | 45 +++++++ .../amrmproxy/FederationAMRMProxyPolicy.java | 66 ++++++++++ .../policies/amrmproxy/package-info.java | 20 +++ .../exceptions/FederationPolicyException.java | 33 +++++ ...FederationPolicyInitializationException.java | 33 +++++ .../NoActiveSubclustersException.java | 27 ++++ .../exceptions/UnknownSubclusterException.java | 28 ++++ .../policies/exceptions/package-info.java | 20 +++ .../federation/policies/package-info.java | 20 +++ .../policies/router/FederationRouterPolicy.java | 45 +++++++ .../policies/router/package-info.java | 20 +++ ...ionPolicyInitializationContextValidator.java | 128 +++++++++++++++++++ .../utils/FederationPoliciesTestUtil.java | 83 ++++++++++++ 17 files changed, 894 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/ConfigurableFederationPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/ConfigurableFederationPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/ConfigurableFederationPolicy.java new file mode 100644 index 0000000..fd6ceea --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/ConfigurableFederationPolicy.java @@ -0,0 +1,44 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.policies.exceptions.FederationPolicyInitializationException; + +/** + * This interface provides a general method to reinitialize a policy. The + * semantics are try-n-swap, so in case of an exception is thrown the + * implmentation must ensure the previous state and configuration is preserved. + */ +public interface ConfigurableFederationPolicy { + + /** + * This method is invoked to initialize of update the configuration of + * policies. The implementor should provide try-n-swap semantics, and retain + * state if possible. + * + * @param federationPolicyInitializationContext the new context to provide to + * implementor. + * + * @throws FederationPolicyInitializationException in case the initialization + * fails. + */ + void reinitialize( + FederationPolicyInitializationContext + federationPolicyInitializationContext) + throws FederationPolicyInitializationException; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyConfigurator.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyConfigurator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyConfigurator.java new file mode 100644 index 0000000..fdc3857 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyConfigurator.java @@ -0,0 +1,91 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.policies.amrmproxy.FederationAMRMProxyPolicy; + + +import org.apache.hadoop.yarn.server.federation.policies.exceptions.FederationPolicyInitializationException; + +import org.apache.hadoop.yarn.server.federation.policies.router + .FederationRouterPolicy; + +/** + * Implementors of this interface are capable to instantiate and (re)initalize + * {@link FederationAMRMProxyPolicy} and {@link FederationRouterPolicy} based on + * a {@link FederationPolicyInitializationContext}. The reason to bind these two + * policies together is to make sure we remain consistent across the router and + * amrmproxy policy decisions. + */ +public interface FederationPolicyConfigurator { + + /** + * If the current instance is compatible, this method returns the same + * instance of {@link FederationAMRMProxyPolicy} reinitialized with the + * current context, otherwise a new instance initialized with the current + * context is provided. If the instance is compatible with the current class + * the implementors should attempt to reinitalize (retaining state). To affect + * a complete policy reset oldInstance should be null. + * + * @param federationPolicyInitializationContext the current context + * @param oldInstance the existing (possibly null) + * instance. + * + * @return an updated {@link FederationAMRMProxyPolicy + }. + * + * @throws FederationPolicyInitializationException if the initialization + * cannot be completed + * properly. The oldInstance + * should be still valid in + * case of failed + * initialization. + */ + FederationAMRMProxyPolicy getAMRMPolicy( + FederationPolicyInitializationContext + federationPolicyInitializationContext, + FederationAMRMProxyPolicy oldInstance) + throws FederationPolicyInitializationException; + + /** + * If the current instance is compatible, this method returns the same + * instance of {@link FederationRouterPolicy} reinitialized with the current + * context, otherwise a new instance initialized with the current context is + * provided. If the instance is compatible with the current class the + * implementors should attempt to reinitalize (retaining state). To affect a + * complete policy reset oldInstance shoulb be set to null. + * + * @param federationPolicyInitializationContext the current context + * @param oldInstance the existing (possibly null) + * instance. + * + * @return an updated {@link FederationRouterPolicy}. + * + * @throws FederationPolicyInitializationException if the initalization cannot + * be completed properly. The + * oldInstance should be still + * valid in case of failed + * initialization. + */ + FederationRouterPolicy getRouterPolicy( + FederationPolicyInitializationContext + federationPolicyInitializationContext, + FederationRouterPolicy oldInstance) + throws FederationPolicyInitializationException; + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContext.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContext.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContext.java new file mode 100644 index 0000000..879ccee --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContext.java @@ -0,0 +1,109 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.resolver.SubClusterResolver; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterPolicyConfiguration; +import org.apache.hadoop.yarn.server.federation.utils.FederationStateStoreFacade; + +/** + * Context to (re)initialize a {@code FederationAMRMProxyPolicy} and {@code + * FederationRouterPolicy}. + */ +public class FederationPolicyInitializationContext { + + private SubClusterPolicyConfiguration federationPolicyConfiguration; + private SubClusterResolver federationSubclusterResolver; + private FederationStateStoreFacade federationStateStoreFacade; + + public FederationPolicyInitializationContext() { + federationPolicyConfiguration = null; + federationSubclusterResolver = null; + federationStateStoreFacade = null; + } + + public FederationPolicyInitializationContext(SubClusterPolicyConfiguration + policy, SubClusterResolver resolver, FederationStateStoreFacade + storeFacade) { + this.federationPolicyConfiguration = policy; + this.federationSubclusterResolver = resolver; + this.federationStateStoreFacade = storeFacade; + } + + + /** + * Getter for the {@link SubClusterPolicyConfiguration}. + * + * @return the {@link SubClusterPolicyConfiguration} to be used for + * initialization. + */ + public SubClusterPolicyConfiguration getSubClusterPolicyConfiguration() { + return federationPolicyConfiguration; + } + + /** + * Setter for the {@link SubClusterPolicyConfiguration}. + * + * @param federationPolicyConfiguration the + * {@link SubClusterPolicyConfiguration} + * to be used for initialization. + */ + public void setFederationPolicyConfiguration( + SubClusterPolicyConfiguration federationPolicyConfiguration) { + this.federationPolicyConfiguration = federationPolicyConfiguration; + } + + /** + * Getter for the {@link SubClusterResolver}. + * + * @return the {@link SubClusterResolver} to be used for initialization. + */ + public SubClusterResolver getFederationSubclusterResolver() { + return federationSubclusterResolver; + } + + /** + * Setter for the {@link SubClusterResolver}. + * + * @param federationSubclusterResolver the {@link SubClusterResolver} to be + * used for initialization. + */ + public void setFederationSubclusterResolver( + SubClusterResolver federationSubclusterResolver) { + this.federationSubclusterResolver = federationSubclusterResolver; + } + + /** + * Getter for the {@link FederationStateStoreFacade}. + * + * @return the facade. + */ + public FederationStateStoreFacade getFederationStateStoreFacade() { + return federationStateStoreFacade; + } + + /** + * Setter for the {@link FederationStateStoreFacade}. + * + * @param federationStateStoreFacade the facade. + */ + public void setFederationStateStoreFacade( + FederationStateStoreFacade federationStateStoreFacade) { + this.federationStateStoreFacade = federationStateStoreFacade; + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContextValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContextValidator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContextValidator.java new file mode 100644 index 0000000..31f83d4 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyInitializationContextValidator.java @@ -0,0 +1,82 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.policies.exceptions.FederationPolicyInitializationException; + +/** + * Helper class used to factor out common validation steps for policies. + */ +public final class FederationPolicyInitializationContextValidator { + + private FederationPolicyInitializationContextValidator() { + //disable constructor per checkstyle + } + + public static void validate( + FederationPolicyInitializationContext + federationPolicyInitializationContext, + String myType) throws FederationPolicyInitializationException { + + if (myType == null) { + throw new FederationPolicyInitializationException("The myType parameter" + + " should not be null."); + } + + if (federationPolicyInitializationContext == null) { + throw new FederationPolicyInitializationException( + "The FederationPolicyInitializationContext provided is null. Cannot" + + " reinitalize " + + "successfully."); + } + + if (federationPolicyInitializationContext.getFederationStateStoreFacade() + == null) { + throw new FederationPolicyInitializationException( + "The FederationStateStoreFacade provided is null. Cannot" + + " reinitalize successfully."); + } + + if (federationPolicyInitializationContext.getFederationSubclusterResolver() + == null) { + throw new FederationPolicyInitializationException( + "The FederationStateStoreFacase provided is null. Cannot" + + " reinitalize successfully."); + } + + if (federationPolicyInitializationContext.getSubClusterPolicyConfiguration() + == null) { + throw new FederationPolicyInitializationException( + "The FederationSubclusterResolver provided is null. Cannot " + + "reinitalize successfully."); + } + + String intendedType = + federationPolicyInitializationContext.getSubClusterPolicyConfiguration() + .getType(); + + if (!myType.equals(intendedType)) { + throw new FederationPolicyInitializationException( + "The FederationPolicyConfiguration carries a type (" + intendedType + + ") different then mine (" + myType + + "). Cannot reinitialize successfully."); + } + + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyWriter.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyWriter.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyWriter.java new file mode 100644 index 0000000..5034b7e --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/FederationPolicyWriter.java @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.policies.exceptions.FederationPolicyInitializationException; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterPolicyConfiguration; + +/** + * Implementors of this class are able to serializeConf the configuraiton of a + * policy as a {@link SubClusterPolicyConfiguration}. This is used during the + * lifetime of a policy from the admin APIs or policy engine to serializeConf + * the policy into the policy store. + */ +public interface FederationPolicyWriter { + + /** + /** + * This method is invoked to derive a {@link SubClusterPolicyConfiguration}. + * This is to be used when writing a policy object in the federation policy + * store. + * + * @return a valid policy configuration representing this object + * parametrization. + * + * @throws FederationPolicyInitializationException if the current state cannot + * be serialized properly + */ + SubClusterPolicyConfiguration serializeConf() + throws FederationPolicyInitializationException; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/FederationAMRMProxyPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/FederationAMRMProxyPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/FederationAMRMProxyPolicy.java new file mode 100644 index 0000000..4a3305c --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/FederationAMRMProxyPolicy.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.amrmproxy; + +import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse; +import org.apache.hadoop.yarn.api.records.ResourceRequest; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.server.federation.policies.ConfigurableFederationPolicy; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId; + +import java.util.List; +import java.util.Map; + +/** + * Implementors of this interface provide logic to split the list of {@link + * ResourceRequest}s received by the AM among various RMs. + */ +public interface FederationAMRMProxyPolicy + extends ConfigurableFederationPolicy { + + /** + * Splits the {@link ResourceRequest}s from the client across one or more + * sub-clusters based on the policy semantics (e.g., broadcast, load-based). + * + * @param resourceRequests the list of {@link ResourceRequest}s from the + * AM to be split + * + * @return map of sub-cluster as identified by {@link SubClusterId} to the + * list of {@link ResourceRequest}s that should be forwarded to it + * + * @throws YarnException in case the request is malformed or no viable + * sub-clusters can be found. + */ + Map<SubClusterId, List<ResourceRequest>> splitResourceRequests( + List<ResourceRequest> resourceRequests) + throws YarnException; + + /** + * This method should be invoked to notify the policy about responses being + * received. This is useful for stateful policies that make decisions based on + * previous responses being received. + * + * @param subClusterId the id of the subcluster sending the notification + * @param response the response received from one of the RMs + * + * @throws YarnException in case the response is not valid + */ + void notifyOfResponse(SubClusterId subClusterId, + AllocateResponse response) throws YarnException; + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/package-info.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/package-info.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/package-info.java new file mode 100644 index 0000000..99da20b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/amrmproxy/package-info.java @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** AMRMPRoxy policies. **/ +package org.apache.hadoop.yarn.server.federation.policies.amrmproxy; + http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyException.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyException.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyException.java new file mode 100644 index 0000000..24fe421 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyException.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.exceptions; + +import org.apache.hadoop.yarn.exceptions.YarnException; + +/** + * Generic policy exception. + */ +public class FederationPolicyException extends YarnException { + public FederationPolicyException(String s) { + super(s); + } + + public FederationPolicyException(Throwable t) { + super(t); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyInitializationException.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyInitializationException.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyInitializationException.java new file mode 100644 index 0000000..fcc09c2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/FederationPolicyInitializationException.java @@ -0,0 +1,33 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.exceptions; + +/** + * This exception is thrown when the initialization of a federation policy is + * not successful. + */ +public class FederationPolicyInitializationException + extends FederationPolicyException { + public FederationPolicyInitializationException(String message) { + super(message); + } + + public FederationPolicyInitializationException(Throwable j) { + super(j); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/NoActiveSubclustersException.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/NoActiveSubclustersException.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/NoActiveSubclustersException.java new file mode 100644 index 0000000..a427944 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/NoActiveSubclustersException.java @@ -0,0 +1,27 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.exceptions; + +/** + * This exception is thrown when policies cannot locate any active cluster. + */ +public class NoActiveSubclustersException extends FederationPolicyException { + public NoActiveSubclustersException(String s) { + super(s); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/UnknownSubclusterException.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/UnknownSubclusterException.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/UnknownSubclusterException.java new file mode 100644 index 0000000..8a0fb4f --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/UnknownSubclusterException.java @@ -0,0 +1,28 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.exceptions; + +/** + * This exception is thrown whenever a policy is given a {@code SubClusterId} + * that is unknown. + */ +public class UnknownSubclusterException extends FederationPolicyException { + public UnknownSubclusterException(String s) { + super(s); + } +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/package-info.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/package-info.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/package-info.java new file mode 100644 index 0000000..3318da9 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/exceptions/package-info.java @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** Exceptions for policies. **/ +package org.apache.hadoop.yarn.server.federation.policies.exceptions; + http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/package-info.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/package-info.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/package-info.java new file mode 100644 index 0000000..7d9a121 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/package-info.java @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** Federation Policies. **/ +package org.apache.hadoop.yarn.server.federation.policies; + http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/FederationRouterPolicy.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/FederationRouterPolicy.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/FederationRouterPolicy.java new file mode 100644 index 0000000..42c86cc --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/FederationRouterPolicy.java @@ -0,0 +1,45 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.policies.router; + +import org.apache.hadoop.yarn.api.records.ApplicationSubmissionContext; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.server.federation.policies.ConfigurableFederationPolicy; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterId; + +/** + * Implements the logic for determining the routing of an application submission + * based on a policy. + */ +public interface FederationRouterPolicy extends ConfigurableFederationPolicy { + + /** + * Determines the sub-cluster that the user application submision should be + * routed to. + * + * @param appSubmissionContext the context for the app being submitted. + * + * @return the sub-cluster as identified by {@link SubClusterId} to route the + * request to. + * + * @throws YarnException if the policy cannot determine a viable subcluster. + */ + SubClusterId getHomeSubcluster( + ApplicationSubmissionContext appSubmissionContext) + throws YarnException; +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/package-info.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/package-info.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/package-info.java new file mode 100644 index 0000000..5d0fcb6 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/federation/policies/router/package-info.java @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +/** Router policies. **/ +package org.apache.hadoop.yarn.server.federation.policies.router; + http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/TestFederationPolicyInitializationContextValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/TestFederationPolicyInitializationContextValidator.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/TestFederationPolicyInitializationContextValidator.java new file mode 100644 index 0000000..4ec04d5 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/policies/TestFederationPolicyInitializationContextValidator.java @@ -0,0 +1,128 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 org.apache.hadoop.yarn.server.federation.policies; + +import org.apache.hadoop.yarn.server.federation.policies.amrmproxy.FederationAMRMProxyPolicy; +import org.apache.hadoop.yarn.server.federation.policies.exceptions.FederationPolicyInitializationException; +import org.apache.hadoop.yarn.server.federation.policies.router.FederationRouterPolicy; +import org.apache.hadoop.yarn.server.federation.resolver.SubClusterResolver; +import org.apache.hadoop.yarn.server.federation.store.records.SubClusterPolicyConfiguration; + +import org.apache.hadoop.yarn.server.federation.utils.FederationPoliciesTestUtil; +import org.apache.hadoop.yarn.server.federation.utils.FederationStateStoreFacade; +import org.junit.Before; +import org.junit.Test; + +import java.nio.ByteBuffer; + +/** + * Test class for {@link FederationPolicyInitializationContextValidator}. + */ +public class TestFederationPolicyInitializationContextValidator { + + private SubClusterPolicyConfiguration goodConfig; + private SubClusterResolver goodSR; + private FederationStateStoreFacade goodFacade; + private FederationPolicyInitializationContext context; + + @Before + public void setUp() throws Exception { + goodFacade = FederationPoliciesTestUtil.initFacade(); + goodConfig = + new MockPolicyManager().serializeConf(); + goodSR =FederationPoliciesTestUtil.initResolver(); + context = new + FederationPolicyInitializationContext(goodConfig, goodSR, goodFacade); + } + + @Test + public void correcInit() throws Exception { + FederationPolicyInitializationContextValidator.validate(context, + MockPolicyManager.class.getCanonicalName()); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void nullContext() throws Exception { + FederationPolicyInitializationContextValidator.validate(null, + MockPolicyManager.class.getCanonicalName()); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void nullType() throws Exception { + FederationPolicyInitializationContextValidator.validate(context, null); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void wrongType() throws Exception { + FederationPolicyInitializationContextValidator.validate(context, + "WrongType"); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void nullConf() throws Exception { + context.setFederationPolicyConfiguration(null); + FederationPolicyInitializationContextValidator.validate(context, + MockPolicyManager.class.getCanonicalName()); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void nullResolver() throws Exception { + context.setFederationSubclusterResolver(null); + FederationPolicyInitializationContextValidator.validate(context, + MockPolicyManager.class.getCanonicalName()); + } + + @Test(expected = FederationPolicyInitializationException.class) + public void nullFacade() throws Exception { + context.setFederationStateStoreFacade(null); + FederationPolicyInitializationContextValidator.validate(context, + MockPolicyManager.class.getCanonicalName()); + } + + private class MockPolicyManager + implements FederationPolicyWriter, FederationPolicyConfigurator { + @Override + public FederationAMRMProxyPolicy getAMRMPolicy( + FederationPolicyInitializationContext + federationPolicyInitializationContext, + FederationAMRMProxyPolicy oldInstance) + throws FederationPolicyInitializationException { + return null; + } + + @Override + public FederationRouterPolicy getRouterPolicy( + FederationPolicyInitializationContext + federationPolicyInitializationContext, + FederationRouterPolicy oldInstance) + throws FederationPolicyInitializationException { + return null; + } + + @Override + public SubClusterPolicyConfiguration serializeConf() + throws FederationPolicyInitializationException { + ByteBuffer buf = ByteBuffer.allocate(0); + return SubClusterPolicyConfiguration + .newInstance("queue1", this.getClass().getCanonicalName(), buf); + } + } + +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/23c42408/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/utils/FederationPoliciesTestUtil.java ---------------------------------------------------------------------- diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/utils/FederationPoliciesTestUtil.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/utils/FederationPoliciesTestUtil.java new file mode 100644 index 0000000..8c2115b --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/federation/utils/FederationPoliciesTestUtil.java @@ -0,0 +1,83 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with this + * work for additional information regarding copyright ownership. The ASF + * licenses this file to you 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 org.apache.hadoop.yarn.server.federation.utils; + +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.yarn.conf.YarnConfiguration; +import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.server.federation.resolver.DefaultSubClusterResolverImpl; +import org.apache.hadoop.yarn.server.federation.resolver.SubClusterResolver; +import org.apache.hadoop.yarn.server.federation.store.FederationStateStore; +import org.apache.hadoop.yarn.server.federation.store.records.GetSubClustersInfoResponse; + +import java.net.URL; +import java.util.ArrayList; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +/** + * Support class providing common initialization methods to test federation + * policies. + */ +public final class FederationPoliciesTestUtil { + + private FederationPoliciesTestUtil() { + // disabled. + } + + /** + * Initialize a {@link SubClusterResolver}. + * + * @return a subcluster resolver for tests. + */ + public static SubClusterResolver initResolver() { + YarnConfiguration conf = new YarnConfiguration(); + SubClusterResolver resolver = + new DefaultSubClusterResolverImpl(); + URL url = + Thread.currentThread().getContextClassLoader().getResource("nodes"); + if (url == null) { + throw new RuntimeException( + "Could not find 'nodes' dummy file in classpath"); + } + conf.set(YarnConfiguration.FEDERATION_MACHINE_LIST, url.getPath()); + resolver.setConf(conf); + resolver.load(); + return resolver; + } + + /** + * Initialiaze a main-memory {@link FederationStateStoreFacade} used for + * testing, wiht a mock resolver. + * + * @return the facade. + * + * @throws YarnException in case the initialization is not successful. + */ + public static FederationStateStoreFacade initFacade() throws YarnException { + FederationStateStoreFacade goodFacade = FederationStateStoreFacade + .getInstance(); + FederationStateStore fss = mock(FederationStateStore.class); + GetSubClustersInfoResponse response = GetSubClustersInfoResponse + .newInstance(new ArrayList<>()); + when(fss.getSubClusters(any())).thenReturn(response); + goodFacade.reinitialize(fss, new Configuration()); + return goodFacade; + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org