You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ji...@apache.org on 2012/08/29 10:49:32 UTC
svn commit: r1378479 [1/2] - in /incubator/ambari/branches/AMBARI-666: ./
ambari-agent/ ambari-server/
ambari-server/src/main/java/org/apache/ambari/configuration/
ambari-server/src/main/java/org/apache/ambari/server/
ambari-server/src/main/java/org/ap...
Author: jitendra
Date: Wed Aug 29 08:49:31 2012
New Revision: 1378479
URL: http://svn.apache.org/viewvc?rev=1378479&view=rev
Log:
AMBARI-685. Basic classes. Contributed by Hitesh.
Added:
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Action.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionId.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionState.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AgentVersion.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Cluster.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/DiskInfo.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Node.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeHealthStatus.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeState.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Service.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponent.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponentType.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceType.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEvent.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEventType.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSM.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSMImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/InvalidStateTransitonException.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/MultipleArcTransition.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEvent.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEventType.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSM.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSMImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEvent.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEventType.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSM.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSMImpl.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentState.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeState.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/SingleArcTransition.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachine.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachineFactory.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/event/
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/event/AbstractEvent.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/event/Event.java
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/event/EventHandler.java
Removed:
incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/configuration/Configuration.java
Modified:
incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml
incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml
Modified: incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt?rev=1378479&r1=1378478&r2=1378479&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt (original)
+++ incubator/ambari/branches/AMBARI-666/AMBARI-666-CHANGES.txt Wed Aug 29 08:49:31 2012
@@ -12,6 +12,8 @@ AMBARI-666 branch (unreleased changes)
NEW FEATURES
+ AMBARI-685. Basic classes. (hitesh via jitendra)
+
AMBARI-676. Seperate directory for ambari-server. (jitendra)
IMPROVEMENTS
Modified: incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml?rev=1378479&r1=1378478&r2=1378479&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-agent/pom.xml Wed Aug 29 08:49:31 2012
@@ -37,66 +37,6 @@
</dependencies>
<build>
<plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>1.6</version>
- <configuration>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>org.apache.ambari.agent.AmbariAgent</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-maven-plugin</artifactId>
- <version>7.0.0.pre5</version>
- <configuration>
- <connectors>
- <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
- <port>8080</port>
- </connector>
- <connector implementation="org.mortbay.jetty.ssl.SslSelectChannelConnector">
- <port>8140</port>
- <keystore>src/test/resources/server.keystore</keystore>
- <keyPassword>123456</keyPassword>
- <password>123456</password>
- </connector>
- </connectors>
- </configuration>
- <dependencies>
- <dependency>
- <groupId>org.mortbay.jetty</groupId>
- <artifactId>jetty-ssl</artifactId>
- <version>7.0.0.pre5</version>
- </dependency>
- </dependencies>
- </plugin>
</plugins>
- <finalName>ambari-agent</finalName>
</build>
</project>
Modified: incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml?rev=1378479&r1=1378478&r2=1378479&view=diff
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml (original)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/pom.xml Wed Aug 29 08:49:31 2012
@@ -1,21 +1,16 @@
<?xml version="1.0"?>
-<!--
- 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.
--->
-<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">
+<!-- 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. -->
+<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">
<parent>
<groupId>org.apache.ambari</groupId>
<artifactId>ambari-project</artifactId>
@@ -37,79 +32,12 @@
</resources>
<plugins>
<plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-shade-plugin</artifactId>
- <version>1.6</version>
- <configuration>
- <createDependencyReducedPom>true</createDependencyReducedPom>
- <filters>
- <filter>
- <artifact>*:*</artifact>
- <excludes>
- <exclude>META-INF/*.SF</exclude>
- <exclude>META-INF/*.DSA</exclude>
- <exclude>META-INF/*.RSA</exclude>
- </excludes>
- </filter>
- </filters>
- </configuration>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>shade</goal>
- </goals>
- <configuration>
- <transformers>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
- <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
- <mainClass>org.apache.ambari.controller.AmbariController</mainClass>
- </transformer>
- </transformers>
- </configuration>
- </execution>
- </executions>
- </plugin>
- <plugin>
<artifactId>maven-assembly-plugin</artifactId>
</plugin>
</plugins>
</build>
<profiles>
- <profile>
- <id>docs</id>
- <activation>
- <file>
- <exists>/usr/bin/xsltproc</exists>
- </file>
- </activation>
- <dependencies>
- <dependency>
- <groupId>com.sun.jersey.contribs</groupId>
- <artifactId>maven-wadl-plugin</artifactId>
- <version>1.8</version>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey.contribs</groupId>
- <artifactId>wadl-resourcedoc-doclet</artifactId>
- <version>1.8</version>
- </dependency>
- </dependencies>
- </profile>
</profiles>
- <pluginRepositories>
- <pluginRepository>
- <id>maven2-repository.dev.java.net</id>
- <name>Java.net Repository for Maven</name>
- <url>http://download.java.net/maven/2/</url>
- <layout>default</layout>
- </pluginRepository>
- <pluginRepository>
- <id>maven2-glassfish-repository.dev.java.net</id>
- <name>Java.net Repository for Maven</name>
- <url>http://download.java.net/maven/glassfish/</url>
- </pluginRepository>
- </pluginRepositories>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
@@ -172,11 +100,4 @@
<artifactId>jersey-test-framework-external</artifactId>
</dependency>
</dependencies>
- <distributionManagement>
- <site>
- <id>apache-website</id>
- <name>Apache website</name>
- <url>scpexe://people.apache.org/www/incubator.apache.org/ambari/ambari-controller</url>
- </site>
- </distributionManagement>
</project>
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Action.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Action.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Action.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Action.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,18 @@
+package org.apache.ambari.server;
+
+
+public interface Action {
+
+ /**
+ * Get the Action ID for the action
+ * @return ActionId
+ */
+ public ActionId getId();
+
+ /**
+ * Get the current state of the Action
+ * @return ActionState
+ */
+ public ActionState getState();
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionId.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionId.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionId.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionId.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,6 @@
+package org.apache.ambari.server;
+
+// TODO
+public class ActionId {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionState.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionState.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionState.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ActionState.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,21 @@
+package org.apache.ambari.server;
+
+public enum ActionState {
+ /**
+ * Initial state for the Action.
+ * When a new action is triggered or set in motion.
+ */
+ INIT,
+ /**
+ * State when the action is triggered on the cluster,
+ */
+ IN_PROGRESS,
+ /**
+ * State of successful completion
+ */
+ COMPLETED,
+ /**
+ * Action failed to complete successfully
+ */
+ FAILED
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AgentVersion.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AgentVersion.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AgentVersion.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AgentVersion.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,6 @@
+package org.apache.ambari.server;
+
+// TODO
+public class AgentVersion {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/AmbariException.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,7 @@
+package org.apache.ambari.server;
+
+import java.io.IOException;
+
+// TODO
+public class AmbariException extends IOException {
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Cluster.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Cluster.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Cluster.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Cluster.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,14 @@
+package org.apache.ambari.server;
+
+/**
+ * Cluster represents a set of Nodes and Services deployed on these Nodes
+ */
+public interface Cluster {
+
+ /**
+ * Get the Name of the Cluster
+ * @return Cluster Name
+ */
+ public String getName();
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/DiskInfo.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/DiskInfo.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/DiskInfo.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/DiskInfo.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,30 @@
+package org.apache.ambari.server;
+
+/**
+ * Information about a mounted disk on a given node
+ */
+public class DiskInfo {
+
+ /**
+ * Name of device
+ * For example: /dev/sda, /dev/sdb, etc
+ */
+ String device;
+
+ /**
+ * Filesystem Type
+ * For example: ext3, tmpfs, swap, etc
+ */
+ String fsType;
+
+ /**
+ * Path at which the device is mounted on
+ */
+ String mountPath;
+
+ /**
+ * Capacity of the disk in bytes
+ */
+ long capacityBytes;
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Node.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Node.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Node.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Node.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,200 @@
+package org.apache.ambari.server;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Interface for Node of a Cluster. Encapsulates all the required information
+ * about a given node.
+ */
+public interface Node {
+
+ /**
+ * @return the hostName
+ */
+ public String getHostName();
+
+ /**
+ * @param hostName the hostName to set
+ */
+ public void setHostName(String hostName);
+
+ /**
+ * IPv4 assigned to the Node
+ * @return the ip or null if no IPv4 interface
+ */
+ public String getIPv4();
+
+ /**
+ * @param ip the ip to set
+ */
+ public void setIPv4(String ip);
+
+ /**
+ * IPv6 assigned to the Node
+ * @return the ip or null if no IPv6 interface
+ */
+ public String getIPv6();
+
+ /**
+ * @param ip the ip to set
+ */
+ public void setIPv6(String ip);
+
+ /**
+ * @return the cpuCount
+ */
+ public int getCpuCount();
+
+ /**
+ * @param cpuCount the cpuCount to set
+ */
+ public void setCpuCount(int cpuCount);
+
+ /**
+ * Get the Amount of physical memory for the Node.
+ * @return the totalMemBytes
+ */
+ public int getTotalMemBytes();
+
+ /**
+ * Set the Amount of physical memory for the Node.
+ * @param totalMemBytes the totalMemBytes to set
+ */
+ public void setTotalMemBytes(int totalMemBytes);
+
+ /**
+ * Get the Amount of available memory for the Node.
+ * In most cases, available should be same as total unless
+ * the agent on the node is configured to not use all
+ * available memory
+ * @return the availableMemBytes
+ */
+ public int getAvailableMemBytes();
+
+ /**
+ * Set the Amount of available memory for the Node.
+ * @param availableMemBytes the availableMemBytes to set
+ */
+ public void setAvailableMemBytes(int availableMemBytes);
+
+ /**
+ * Get the OS Architecture.
+ * i386, x86_64, etc.
+ * @return the osArch
+ */
+ public String getOsArch();
+
+ /**
+ * @param osArch the osArch to set
+ */
+ public void setOsArch(String osArch);
+
+ /**
+ * Get the General OS information.
+ * uname -a, /etc/*-release dump
+ * @return the osInfo
+ */
+ public String getOsInfo();
+
+ /**
+ * @param osInfo the osInfo to set
+ */
+ public void setOsInfo(String osInfo);
+
+ /**
+ * Get the OS Type: RHEL5/RHEL6/CentOS5/...
+ * Defined and match-able OS type
+ * @return the osType
+ */
+ public String getOsType();
+
+ /**
+ * @param osType the osType to set
+ */
+ public void setOsType(String osType);
+
+ /**
+ * Get information on disks available on the node.
+ * @return the disksInfo
+ */
+ public List<DiskInfo> getDisksInfo();
+
+ /**
+ * @param disksInfo the disksInfo to set
+ */
+ public void setDisksInfo(List<DiskInfo> disksInfo);
+
+ /**
+ * @return the healthStatus
+ */
+ public NodeHealthStatus getHealthStatus();
+
+ /**
+ * @param healthStatus the healthStatus to set
+ */
+ public void setHealthStatus(NodeHealthStatus healthStatus);
+
+ /**
+ * Get additional host attributes
+ * For example, public/hostname/IP for AWS
+ * @return the hostAttributes
+ */
+ public Map<String, String> getHostAttributes();
+
+ /**
+ * @param hostAttributes the hostAttributes to set
+ */
+ public void setHostAttributes(Map<String, String> hostAttributes);
+ /**
+ * @return the rackInfo
+ */
+ public String getRackInfo();
+
+ /**
+ * @param rackInfo the rackInfo to set
+ */
+ public void setRackInfo(String rackInfo);
+
+ /**
+ * Last time the node registered with the Ambari Server
+ * ( Unix timestamp )
+ * @return the lastRegistrationTime
+ */
+ public int getLastRegistrationTime();
+
+ /**
+ * @param lastRegistrationTime the lastRegistrationTime to set
+ */
+ public void setLastRegistrationTime(int lastRegistrationTime);
+
+ /**
+ * Last time the Ambari Server received a heartbeat from the Node
+ * ( Unix timestamp )
+ * @return the lastHeartbeatTime
+ */
+ public int getLastHeartbeatTime();
+
+ /**
+ * @param lastHeartbeatTime the lastHeartbeatTime to set
+ */
+ public void setLastHeartbeatTime(int lastHeartbeatTime);
+
+ /**
+ * Version of the Ambari Agent running on the node
+ * @return the agentVersion
+ */
+ public AgentVersion getAgentVersion();
+
+ /**
+ * @param agentVersion the agentVersion to set
+ */
+ public void setAgentVersion(AgentVersion agentVersion);
+
+ /**
+ * Get the current state of the Node
+ * @return NodeState
+ */
+ public NodeState getNodeState();
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeHealthStatus.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeHealthStatus.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeHealthStatus.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeHealthStatus.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,6 @@
+package org.apache.ambari.server;
+
+// TODO
+public class NodeHealthStatus {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeImpl.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeImpl.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,361 @@
+package org.apache.ambari.server;
+
+import java.util.List;
+import java.util.Map;
+
+// TODO
+// Just a placeholder for now
+// Should be replaced by ORM layer
+public class NodeImpl implements Node {
+
+ /**
+ * Hostname
+ */
+ String hostName;
+
+ /**
+ * IP of the given node
+ */
+ // TODO change type
+ String ipv4;
+
+ /**
+ * IP of the given node
+ */
+ // TODO change type
+ String ipv6;
+
+ /**
+ * Count of cores
+ */
+ int cpuCount;
+
+ /**
+ * Amount of total physical memory for the Node
+ */
+ int totalMemBytes;
+
+ /**
+ * Amount of available memory for the Node.
+ * In most cases, available should be same as total unless
+ * the agent on the node is configured to not use all
+ * available memory
+ */
+ int availableMemBytes;
+
+ /**
+ * OS Architecture.
+ * i386, x86_64, etc.
+ */
+ // TODO should we make this an enum?
+ String osArch;
+
+ /**
+ * General OS information.
+ * uname -a, /etc/*-release dump
+ */
+ String osInfo;
+
+ /**
+ * OS Type: RHEL5/RHEL6/CentOS5/...
+ * Defined and match-able OS type
+ */
+ // TODO should this be an enum?
+ String osType;
+
+ /*
+ // TODO Add later if needed
+ * Additional CPU information
+ * CPU coumt, clock speed, etc
+ CpuInfo cpuInfo;
+ */
+
+ /**
+ * Information on disks available on the node
+ */
+ List<DiskInfo> disksInfo;
+
+ /**
+ * Node Health Status
+ */
+ NodeHealthStatus healthStatus;
+
+ /**
+ * Additional host attributes to capture misc. information
+ * For example, public/hostname/IP for AWS
+ */
+ Map<String, String> hostAttributes;
+
+ /**
+ * Rack information for topology-awareness
+ */
+ String rackInfo;
+
+ /**
+ * Last time the node registered with the Ambari Server
+ * ( Unix timestamp )
+ */
+ int lastRegistrationTime;
+
+ /**
+ * Last time the server received a heartbeat from the node
+ * ( Unix timestamp )
+ */
+ int lastHeartbeatTime;
+
+ /**
+ * Version of the Agent running on the node
+ */
+ AgentVersion agentVersion;
+
+ /**
+ * @return the hostName
+ */
+ @Override
+ public String getHostName() {
+ return hostName;
+ }
+
+ /**
+ * @param hostName the hostName to set
+ */
+ @Override
+ public void setHostName(String hostName) {
+ this.hostName = hostName;
+ }
+
+ @Override
+ public String getIPv4() {
+ return ipv4;
+ }
+
+ @Override
+ public void setIPv4(String ipv4) {
+ this.ipv4 = ipv4;
+ }
+
+ @Override
+ public String getIPv6() {
+ return ipv6;
+ }
+
+ @Override
+ public void setIPv6(String ipv6) {
+ this.ipv6 = ipv6;
+ }
+
+ /**
+ * @return the cpuCount
+ */
+ @Override
+ public int getCpuCount() {
+ return cpuCount;
+ }
+
+ /**
+ * @param cpuCount the cpuCount to set
+ */
+ @Override
+ public void setCpuCount(int cpuCount) {
+ this.cpuCount = cpuCount;
+ }
+
+ /**
+ * @return the totalMemBytes
+ */
+ @Override
+ public int getTotalMemBytes() {
+ return totalMemBytes;
+ }
+
+ /**
+ * @param totalMemBytes the totalMemBytes to set
+ */
+ @Override
+ public void setTotalMemBytes(int totalMemBytes) {
+ this.totalMemBytes = totalMemBytes;
+ }
+
+ /**
+ * @return the availableMemBytes
+ */
+ @Override
+ public int getAvailableMemBytes() {
+ return availableMemBytes;
+ }
+
+ /**
+ * @param availableMemBytes the availableMemBytes to set
+ */
+ @Override
+ public void setAvailableMemBytes(int availableMemBytes) {
+ this.availableMemBytes = availableMemBytes;
+ }
+
+ /**
+ * @return the osArch
+ */
+ @Override
+ public String getOsArch() {
+ return osArch;
+ }
+
+ /**
+ * @param osArch the osArch to set
+ */
+ @Override
+ public void setOsArch(String osArch) {
+ this.osArch = osArch;
+ }
+
+ /**
+ * @return the osInfo
+ */
+ @Override
+ public String getOsInfo() {
+ return osInfo;
+ }
+
+ /**
+ * @param osInfo the osInfo to set
+ */
+ @Override
+ public void setOsInfo(String osInfo) {
+ this.osInfo = osInfo;
+ }
+
+ /**
+ * @return the osType
+ */
+ @Override
+ public String getOsType() {
+ return osType;
+ }
+
+ /**
+ * @param osType the osType to set
+ */
+ @Override
+ public void setOsType(String osType) {
+ this.osType = osType;
+ }
+
+ /**
+ * @return the disksInfo
+ */
+ @Override
+ public List<DiskInfo> getDisksInfo() {
+ return disksInfo;
+ }
+
+ /**
+ * @param disksInfo the disksInfo to set
+ */
+ @Override
+ public void setDisksInfo(List<DiskInfo> disksInfo) {
+ this.disksInfo = disksInfo;
+ }
+
+ /**
+ * @return the healthStatus
+ */
+ @Override
+ public NodeHealthStatus getHealthStatus() {
+ return healthStatus;
+ }
+
+ /**
+ * @param healthStatus the healthStatus to set
+ */
+ @Override
+ public void setHealthStatus(NodeHealthStatus healthStatus) {
+ this.healthStatus = healthStatus;
+ }
+
+ /**
+ * @return the hostAttributes
+ */
+ @Override
+ public Map<String, String> getHostAttributes() {
+ return hostAttributes;
+ }
+
+ /**
+ * @param hostAttributes the hostAttributes to set
+ */
+ @Override
+ public void setHostAttributes(Map<String, String> hostAttributes) {
+ this.hostAttributes = hostAttributes;
+ }
+
+ /**
+ * @return the rackInfo
+ */
+ @Override
+ public String getRackInfo() {
+ return rackInfo;
+ }
+
+ /**
+ * @param rackInfo the rackInfo to set
+ */
+ @Override
+ public void setRackInfo(String rackInfo) {
+ this.rackInfo = rackInfo;
+ }
+
+ /**
+ * @return the lastRegistrationTime
+ */
+ @Override
+ public int getLastRegistrationTime() {
+ return lastRegistrationTime;
+ }
+
+ /**
+ * @param lastRegistrationTime the lastRegistrationTime to set
+ */
+ @Override
+ public void setLastRegistrationTime(int lastRegistrationTime) {
+ this.lastRegistrationTime = lastRegistrationTime;
+ }
+
+ /**
+ * @return the lastHeartbeatTime
+ */
+ @Override
+ public int getLastHeartbeatTime() {
+ return lastHeartbeatTime;
+ }
+
+ /**
+ * @param lastHeartbeatTime the lastHeartbeatTime to set
+ */
+ @Override
+ public void setLastHeartbeatTime(int lastHeartbeatTime) {
+ this.lastHeartbeatTime = lastHeartbeatTime;
+ }
+
+ /**
+ * @return the agentVersion
+ */
+ @Override
+ public AgentVersion getAgentVersion() {
+ return agentVersion;
+ }
+
+ /**
+ * @param agentVersion the agentVersion to set
+ */
+ @Override
+ public void setAgentVersion(AgentVersion agentVersion) {
+ this.agentVersion = agentVersion;
+ }
+
+ @Override
+ public NodeState getNodeState() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeState.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeState.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeState.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/NodeState.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,28 @@
+package org.apache.ambari.server;
+
+public enum NodeState {
+ /**
+ * New node state
+ */
+ INIT,
+ /**
+ * State when a registration request is received from the Node but
+ * the node has not been verified/authenticated.
+ */
+ WAITING_FOR_VERIFICATION,
+ /**
+ * State when the server is receiving heartbeats regularly from the Node
+ * and the state of the Node is healthy
+ */
+ HEALTHY,
+ /**
+ * State when the server has not received a heartbeat from the Node in the
+ * configured heartbeat expiry window.
+ */
+ HEARTBEAT_LOST,
+ /**
+ * Node is in unhealthy state as reported either by the Node itself or via
+ * any other additional means ( monitoring layer )
+ */
+ UNHEALTHY
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Service.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Service.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Service.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/Service.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,40 @@
+package org.apache.ambari.server;
+
+import java.util.Map;
+
+/**
+ * Service Interface for representing various products in the
+ * Hadoop eco-system such as HDFS, MAPREDUCE, HBASE.
+ */
+public interface Service {
+
+ /**
+ * @return Name of the Service Instance
+ */
+ public String getName();
+
+ /**
+ * Get the Service Type
+ * @return ServiceType
+ */
+ public ServiceType getType();
+
+ /**
+ * Get the ServiceComponents for this Service
+ * @return ServiceComponents mapped by their names
+ */
+ public Map<String, ServiceComponent> getServiceComponents();
+
+ /**
+ * Get the list of services that this Service depends on
+ * @return Services mapped by their names
+ */
+ public Map<String, Service> getDependencies();
+
+ /**
+ * Get the list of services that depend on this Service
+ * @return Services mapped by their names
+ */
+ public Map<String, Service> getDependents();
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponent.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponent.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponent.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponent.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,39 @@
+package org.apache.ambari.server;
+
+import java.util.Map;
+
+/**
+ * ServiceComponent Interface for representing components of the various
+ * products in the Hadoop eco-system such as NAMENODE, DATANODE for HDFS.
+ */
+public interface ServiceComponent {
+
+ /**
+ * @return Name of the ServiceComponent Instance
+ */
+ public String getName();
+
+ /**
+ * Get the ServiceComponentType for this instance
+ * @return ServiceComponentType
+ */
+ public ServiceComponentType getType();
+
+ /**
+ * Get the Service to which this ServiceComponent belongs to
+ * @return Service of which this ServiceComponent is part of
+ */
+ public Service getService();
+
+ /**
+ * Get the list of components that this ServiceComponent depends on
+ * @return ServiceComponents mapped by their names
+ */
+ public Map<String, ServiceComponent> getDependencies();
+
+ /**
+ * Get the list of components that depend on this ServiceComponent
+ * @return ServiceComponents mapped by their names
+ */
+ public Map<String, ServiceComponent> getDependents();
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponentType.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponentType.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponentType.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceComponentType.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,8 @@
+package org.apache.ambari.server;
+
+/**
+ * TODO
+ * Meta-data object for ServiceComponent
+ */
+public interface ServiceComponentType {
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceType.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceType.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceType.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/ServiceType.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,9 @@
+package org.apache.ambari.server;
+
+/**
+ * TODO
+ * Meta-data object for Service
+ */
+public interface ServiceType {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java Wed Aug 29 08:49:31 2012
@@ -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.server.configuration;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+
+/**
+ * Ambari configuration.
+ * Reads properties from ambari.properties
+ */
+public class Configuration {
+ private static final String AMBARI_CONF_VAR = "AMBARI_CONF_DIR";
+ private static final String CONFIG_FILE = "ambari.properties";
+
+ private static final Log LOG = LogFactory.getLog(Configuration.class);
+
+ private final URI dataStore;
+
+ Configuration() {
+ this(readConfigFile());
+ }
+
+ protected Configuration(Properties properties) {
+ // get the data store
+ String dataStoreString = properties.getProperty("data.store",
+ "test://test/");
+ try {
+ dataStore = new URI(dataStoreString);
+ } catch (URISyntaxException e) {
+ throw new IllegalArgumentException("Can't parse data.store: " +
+ dataStoreString, e);
+ }
+ }
+
+ /**
+ * Find, read, and parse the configuration file.
+ * @return the properties that were found or empty if no file was found
+ */
+ private static Properties readConfigFile() {
+ Properties properties = new Properties();
+
+ // get the configuration directory and filename
+ String confDir = System.getenv(AMBARI_CONF_VAR);
+ if (confDir == null) {
+ confDir = "/etc/ambari";
+ }
+ String filename = confDir + "/" + CONFIG_FILE;
+
+ // load the properties
+ try {
+ properties.load(new FileInputStream(filename));
+ } catch (FileNotFoundException fnf) {
+ LOG.info("No configuration file " + filename + " found.", fnf);
+ } catch (IOException ie) {
+ throw new IllegalArgumentException("Can't read configuration file " +
+ filename, ie);
+ }
+ return properties;
+ }
+
+ /**
+ * Get the URI for the persistent data store.
+ * @return the data store URI
+ */
+ public URI getDataStore() {
+ return dataStore;
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEvent.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEvent.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEvent.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEvent.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,13 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.fsm.event.AbstractEvent;
+
+public class ActionEvent extends AbstractEvent<ActionEventType> {
+
+ // TODO
+ // this should have some action identifier
+ public ActionEvent(ActionEventType type) {
+ super(type);
+ // TODO Auto-generated constructor stub
+ }
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEventType.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEventType.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEventType.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionEventType.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,8 @@
+package org.apache.ambari.server.fsm;
+
+public enum ActionEventType {
+ ACTION_INIT,
+ ACTION_IN_PROGRESS,
+ ACTION_COMPLETED,
+ ACTION_FAILED
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSM.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSM.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSM.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSM.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,5 @@
+package org.apache.ambari.server.fsm;
+
+public interface ActionFSM {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSMImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSMImpl.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSMImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/ActionFSMImpl.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,31 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.ActionState;
+import org.apache.ambari.server.fsm.StateMachineFactory;
+
+public class ActionFSMImpl implements ActionFSM {
+
+ private static final StateMachineFactory
+ <ActionFSMImpl, ActionState, ActionEventType, ActionEvent>
+ stateMachineFactory
+ = new StateMachineFactory<ActionFSMImpl, ActionState,
+ ActionEventType, ActionEvent>
+ (ActionState.INIT)
+
+ // define the state machine of a Action
+
+ .addTransition(ActionState.INIT, ActionState.IN_PROGRESS,
+ ActionEventType.ACTION_IN_PROGRESS)
+ .addTransition(ActionState.IN_PROGRESS, ActionState.IN_PROGRESS,
+ ActionEventType.ACTION_IN_PROGRESS)
+ .addTransition(ActionState.IN_PROGRESS, ActionState.COMPLETED,
+ ActionEventType.ACTION_COMPLETED)
+ .addTransition(ActionState.IN_PROGRESS, ActionState.FAILED,
+ ActionEventType.ACTION_FAILED)
+ .addTransition(ActionState.COMPLETED, ActionState.INIT,
+ ActionEventType.ACTION_INIT)
+ .addTransition(ActionState.FAILED, ActionState.INIT,
+ ActionEventType.ACTION_INIT)
+ .installTopology();
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/InvalidStateTransitonException.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/InvalidStateTransitonException.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/InvalidStateTransitonException.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/InvalidStateTransitonException.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,41 @@
+/**
+* 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.server.fsm;
+
+// TODO
+public class InvalidStateTransitonException extends Exception {
+
+ private Enum<?> currentState;
+ private Enum<?> event;
+
+ public InvalidStateTransitonException(Enum<?> currentState, Enum<?> event) {
+ super("Invalid event: " + event + " at " + currentState);
+ this.currentState = currentState;
+ this.event = event;
+ }
+
+ public Enum<?> getCurrentState() {
+ return currentState;
+ }
+
+ public Enum<?> getEvent() {
+ return event;
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/MultipleArcTransition.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/MultipleArcTransition.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/MultipleArcTransition.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/MultipleArcTransition.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,39 @@
+/**
+* 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.server.fsm;
+
+/**
+ * Hook for Transition.
+ * Post state is decided by Transition hook. Post state must be one of the
+ * valid post states registered in StateMachine.
+ */
+public interface MultipleArcTransition
+ <OPERAND, EVENT, STATE extends Enum<STATE>> {
+
+ /**
+ * Transition hook.
+ * @return the postState. Post state must be one of the
+ * valid post states registered in StateMachine.
+ * @param operand the entity attached to the FSM, whose internal
+ * state may change.
+ * @param event causal event
+ */
+ public STATE transition(OPERAND operand, EVENT event);
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEvent.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEvent.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEvent.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEvent.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,14 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.fsm.event.AbstractEvent;
+
+public class NodeEvent extends AbstractEvent<NodeEventType> {
+
+ // TODO
+ // this should have some node identifier
+ public NodeEvent(NodeEventType type) {
+ super(type);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEventType.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEventType.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEventType.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeEventType.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,9 @@
+package org.apache.ambari.server.fsm;
+
+public enum NodeEventType {
+ NODE_REGISTRATION_REQUEST,
+ NODE_VERIFIED,
+ NODE_HEARTBEAT_HEALTHY,
+ NODE_HEARTBEAT_TIMED_OUT,
+ NODE_HEARTBEAT_UNHEALTHY
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSM.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSM.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSM.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSM.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,5 @@
+package org.apache.ambari.server.fsm;
+
+public interface NodeFSM {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSMImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSMImpl.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSMImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeFSMImpl.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,58 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.NodeState;
+import org.apache.ambari.server.fsm.SingleArcTransition;
+import org.apache.ambari.server.fsm.StateMachineFactory;
+
+public class NodeFSMImpl implements NodeFSM {
+
+ private static final StateMachineFactory
+ <NodeFSMImpl, NodeState, NodeEventType, NodeEvent>
+ stateMachineFactory
+ = new StateMachineFactory<NodeFSMImpl, NodeState, NodeEventType, NodeEvent>
+ (NodeState.INIT)
+
+ // define the state machine of a Node
+
+ .addTransition(NodeState.INIT, NodeState.WAITING_FOR_VERIFICATION,
+ NodeEventType.NODE_REGISTRATION_REQUEST)
+
+ .addTransition(NodeState.WAITING_FOR_VERIFICATION, NodeState.HEALTHY,
+ NodeEventType.NODE_VERIFIED, new NodeVerifiedTransition())
+
+ // TODO - should be able to combine multiple into a single multi-arc
+ // transition
+ .addTransition(NodeState.HEALTHY, NodeState.HEALTHY,
+ NodeEventType.NODE_HEARTBEAT_HEALTHY)
+ .addTransition(NodeState.HEALTHY, NodeState.HEARTBEAT_LOST,
+ NodeEventType.NODE_HEARTBEAT_TIMED_OUT)
+ .addTransition(NodeState.HEALTHY, NodeState.UNHEALTHY,
+ NodeEventType.NODE_HEARTBEAT_UNHEALTHY)
+
+ .addTransition(NodeState.UNHEALTHY, NodeState.HEALTHY,
+ NodeEventType.NODE_HEARTBEAT_HEALTHY)
+ .addTransition(NodeState.UNHEALTHY, NodeState.UNHEALTHY,
+ NodeEventType.NODE_HEARTBEAT_UNHEALTHY)
+ .addTransition(NodeState.UNHEALTHY, NodeState.HEARTBEAT_LOST,
+ NodeEventType.NODE_HEARTBEAT_TIMED_OUT)
+
+ .addTransition(NodeState.HEARTBEAT_LOST, NodeState.HEALTHY,
+ NodeEventType.NODE_HEARTBEAT_HEALTHY)
+ .addTransition(NodeState.HEARTBEAT_LOST, NodeState.UNHEALTHY,
+ NodeEventType.NODE_HEARTBEAT_UNHEALTHY)
+ .addTransition(NodeState.HEARTBEAT_LOST, NodeState.HEARTBEAT_LOST,
+ NodeEventType.NODE_HEARTBEAT_TIMED_OUT)
+ .installTopology();
+
+
+ static class NodeVerifiedTransition
+ implements SingleArcTransition<NodeFSMImpl, NodeEvent> {
+
+ @Override
+ public void transition(NodeFSMImpl node, NodeEvent event) {
+ // TODO Auto-generated method stub
+ }
+
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEvent.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEvent.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEvent.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEvent.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,12 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.fsm.event.AbstractEvent;
+
+public class NodeServiceComponentEvent extends AbstractEvent<ActionEventType> {
+
+ public NodeServiceComponentEvent(ActionEventType type) {
+ super(type);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEventType.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEventType.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEventType.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentEventType.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,13 @@
+package org.apache.ambari.server.fsm;
+
+public enum NodeServiceComponentEventType {
+ NODE_SVCCOMP_OP_IN_PROGRESS,
+ NODE_SVCCOMP_OP_SUCCEEDED,
+ NODE_SVCCOMP_OP_FAILED,
+ NODE_SVCCOMP_OP_RESTART,
+ NODE_SVCCOMP_INSTALL,
+ NODE_SVCCOMP_START,
+ NODE_SVCCOMP_STOP,
+ NODE_SVCCOMP_UNINSTALL,
+ NODE_SVCCOMP_WIPEOUT
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSM.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSM.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSM.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSM.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,5 @@
+package org.apache.ambari.server.fsm;
+
+public interface NodeServiceComponentFSM {
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSMImpl.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSMImpl.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSMImpl.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentFSMImpl.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,101 @@
+package org.apache.ambari.server.fsm;
+
+import org.apache.ambari.server.fsm.StateMachineFactory;
+
+public class NodeServiceComponentFSMImpl implements NodeServiceComponentFSM {
+
+ private static final StateMachineFactory
+ <NodeServiceComponentFSMImpl, NodeServiceComponentState,
+ NodeServiceComponentEventType, NodeServiceComponentEvent>
+ stateMachineFactory
+ = new StateMachineFactory<NodeServiceComponentFSMImpl,
+ NodeServiceComponentState, NodeServiceComponentEventType,
+ NodeServiceComponentEvent>
+ (NodeServiceComponentState.INIT)
+
+ // define the state machine of a NodeServiceComponent
+
+ .addTransition(NodeServiceComponentState.INIT,
+ NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_INSTALL)
+
+ .addTransition(NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentState.INSTALLED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_SUCCEEDED)
+ .addTransition(NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_IN_PROGRESS)
+ .addTransition(NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentState.INSTALL_FAILED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_FAILED)
+
+ .addTransition(NodeServiceComponentState.INSTALL_FAILED,
+ NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_RESTART)
+
+ .addTransition(NodeServiceComponentState.INSTALLED,
+ NodeServiceComponentState.STARTING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_START)
+ .addTransition(NodeServiceComponentState.INSTALLED,
+ NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_UNINSTALL)
+ .addTransition(NodeServiceComponentState.INSTALLED,
+ NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_INSTALL)
+
+ .addTransition(NodeServiceComponentState.STARTING,
+ NodeServiceComponentState.STARTING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_IN_PROGRESS)
+ .addTransition(NodeServiceComponentState.STARTING,
+ NodeServiceComponentState.STARTED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_SUCCEEDED)
+ .addTransition(NodeServiceComponentState.STARTING,
+ NodeServiceComponentState.START_FAILED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_FAILED)
+
+ .addTransition(NodeServiceComponentState.START_FAILED,
+ NodeServiceComponentState.STARTING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_RESTART)
+
+ .addTransition(NodeServiceComponentState.STARTED,
+ NodeServiceComponentState.STOPPING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_STOP)
+
+ .addTransition(NodeServiceComponentState.STOPPING,
+ NodeServiceComponentState.STOPPING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_IN_PROGRESS)
+ .addTransition(NodeServiceComponentState.STOPPING,
+ NodeServiceComponentState.INSTALLED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_SUCCEEDED)
+ .addTransition(NodeServiceComponentState.STOPPING,
+ NodeServiceComponentState.STOP_FAILED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_FAILED)
+
+ .addTransition(NodeServiceComponentState.STOP_FAILED,
+ NodeServiceComponentState.STOPPING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_RESTART)
+
+ .addTransition(NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_IN_PROGRESS)
+ .addTransition(NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentState.UNINSTALLED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_SUCCEEDED)
+ .addTransition(NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentState.UNINSTALL_FAILED,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_FAILED)
+
+ .addTransition(NodeServiceComponentState.UNINSTALL_FAILED,
+ NodeServiceComponentState.UNINSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_OP_RESTART)
+
+ .addTransition(NodeServiceComponentState.UNINSTALLED,
+ NodeServiceComponentState.INSTALLING,
+ NodeServiceComponentEventType.NODE_SVCCOMP_INSTALL)
+
+ .addTransition(NodeServiceComponentState.UNINSTALLED,
+ NodeServiceComponentState.INIT,
+ NodeServiceComponentEventType.NODE_SVCCOMP_WIPEOUT)
+
+ .installTopology();
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentState.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentState.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentState.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeServiceComponentState.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,16 @@
+package org.apache.ambari.server.fsm;
+
+public enum NodeServiceComponentState {
+ INIT,
+ INSTALLING,
+ INSTALL_FAILED,
+ INSTALLED,
+ STARTING,
+ START_FAILED,
+ STARTED,
+ STOPPING,
+ STOP_FAILED,
+ UNINSTALLING,
+ UNINSTALL_FAILED,
+ UNINSTALLED
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeState.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeState.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeState.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/NodeState.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,9 @@
+package org.apache.ambari.server.fsm;
+
+public enum NodeState {
+ INIT,
+ WAITING_FOR_VERIFICATION,
+ HEALTHY,
+ HEARTBEAT_LOST,
+ UNHEALTHY
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/SingleArcTransition.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/SingleArcTransition.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/SingleArcTransition.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/SingleArcTransition.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,35 @@
+/**
+* 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.server.fsm;
+
+/**
+ * Hook for Transition. This lead to state machine to move to
+ * the post state as registered in the state machine.
+ */
+public interface SingleArcTransition<OPERAND, EVENT> {
+ /**
+ * Transition hook.
+ *
+ * @param operand the entity attached to the FSM, whose internal
+ * state may change.
+ * @param event causal event
+ */
+ public void transition(OPERAND operand, EVENT event);
+
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachine.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachine.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachine.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachine.java Wed Aug 29 08:49:31 2012
@@ -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.ambari.server.fsm;
+
+public interface StateMachine
+ <STATE extends Enum<STATE>,
+ EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {
+ public STATE getCurrentState();
+ public STATE doTransition(EVENTTYPE eventType, EVENT event)
+ throws InvalidStateTransitonException;
+}
Added: incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachineFactory.java
URL: http://svn.apache.org/viewvc/incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachineFactory.java?rev=1378479&view=auto
==============================================================================
--- incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachineFactory.java (added)
+++ incubator/ambari/branches/AMBARI-666/ambari-server/src/main/java/org/apache/ambari/server/fsm/StateMachineFactory.java Wed Aug 29 08:49:31 2012
@@ -0,0 +1,480 @@
+/**
+* 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.server.fsm;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Stack;
+
+/**
+ * State machine topology.
+ * This object is semantically immutable. If you have a
+ * StateMachineFactory there's no operation in the API that changes
+ * its semantic properties.
+ *
+ * @param <OPERAND> The object type on which this state machine operates.
+ * @param <STATE> The state of the entity.
+ * @param <EVENTTYPE> The external eventType to be handled.
+ * @param <EVENT> The event object.
+ *
+ */
+final public class StateMachineFactory
+ <OPERAND, STATE extends Enum<STATE>,
+ EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {
+
+ private final TransitionsListNode transitionsListNode;
+
+ private Map<STATE, Map<EVENTTYPE,
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT>>> stateMachineTable;
+
+ private STATE defaultInitialState;
+
+ private final boolean optimized;
+
+ /**
+ * Constructor
+ *
+ * This is the only constructor in the API.
+ *
+ */
+ public StateMachineFactory(STATE defaultInitialState) {
+ this.transitionsListNode = null;
+ this.defaultInitialState = defaultInitialState;
+ this.optimized = false;
+ this.stateMachineTable = null;
+ }
+
+ private StateMachineFactory
+ (StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that,
+ ApplicableTransition t) {
+ this.defaultInitialState = that.defaultInitialState;
+ this.transitionsListNode
+ = new TransitionsListNode(t, that.transitionsListNode);
+ this.optimized = false;
+ this.stateMachineTable = null;
+ }
+
+ private StateMachineFactory
+ (StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> that,
+ boolean optimized) {
+ this.defaultInitialState = that.defaultInitialState;
+ this.transitionsListNode = that.transitionsListNode;
+ this.optimized = optimized;
+ if (optimized) {
+ makeStateMachineTable();
+ } else {
+ stateMachineTable = null;
+ }
+ }
+
+ private interface ApplicableTransition
+ <OPERAND, STATE extends Enum<STATE>,
+ EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {
+ void apply(StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> subject);
+ }
+
+ private class TransitionsListNode {
+ final ApplicableTransition transition;
+ final TransitionsListNode next;
+
+ TransitionsListNode
+ (ApplicableTransition transition, TransitionsListNode next) {
+ this.transition = transition;
+ this.next = next;
+ }
+ }
+
+ static private class ApplicableSingleOrMultipleTransition
+ <OPERAND, STATE extends Enum<STATE>,
+ EVENTTYPE extends Enum<EVENTTYPE>, EVENT>
+ implements ApplicableTransition<OPERAND, STATE, EVENTTYPE, EVENT> {
+ final STATE preState;
+ final EVENTTYPE eventType;
+ final Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition;
+
+ ApplicableSingleOrMultipleTransition
+ (STATE preState, EVENTTYPE eventType,
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition) {
+ this.preState = preState;
+ this.eventType = eventType;
+ this.transition = transition;
+ }
+
+ @Override
+ public void apply
+ (StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> subject) {
+ Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap
+ = subject.stateMachineTable.get(preState);
+ if (transitionMap == null) {
+ // I use HashMap here because I would expect most EVENTTYPE's to not
+ // apply out of a particular state, so FSM sizes would be
+ // quadratic if I use EnumMap's here as I do at the top level.
+ transitionMap = new HashMap<EVENTTYPE,
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT>>();
+ subject.stateMachineTable.put(preState, transitionMap);
+ }
+ transitionMap.put(eventType, transition);
+ }
+ }
+
+ /**
+ * @return a NEW StateMachineFactory just like {@code this} with the current
+ * transition added as a new legal transition. This overload
+ * has no hook object.
+ *
+ * Note that the returned StateMachineFactory is a distinct
+ * object.
+ *
+ * This method is part of the API.
+ *
+ * @param preState pre-transition state
+ * @param postState post-transition state
+ * @param eventType stimulus for the transition
+ */
+ public StateMachineFactory
+ <OPERAND, STATE, EVENTTYPE, EVENT>
+ addTransition(STATE preState, STATE postState, EVENTTYPE eventType) {
+ return addTransition(preState, postState, eventType, null);
+ }
+
+ /**
+ * @return a NEW StateMachineFactory just like {@code this} with the current
+ * transition added as a new legal transition. This overload
+ * has no hook object.
+ *
+ *
+ * Note that the returned StateMachineFactory is a distinct
+ * object.
+ *
+ * This method is part of the API.
+ *
+ * @param preState pre-transition state
+ * @param postState post-transition state
+ * @param eventTypes List of stimuli for the transitions
+ */
+ public StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> addTransition(
+ STATE preState, STATE postState, Set<EVENTTYPE> eventTypes) {
+ return addTransition(preState, postState, eventTypes, null);
+ }
+
+ /**
+ * @return a NEW StateMachineFactory just like {@code this} with the current
+ * transition added as a new legal transition
+ *
+ * Note that the returned StateMachineFactory is a distinct
+ * object.
+ *
+ * This method is part of the API.
+ *
+ * @param preState pre-transition state
+ * @param postState post-transition state
+ * @param eventTypes List of stimuli for the transitions
+ * @param hook transition hook
+ */
+ public StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> addTransition(
+ STATE preState, STATE postState, Set<EVENTTYPE> eventTypes,
+ SingleArcTransition<OPERAND, EVENT> hook) {
+ StateMachineFactory<OPERAND, STATE, EVENTTYPE, EVENT> factory = null;
+ for (EVENTTYPE event : eventTypes) {
+ if (factory == null) {
+ factory = addTransition(preState, postState, event, hook);
+ } else {
+ factory = factory.addTransition(preState, postState, event, hook);
+ }
+ }
+ return factory;
+ }
+
+ /**
+ * @return a NEW StateMachineFactory just like {@code this} with the current
+ * transition added as a new legal transition
+ *
+ * Note that the returned StateMachineFactory is a distinct object.
+ *
+ * This method is part of the API.
+ *
+ * @param preState pre-transition state
+ * @param postState post-transition state
+ * @param eventType stimulus for the transition
+ * @param hook transition hook
+ */
+ public StateMachineFactory
+ <OPERAND, STATE, EVENTTYPE, EVENT>
+ addTransition(STATE preState, STATE postState,
+ EVENTTYPE eventType,
+ SingleArcTransition<OPERAND, EVENT> hook){
+ return new StateMachineFactory
+ (this, new ApplicableSingleOrMultipleTransition
+ (preState, eventType, new SingleInternalArc(postState, hook)));
+ }
+
+ /**
+ * @return a NEW StateMachineFactory just like {@code this} with the current
+ * transition added as a new legal transition
+ *
+ * Note that the returned StateMachineFactory is a distinct object.
+ *
+ * This method is part of the API.
+ *
+ * @param preState pre-transition state
+ * @param postStates valid post-transition states
+ * @param eventType stimulus for the transition
+ * @param hook transition hook
+ */
+ public StateMachineFactory
+ <OPERAND, STATE, EVENTTYPE, EVENT>
+ addTransition(STATE preState, Set<STATE> postStates,
+ EVENTTYPE eventType,
+ MultipleArcTransition<OPERAND, EVENT, STATE> hook){
+ return new StateMachineFactory
+ (this,
+ new ApplicableSingleOrMultipleTransition
+ (preState, eventType, new MultipleInternalArc(postStates, hook)));
+ }
+
+ /**
+ * @return a StateMachineFactory just like {@code this}, except that if
+ * you won't need any synchronization to build a state machine
+ *
+ * Note that the returned StateMachineFactory is a distinct object.
+ *
+ * This method is part of the API.
+ *
+ * The only way you could distinguish the returned
+ * StateMachineFactory from {@code this} would be by
+ * measuring the performance of the derived
+ * {@code StateMachine} you can get from it.
+ *
+ * Calling this is optional. It doesn't change the semantics of the factory,
+ * if you call it then when you use the factory there is no synchronization.
+ */
+ public StateMachineFactory
+ <OPERAND, STATE, EVENTTYPE, EVENT>
+ installTopology() {
+ return new StateMachineFactory(this, true);
+ }
+
+ /**
+ * Effect a transition due to the effecting stimulus.
+ * @param state current state
+ * @param eventType trigger to initiate the transition
+ * @param cause causal eventType context
+ * @return transitioned state
+ */
+ private STATE doTransition
+ (OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event)
+ throws InvalidStateTransitonException {
+ // We can assume that stateMachineTable is non-null because we call
+ // maybeMakeStateMachineTable() when we build an InnerStateMachine ,
+ // and this code only gets called from inside a working InnerStateMachine .
+ Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitionMap
+ = stateMachineTable.get(oldState);
+ if (transitionMap != null) {
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition
+ = transitionMap.get(eventType);
+ if (transition != null) {
+ return transition.doTransition(operand, oldState, event, eventType);
+ }
+ }
+ throw new InvalidStateTransitonException(oldState, eventType);
+ }
+
+ private synchronized void maybeMakeStateMachineTable() {
+ if (stateMachineTable == null) {
+ makeStateMachineTable();
+ }
+ }
+
+ private void makeStateMachineTable() {
+ Stack<ApplicableTransition> stack = new Stack<ApplicableTransition>();
+
+ Map<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>
+ prototype = new HashMap<STATE, Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>();
+
+ prototype.put(defaultInitialState, null);
+
+ // I use EnumMap here because it'll be faster and denser. I would
+ // expect most of the states to have at least one transition.
+ stateMachineTable
+ = new EnumMap<STATE, Map<EVENTTYPE,
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT>>>(prototype);
+
+ for (TransitionsListNode cursor = transitionsListNode;
+ cursor != null;
+ cursor = cursor.next) {
+ stack.push(cursor.transition);
+ }
+
+ while (!stack.isEmpty()) {
+ stack.pop().apply(this);
+ }
+ }
+
+ private interface Transition<OPERAND, STATE extends Enum<STATE>,
+ EVENTTYPE extends Enum<EVENTTYPE>, EVENT> {
+ STATE doTransition(OPERAND operand, STATE oldState,
+ EVENT event, EVENTTYPE eventType)
+ throws InvalidStateTransitonException;
+ }
+
+ private class SingleInternalArc
+ implements Transition<OPERAND, STATE, EVENTTYPE, EVENT> {
+
+ private STATE postState;
+ private SingleArcTransition<OPERAND, EVENT> hook; // transition hook
+
+ SingleInternalArc(STATE postState,
+ SingleArcTransition<OPERAND, EVENT> hook) {
+ this.postState = postState;
+ this.hook = hook;
+ }
+
+ @Override
+ public STATE doTransition(OPERAND operand, STATE oldState,
+ EVENT event, EVENTTYPE eventType) {
+ if (hook != null) {
+ hook.transition(operand, event);
+ }
+ return postState;
+ }
+ }
+
+ private class MultipleInternalArc
+ implements Transition<OPERAND, STATE, EVENTTYPE, EVENT>{
+
+ // Fields
+ private Set<STATE> validPostStates;
+ private MultipleArcTransition<OPERAND, EVENT, STATE> hook; // transition hook
+
+ MultipleInternalArc(Set<STATE> postStates,
+ MultipleArcTransition<OPERAND, EVENT, STATE> hook) {
+ this.validPostStates = postStates;
+ this.hook = hook;
+ }
+
+ @Override
+ public STATE doTransition(OPERAND operand, STATE oldState,
+ EVENT event, EVENTTYPE eventType)
+ throws InvalidStateTransitonException {
+ STATE postState = hook.transition(operand, event);
+
+ if (!validPostStates.contains(postState)) {
+ throw new InvalidStateTransitonException(oldState, eventType);
+ }
+ return postState;
+ }
+ }
+
+ /*
+ * @return a {@link StateMachine} that starts in
+ * {@code initialState} and whose {@link Transition} s are
+ * applied to {@code operand} .
+ *
+ * This is part of the API.
+ *
+ * @param operand the object upon which the returned
+ * {@link StateMachine} will operate.
+ * @param initialState the state in which the returned
+ * {@link StateMachine} will start.
+ *
+ */
+ public StateMachine<STATE, EVENTTYPE, EVENT>
+ make(OPERAND operand, STATE initialState) {
+ return new InternalStateMachine(operand, initialState);
+ }
+
+ /*
+ * @return a {@link StateMachine} that starts in the default initial
+ * state and whose {@link Transition} s are applied to
+ * {@code operand} .
+ *
+ * This is part of the API.
+ *
+ * @param operand the object upon which the returned
+ * {@link StateMachine} will operate.
+ *
+ */
+ public StateMachine<STATE, EVENTTYPE, EVENT> make(OPERAND operand) {
+ return new InternalStateMachine(operand, defaultInitialState);
+ }
+
+ private class InternalStateMachine
+ implements StateMachine<STATE, EVENTTYPE, EVENT> {
+ private final OPERAND operand;
+ private STATE currentState;
+
+ InternalStateMachine(OPERAND operand, STATE initialState) {
+ this.operand = operand;
+ this.currentState = initialState;
+ if (!optimized) {
+ maybeMakeStateMachineTable();
+ }
+ }
+
+ @Override
+ public synchronized STATE getCurrentState() {
+ return currentState;
+ }
+
+ @Override
+ public synchronized STATE doTransition(EVENTTYPE eventType, EVENT event)
+ throws InvalidStateTransitonException {
+ currentState = StateMachineFactory.this.doTransition
+ (operand, currentState, eventType, event);
+ return currentState;
+ }
+ }
+
+ /*
+ * Generate a graph represents the state graph of this StateMachine
+ * @param name graph name
+ * @return Graph object generated
+ public Graph generateStateGraph(String name) {
+ maybeMakeStateMachineTable();
+ Graph g = new Graph(name);
+ for (STATE startState : stateMachineTable.keySet()) {
+ Map<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> transitions
+ = stateMachineTable.get(startState);
+ for (Entry<EVENTTYPE, Transition<OPERAND, STATE, EVENTTYPE, EVENT>> entry :
+ transitions.entrySet()) {
+ Transition<OPERAND, STATE, EVENTTYPE, EVENT> transition = entry.getValue();
+ if (transition instanceof StateMachineFactory.SingleInternalArc) {
+ StateMachineFactory.SingleInternalArc sa
+ = (StateMachineFactory.SingleInternalArc) transition;
+ Graph.Node fromNode = g.getNode(startState.toString());
+ Graph.Node toNode = g.getNode(sa.postState.toString());
+ fromNode.addEdge(toNode, entry.getKey().toString());
+ } else if (transition instanceof StateMachineFactory.MultipleInternalArc) {
+ StateMachineFactory.MultipleInternalArc ma
+ = (StateMachineFactory.MultipleInternalArc) transition;
+ Iterator<STATE> iter = ma.validPostStates.iterator();
+ while (iter.hasNext()) {
+ Graph.Node fromNode = g.getNode(startState.toString());
+ Graph.Node toNode = g.getNode(iter.next().toString());
+ fromNode.addEdge(toNode, entry.getKey().toString());
+ }
+ }
+ }
+ }
+ return g;
+ }
+ */
+}