This is an automated email from the ASF dual-hosted git repository. jonathanhurley pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push: new ec097f6 [AMBARI-24685] - Create a Maven Consumable Ambari SPI Client Library ec097f6 is described below commit ec097f6563b85b49e06c4d41053e101d2c6c8656 Author: Jonathan Hurley <jonathanhur...@apache.org> AuthorDate: Wed Sep 26 08:16:42 2018 -0400 [AMBARI-24685] - Create a Maven Consumable Ambari SPI Client Library --- ambari-server-spi/pom.xml | 177 +++++++++++++++++++++ .../apache/ambari/annotations/UpgradeCheck.java | 84 ++++++++++ .../org/apache/ambari/server/AmbariException.java | 0 .../java/org/apache/ambari/spi/RepositoryType.java | 93 +++++++++++ .../java/org/apache/ambari/spi/package-info.java | 22 +++ .../ambari/spi/upgrade/CheckDescription.java | 144 +++++++++++++++++ .../ambari/spi/upgrade/CheckQualification.java | 31 ++-- .../apache/ambari/spi/upgrade/UpgradeCheck.java | 92 +++++++++++ .../ambari/spi/upgrade/UpgradeCheckGroup.java | 114 +++++++++++++ .../ambari/spi/upgrade/UpgradeCheckRequest.java | 111 +++++++++++++ .../ambari/spi/upgrade/UpgradeCheckResult.java | 84 ++++++++++ .../ambari/spi/upgrade/UpgradeCheckStatus.java | 37 +++-- .../ambari/spi/upgrade/UpgradeCheckType.java | 22 +-- .../org/apache/ambari/spi/upgrade/UpgradeType.java | 35 ++-- .../ambari/spi/upgrade/RepositoryTypeTest.java | 31 ++-- ambari-server/pom.xml | 5 + pom.xml | 5 + 17 files changed, 1024 insertions(+), 63 deletions(-) diff --git a/ambari-server-spi/pom.xml b/ambari-server-spi/pom.xml new file mode 100644 index 0000000..cad3270 --- /dev/null +++ b/ambari-server-spi/pom.xml @@ -0,0 +1,177 @@ +<?xml version="1.0"?> +<!-- + 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. See accompanying LICENSE file. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.apache.ambari</groupId> + <artifactId>ambari-project</artifactId> + <version>2.0.0.0-SNAPSHOT</version> + <relativePath>../ambari-project</relativePath> + </parent> + <artifactId>ambari-server-spi</artifactId> + <url>http://ambari.apache.org</url> + <name>Ambari Server SPI</name> + <description>A client library which is used for providing plugins for the Ambari Server framework.</description> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <xlint>none</xlint> + <jdk.version>1.8</jdk.version> + </properties> + + <build> + <plugins> + <plugin> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.2</version> + <configuration> + <source>${jdk.version}</source> + <target>${jdk.version}</target> + <useIncrementalCompilation>false</useIncrementalCompilation> + <compilerArgs> + <arg>-Xlint:${xlint}</arg> + <arg>-Xmaxwarns</arg> + <arg>50000</arg> + </compilerArgs> + </configuration> + </plugin> + + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <tarLongFileMode>gnu</tarLongFileMode> + <descriptors> + <descriptor>../ambari-project/src/main/assemblies/empty.xml</descriptor> + </descriptors> + </configuration> + <executions> + <execution> + <id>build-tarball</id> + <phase>prepare-package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <configuration> + <excludes> + <exclude>**/*.json</exclude> + <exclude>**/*.iml</exclude> + <exclude>**/*.lst</exclude> + <exclude>**/rat.txt</exclude> + </excludes> + </configuration> + <executions> + <execution> + <phase>test</phase> + <goals> + <goal>check</goal> + </goals> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skip>${skipSurefireTests}</skip> + <argLine>${surefire.argLine}</argLine> + </configuration> + </plugin> + + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <version>1.8</version> + <executions> + <execution> + <id>parse-version</id> + <phase>validate</phase> + <goals> + <goal>parse-version</goal> + </goals> + </execution> + <execution> + <id>regex-property</id> + <goals> + <goal>regex-property</goal> + </goals> + <configuration> + <name>ambariVersion</name> + <value>${project.version}</value> + <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex> + <replacement>$1.$2.$3.$4</replacement> + <failIfNoMatch>false</failIfNoMatch> + </configuration> + </execution> + <execution> + <id>parse-package-version</id> + <goals> + <goal>regex-property</goal> + </goals> + <configuration> + <name>package-version</name> + <value>${project.version}</value> + <regex>^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-).*</regex> + <replacement>$1.$2.$3.$4</replacement> + <failIfNoMatch>true</failIfNoMatch> + </configuration> + </execution> + <execution> + <id>parse-package-release</id> + <goals> + <goal>regex-property</goal> + </goals> + <configuration> + <name>package-release</name> + <value>${project.version}</value> + <regex> + ^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)(\.|-)((([a-zA-Z]+)?([0-9]+))|(SNAPSHOT)).* + </regex> + <replacement>$7</replacement> + <failIfNoMatch>true</failIfNoMatch> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>com.google.code.gson</groupId> + <artifactId>gson</artifactId> + </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + <dependency> + <groupId>com.google.inject</groupId> + <artifactId>guice</artifactId> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/annotations/UpgradeCheck.java b/ambari-server-spi/src/main/java/org/apache/ambari/annotations/UpgradeCheck.java new file mode 100644 index 0000000..ba22c51 --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/annotations/UpgradeCheck.java @@ -0,0 +1,84 @@ +/* + * 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.ambari.annotations; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import org.apache.ambari.spi.RepositoryType; +import org.apache.ambari.spi.upgrade.UpgradeCheckGroup; +import org.apache.ambari.spi.upgrade.UpgradeType; + +import com.google.inject.ScopeAnnotation; +import com.google.inject.Singleton; + +/** + * The {@link UpgradeCheck} annotation is used to provide ordering and grouping + * to any {@link ClusterCheck} instance. + * <p/> + * Classes marked with this annotation should also be {@link Singleton}. They + * will be discovered on the classpath and then registered with the + * {@link UpgradeCheckRegistry}. + */ +@Target({ ElementType.TYPE }) +@Retention(RUNTIME) +@ScopeAnnotation +public @interface UpgradeCheck { + + /** + * The group that the pre-upgrade check belongs to. + * + * @return the group, or {@link UpgradeCheckGroup#DEFAULT} if not specified. + */ + UpgradeCheckGroup group() default UpgradeCheckGroup.DEFAULT; + + /** + * The order of the pre-upgrade check within its group. + * <p/> + * The order is determined by a {@code float} so that new checks can be added + * in between others without the need to reorder all of the existing checks. + * + * @return the order, or {@code 1.0f} if not specified. + */ + float order() default 1.0f; + + /** + * Gets the upgrade types for which an upgrade check is required. By default, + * a pre-upgrade check needs to be declared in the upgrade pack. This flag + * will override that setting. + * <p/> + * Leaving this blank assumes that the check is not required. + * + * @return the upgrade types which do not need the check to be explicitely + * defined in the upgrade pack or an empty array for none. + */ + UpgradeType[] required() default {}; + + + /** + * The valid orchestration repository type that this check if valid for. By + * default, a check is valid for all orchestration types. + * + * @return the repository types that the check is valid for. + */ + RepositoryType[] orchestration() default { RepositoryType.STANDARD, RepositoryType.PATCH, + RepositoryType.MAINT, RepositoryType.SERVICE }; +} diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/main/java/org/apache/ambari/server/AmbariException.java similarity index 100% copy from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java copy to ambari-server-spi/src/main/java/org/apache/ambari/server/AmbariException.java diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/RepositoryType.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/RepositoryType.java new file mode 100644 index 0000000..c0192ce --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/RepositoryType.java @@ -0,0 +1,93 @@ +/* + * 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.ambari.spi; + +import java.util.EnumSet; + +/** + * Identifies the type of repository + */ +public enum RepositoryType { + + /** + * Repository should be considered to have all components for a cluster + * deployment. + */ + STANDARD, + + /** + * Repository may have only minimum components and is used for patching + * purposes. + */ + PATCH, + + /** + * Repository is used as Maintenance release, which could be several patches rolled up in one. + * Orchestration should treat Maintenance just as it does for Patch.. + */ + MAINT, + + /** + * Repository is used to update services. + */ + SERVICE; + + /** + * The types of repositories which are revertable. + */ + public static final EnumSet<RepositoryType> REVERTABLE = EnumSet.of(RepositoryType.MAINT, + RepositoryType.PATCH); + + /** + * The types of repositories which can participate in an upgrade where only + * some services are orchestrated. + */ + public static final EnumSet<RepositoryType> PARTIAL = EnumSet.of(RepositoryType.MAINT, + RepositoryType.PATCH, RepositoryType.SERVICE); + + /** + * Gets whether applications of this repository are revertable after they have + * been finalized. + * + * @return {@code true} if the repository can be revert, {@code false} + * otherwise. + */ + public boolean isRevertable() { + switch (this) { + case MAINT: + case PATCH: + return true; + case SERVICE: + case STANDARD: + return false; + default: + return false; + } + } + + /** + * Gets whether this repository type can be used to upgrade only a subset of + * services. + * + * @return {@code true} if the repository can be be applied to a subset of + * isntalled services, {@code false} otherwise. + */ + public boolean isPartial() { + return PARTIAL.contains(this); + } +} diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/package-info.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/package-info.java new file mode 100644 index 0000000..188240d --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/package-info.java @@ -0,0 +1,22 @@ +/** + * 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. + */ + +/** + * Provides classes for extending Ambari Server functionality, such as adding + * upgrade checks and server-side custom actions. + */ +package org.apache.ambari.spi; \ No newline at end of file diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckDescription.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckDescription.java new file mode 100644 index 0000000..3c510fb --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckDescription.java @@ -0,0 +1,144 @@ +/** + * 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.ambari.spi.upgrade; + +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; + +import com.google.common.base.MoreObjects; + +/** + * The {@link CheckDescription} is used to provide information about an upgrade + * check, such as its description, applicable upgrade types, and the various + * reasons which could cause it to fail. + */ +public class CheckDescription { + + /** + * All of the instantiated {@link CheckDescription}s. + */ + private static final Set<CheckDescription> s_values = new LinkedHashSet<>(); + + /** + * A unique identifier. + */ + private final String m_name; + private final UpgradeCheckType m_type; + private final String m_description; + private Map<String, String> m_fails; + + /** + * Constructor. + * + * @param name + * @param type + * @param description + * @param fails + */ + public CheckDescription(String name, UpgradeCheckType type, String description, Map<String, String> fails) { + m_name = name; + m_type = type; + m_description = description; + m_fails = fails; + + if (s_values.contains(this)) { + throw new RuntimeException("Unable to add the upgrade check description named " + m_name + + " because it already is registered"); + } + + s_values.add(this); + } + + /** + * @return the name of check + */ + public String name() { + return m_name; + } + + /** + * Gets all of the registered check descriptions. + * + * @return + */ + public Set<CheckDescription> values() { + return s_values; + } + + /** + * @return the type of check + */ + public UpgradeCheckType getType() { + return m_type; + } + + /** + * @return the text associated with the description + */ + public String getText() { + return m_description; + } + + /** + * @param key the failure text key + * @return the fail text template. Never {@code null} + */ + public String getFail(String key) { + return m_fails.containsKey(key) ? m_fails.get(key) : ""; + } + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return Objects.hash(m_name); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object object) { + if (null == object) { + return false; + } + + if (this == object) { + return true; + } + + if (object.getClass() != getClass()) { + return false; + } + + CheckDescription that = (CheckDescription) object; + + return Objects.equals(m_name, that.m_name); + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return MoreObjects.toStringHelper(this).add("name", m_name).toString(); + } +} \ No newline at end of file diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckQualification.java similarity index 58% copy from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java copy to ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckQualification.java index 812ea1e..83022eb 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/CheckQualification.java @@ -15,19 +15,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ambari.spi.upgrade; -package org.apache.ambari.server; +import org.apache.ambari.server.AmbariException; -import java.io.IOException; - -@SuppressWarnings("serial") -public class AmbariException extends IOException { - - public AmbariException(String message) { - super(message); - } +/** + * The {@link CheckQualification} interface is used to provide multiple + * different qualifications against which an upgrade check is determined to be + * applicable to the upgrade. + */ +interface CheckQualification { - public AmbariException(String message, Throwable cause) { - super(message, cause); - } -} + /** + * Gets whether the upgrade check meets this qualification and should + * therefore be run before the upgrade. + * + * @param request + * @return + * @throws AmbariException + */ + boolean isApplicable(UpgradeCheckRequest request) throws AmbariException; +} \ No newline at end of file diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheck.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheck.java new file mode 100644 index 0000000..a813c96 --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheck.java @@ -0,0 +1,92 @@ +/* + * 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.ambari.spi.upgrade; + +import java.util.List; +import java.util.Set; + +import org.apache.ambari.server.AmbariException; + +/** + * The {@link UpgradeCheck} is used before an upgrade in order to present the + * administrator with a warning or a failure about an upgrade. + */ +public interface UpgradeCheck { + + /** + * Gets the set of services that this check is associated with. If the check + * is not associated with a particular service, then this should be an empty + * set. + * + * @return a set of services which will determine whether this check is + * applicable, or an empty set. + */ + Set<String> getApplicableServices(); + + /** + * Gets any additional qualifications which an upgrade check should run in + * order to determine if it's applicable to the upgrade. + * + * @return a list of qualifications, or an empty list. + */ + List<CheckQualification> getQualifications(); + + /** + * Tests if the prerequisite check is applicable to given upgrade request. + * + * @param request + * prerequisite check request + * @return true if check should be performed + * @throws AmbariException + */ + boolean isApplicable(UpgradeCheckRequest request) throws AmbariException; + + /** + * Executes check against given cluster. + * @param request pre upgrade check request + * @return TODO + * + * @throws AmbariException if server error happens + */ + UpgradeCheckResult perform(UpgradeCheckRequest request) + throws AmbariException; + + /** + * Gets the type of check. + * + * @return the type of check (not {@code null}). + */ + UpgradeCheckType getType(); + + /** + * Gets whether this upgrade check is required for the specified + * {@link UpgradeType}. Checks which are marked as required do not need to be + * explicitely declared in the upgrade pack to be run. + * + * @return {@code true} if it is required, {@code false} otherwise. + */ + boolean isRequired(UpgradeType upgradeType); + + /** + * The {@link CheckDescription} which includes the name, description, and + * success/failure messages for a {@link UpgradeCheck}. + * + * @return the check description. + */ + CheckDescription getCheckDescrption(); +} \ No newline at end of file diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckGroup.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckGroup.java new file mode 100644 index 0000000..56ca7cd --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckGroup.java @@ -0,0 +1,114 @@ +/* + * 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.ambari.spi.upgrade; + +/** + * The {@link UpgradeCheckGroup} enum is used to organize pre-upgrade checks + * into specific groups that have their own relational ordering. + * <p/> + * The order for each group is determined by a {@code float} so that new groups + * can be added in between others without the need to reorder all of the groups. + */ +public enum UpgradeCheckGroup { + + /** + * Check for masters in maintenance mode and then services in maintenance + * mode. + */ + MAINTENANCE_MODE(1.0f), + + /** + * Checks the repository version on the hosts. + */ + REPOSITORY_VERSION(2.0f), + + /** + * Checks for NameNode HA and checks that depend on NameNode HA. + */ + NAMENODE_HA(3.0f), + + /** + * Checks for the topology of service and components. + */ + TOPOLOGY(4.0f), + + /** + * Checks for the state of a host or service being alive and responsive. + */ + LIVELINESS(5.0f), + + /** + * Checks for the client retry properties to be set in clients that support + * this. + */ + CLIENT_RETRY_PROPERTY(6.0f), + + /** + * Checks for various HA components, such as multiple metastores, are + * available. + */ + MULTIPLE_COMPONENT_WARNING(7.0f), + + /** + * A general group for warning about configuration properties. + */ + CONFIGURATION_WARNING(8.0f), + + /*** + * Checks the component version on the hosts. + */ + COMPONENT_VERSION(9.0f), + + /** + * A general group for related to Kerberos checks. + */ + KERBEROS(10.0f), + + /** + * A general group for informational warning checks. + */ + INFORMATIONAL_WARNING(100.0f), + + /** + * All other checks. + */ + DEFAULT(Float.MAX_VALUE); + + /** + * The order of upgrade check groups. + */ + private final Float m_order; + + /** + * Constructor. + * + * @param order + */ + UpgradeCheckGroup(Float order) { + m_order = order; + } + + /** + * Gets the group's order. + * + * @return the order of the group. + */ + public Float getOrder() { + return m_order; + } +} diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckRequest.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckRequest.java new file mode 100644 index 0000000..2203fce --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckRequest.java @@ -0,0 +1,111 @@ +/* + * 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.ambari.spi.upgrade; + +import java.util.HashMap; +import java.util.Map; + +/** + * Represents a request to run the upgrade checks before an upgrade begins. + */ +public class UpgradeCheckRequest { + private String m_clusterName; + private Map<String, String> m_configurations; + + private UpgradeType m_upgradeType; + + private Map<CheckDescription, UpgradeCheckStatus> m_results = new HashMap<>(); + private boolean m_revert = false; + + + /** + * Constructor. + * + * @param clusterName + * the name of the cluster. + * @param upgradeType + * the type of the upgrade. + * @param configurations + * any configurations specified in the upgrade pack which can be used + * to when + */ + public UpgradeCheckRequest(String clusterName, UpgradeType upgradeType, + Map<String, String> configurations) { + m_clusterName = clusterName; + m_upgradeType = upgradeType; + m_configurations = configurations; + } + + /** + * Construct a request to performs checks before an Upgrade. + * The default type is Rolling. + * @param clusterName + */ + public UpgradeCheckRequest(String clusterName) { + this(clusterName, UpgradeType.ROLLING, new HashMap<String, String>()); + } + + public String getClusterName() { + return m_clusterName; + } + + public UpgradeType getUpgradeType() { + return m_upgradeType; + } + + /** + * Sets the result of a check. + * @param description the description + * @param status the status result + */ + public void addResult(CheckDescription description, UpgradeCheckStatus status) { + m_results.put(description, status); + } + + /** + * Gets the result of a check of the supplied description + * @param description the description + * @return the return value, or {@code null} if it has not been run + */ + public UpgradeCheckStatus getResult(CheckDescription description) { + return m_results.get(description); + } + + /** + * Gets the prerequisite check config + * @return the prereqCheckConfig + */ + public Map<String, String> getConfigurations() { + return m_configurations; + } + + /** + * @param revert + * {@code true} if the check is for a patch reversion + */ + public void setRevert(boolean revert) { + m_revert = revert; + } + + /** + * @return if the check is for a patch reversion + */ + public boolean isRevert() { + return m_revert; + } +} diff --git a/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckResult.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckResult.java new file mode 100644 index 0000000..a15891b --- /dev/null +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckResult.java @@ -0,0 +1,84 @@ +/* + * 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.ambari.spi.upgrade; + +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; + +/** + * Contains information about performed prerequisite check. Newly initialized + * {@link UpgradeCheckResult} instances are always set to + * {@link UpgradeCheckStatus#PASS}. + */ +public class UpgradeCheckResult { + private UpgradeCheck m_upgradeCheck; + private UpgradeCheckStatus m_status = UpgradeCheckStatus.PASS; + private String m_failReason = ""; + private LinkedHashSet<String> m_failedOn = new LinkedHashSet<>(); + private List<Object> m_failedDetail = new ArrayList<>(); + + public UpgradeCheckResult(UpgradeCheck check) { + m_upgradeCheck = check; + } + + public UpgradeCheckResult(UpgradeCheck check, UpgradeCheckStatus status) { + m_upgradeCheck = check; + m_status = status; + } + + public String getId() { + return m_upgradeCheck.getCheckDescrption().name(); + } + + public String getDescription() { + return m_upgradeCheck.getCheckDescrption().getText(); + } + + public UpgradeCheckStatus getStatus() { + return m_status; + } + + public void setStatus(UpgradeCheckStatus status) { + m_status = status; + } + + public String getFailReason() { + return m_failReason; + } + + public void setFailReason(String failReason) { + m_failReason = failReason; + } + + public LinkedHashSet<String> getFailedOn() { + return m_failedOn; + } + + public List<Object> getFailedDetail() { + return m_failedDetail; + } + + public void setFailedOn(LinkedHashSet<String> failedOn) { + m_failedOn = failedOn; + } + + public UpgradeCheckType getType() { + return m_upgradeCheck.getType(); + } +} \ No newline at end of file diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckStatus.java similarity index 65% copy from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java copy to ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckStatus.java index 812ea1e..bce5381 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckStatus.java @@ -1,4 +1,4 @@ -/* +/** * 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 @@ -15,19 +15,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ambari.spi.upgrade; -package org.apache.ambari.server; - -import java.io.IOException; - -@SuppressWarnings("serial") -public class AmbariException extends IOException { - - public AmbariException(String message) { - super(message); - } - - public AmbariException(String message, Throwable cause) { - super(message, cause); - } +/** + * + */ +public enum UpgradeCheckStatus { + /** + * The check passed with no warnings or errors. + */ + PASS, + /** + * The check passed but reporting a warning that should be examined. + */ + WARNING, + /** + * The check failed but a configuration allows bypassing failures. + */ + BYPASS, + /** + * The check failed and is not allowed to bypass errors. + */ + FAIL } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckType.java similarity index 72% copy from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java copy to ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckType.java index 812ea1e..c52f329 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeCheckType.java @@ -15,19 +15,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ambari.spi.upgrade; -package org.apache.ambari.server; - -import java.io.IOException; - -@SuppressWarnings("serial") -public class AmbariException extends IOException { - - public AmbariException(String message) { - super(message); - } - - public AmbariException(String message, Throwable cause) { - super(message, cause); - } +/** + * Type of prerequisite check. + */ +public enum UpgradeCheckType { + SERVICE, + HOST, + CLUSTER } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeType.java similarity index 57% copy from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java copy to ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeType.java index 812ea1e..65d2a40 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java +++ b/ambari-server-spi/src/main/java/org/apache/ambari/spi/upgrade/UpgradeType.java @@ -15,19 +15,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ambari.spi.upgrade; -package org.apache.ambari.server; +import javax.xml.bind.annotation.XmlEnumValue; -import java.io.IOException; +import com.google.gson.annotations.SerializedName; -@SuppressWarnings("serial") -public class AmbariException extends IOException { +/** + * Indicates the type of Upgrade performed. + */ +public enum UpgradeType { + /** + * Services are up the entire time + */ + @XmlEnumValue("ROLLING") + @SerializedName("rolling_upgrade") + ROLLING, - public AmbariException(String message) { - super(message); - } + /** + * All services are stopped, then started + */ + @XmlEnumValue("NON_ROLLING") + @SerializedName("nonrolling_upgrade") + NON_ROLLING, - public AmbariException(String message, Throwable cause) { - super(message, cause); - } + /** + * Host-ordered upgrade. + */ + @XmlEnumValue("HOST_ORDERED") + @SerializedName("host_ordered_upgrade") + HOST_ORDERED; } diff --git a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java b/ambari-server-spi/src/test/java/org/apache/ambari/spi/upgrade/RepositoryTypeTest.java similarity index 57% rename from ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java rename to ambari-server-spi/src/test/java/org/apache/ambari/spi/upgrade/RepositoryTypeTest.java index 812ea1e..83f8a01 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java +++ b/ambari-server-spi/src/test/java/org/apache/ambari/spi/upgrade/RepositoryTypeTest.java @@ -1,4 +1,4 @@ -/* +/** * 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 @@ -15,19 +15,28 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package org.apache.ambari.spi.upgrade; -package org.apache.ambari.server; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; -import java.io.IOException; +import org.apache.ambari.spi.RepositoryType; +import org.junit.Test; -@SuppressWarnings("serial") -public class AmbariException extends IOException { - - public AmbariException(String message) { - super(message); - } +/** + * Tests {@link RepositoryType}. + */ +public class RepositoryTypeTest { - public AmbariException(String message, Throwable cause) { - super(message, cause); + /** + * Tests that the repository types support the revertable flag. + * + * @throws Exception + */ + @Test + public void testIsRevertable() throws Exception { + assertTrue(RepositoryType.MAINT.isRevertable()); + assertTrue(RepositoryType.PATCH.isRevertable()); + assertFalse(RepositoryType.STANDARD.isRevertable()); } } diff --git a/ambari-server/pom.xml b/ambari-server/pom.xml index ecbf9f7..9cb85de 100644 --- a/ambari-server/pom.xml +++ b/ambari-server/pom.xml @@ -1154,6 +1154,11 @@ <version>${project.version}</version> </dependency> <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ambari-server-spi</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> <groupId>commons-collections</groupId> <artifactId>commons-collections</artifactId> </dependency> diff --git a/pom.xml b/pom.xml index 61300d6..42bc947 100644 --- a/pom.xml +++ b/pom.xml @@ -440,6 +440,7 @@ <module>contrib/views</module> <module>ambari-metrics</module> <module>ambari-server</module> + <module>ambari-server-spi</module> <module>ambari-funtest</module> <module>ambari-agent</module> <module>ambari-logsearch</module> @@ -462,6 +463,7 @@ <module>ambari-views/examples</module> <module>ambari-metrics</module> <module>ambari-server</module> + <module>ambari-server-spi</module> <module>ambari-funtest</module> <module>ambari-agent</module> </modules> @@ -474,6 +476,7 @@ <module>ambari-admin</module> <module>ambari-metrics</module> <module>ambari-server</module> + <module>ambari-server-spi</module> <module>ambari-funtest</module> <module>ambari-agent</module> <module>ambari-logsearch</module> @@ -495,6 +498,7 @@ <module>ambari-admin</module> <module>ambari-metrics</module> <module>ambari-server</module> + <module>ambari-server-spi</module> <module>ambari-funtest</module> <module>ambari-agent</module> <module>ambari-logsearch</module> @@ -529,6 +533,7 @@ <module>ambari-admin</module> <module>ambari-metrics</module> <module>ambari-server</module> + <module>ambari-server-spi</module> <module>ambari-funtest</module> <module>ambari-agent</module> </modules>