You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rn...@apache.org on 2014/11/24 18:47:58 UTC

ambari git commit: AMBARI-8336. Add Security State to Ambari database. (Robert Levas via rnettleton)

Repository: ambari
Updated Branches:
  refs/heads/trunk f04b03941 -> 6b93fb544


AMBARI-8336. Add Security State to Ambari database. (Robert Levas via rnettleton)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/6b93fb54
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/6b93fb54
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/6b93fb54

Branch: refs/heads/trunk
Commit: 6b93fb54452211af1ed678e9fabd8ed165b005a2
Parents: f04b039
Author: Robert Levas <rl...@hortonworks.com>
Authored: Mon Nov 24 12:38:24 2014 -0500
Committer: Bob Nettleton <rn...@hortonworks.com>
Committed: Mon Nov 24 12:47:18 2014 -0500

----------------------------------------------------------------------
 .../HostComponentDesiredStateEntity.java        | 14 ++++
 .../orm/entities/HostComponentStateEntity.java  | 15 +++-
 .../orm/entities/ServiceDesiredStateEntity.java | 14 +++-
 .../ambari/server/state/SecurityState.java      | 83 ++++++++++++++++++++
 .../org/apache/ambari/server/state/Service.java | 18 +++++
 .../server/state/ServiceComponentHost.java      | 40 ++++++++++
 .../apache/ambari/server/state/ServiceImpl.java | 42 ++++++++++
 .../svccomphost/ServiceComponentHostImpl.java   | 68 ++++++++++++++++
 .../server/upgrade/UpgradeCatalog200.java       |  9 +++
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  3 +
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |  5 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |  3 +
 .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql     |  3 +
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |  6 +-
 .../apache/ambari/server/state/ServiceTest.java | 48 +++++++++--
 .../svccomphost/ServiceComponentHostTest.java   | 59 ++++++++++++++
 .../server/upgrade/UpgradeCatalog200Test.java   | 49 ++++++++++++
 17 files changed, 467 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
index 610f77f..e0f1e9e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
@@ -30,6 +30,7 @@ import javax.persistence.JoinColumn;
 import javax.persistence.JoinColumns;
 import javax.persistence.ManyToOne;
 
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.HostComponentAdminState;
 import org.apache.ambari.server.state.MaintenanceState;
 import org.apache.ambari.server.state.State;
@@ -61,6 +62,11 @@ public class HostComponentDesiredStateEntity {
   private State desiredState = State.INIT;
 
   @Basic
+  @Column(name = "security_state", nullable = false, insertable = true, updatable = true)
+  @Enumerated(value = EnumType.STRING)
+  private SecurityState securityState = SecurityState.UNSECURED;
+
+  @Basic
   @Column(name = "desired_stack_version", insertable = true, updatable = true)
   private String desiredStackVersion = "";
 
@@ -127,6 +133,14 @@ public class HostComponentDesiredStateEntity {
     this.desiredState = desiredState;
   }
 
+  public SecurityState getSecurityState() {
+    return securityState;
+  }
+
+  public void setSecurityState(SecurityState securityState) {
+    this.securityState = securityState;
+  }
+
   public String getDesiredStackVersion() {
     return defaultString(desiredStackVersion);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentStateEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentStateEntity.java
index 81de777..11f2c14 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentStateEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentStateEntity.java
@@ -18,8 +18,7 @@
 
 package org.apache.ambari.server.orm.entities;
 
-import java.util.Collection;
-
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.State;
 import org.apache.ambari.server.state.UpgradeState;
 
@@ -56,6 +55,10 @@ public class HostComponentStateEntity {
   @Column(name = "upgrade_state", nullable = false, insertable = true, updatable = true)
   private UpgradeState upgradeState = UpgradeState.NONE;
 
+  @Enumerated(value = EnumType.STRING)
+  @Column(name = "security_state", nullable = false, insertable = true, updatable = true)
+  private SecurityState securityState = SecurityState.UNSECURED;
+
   @Basic
   @Column(name = "current_stack_version", nullable = false, insertable = true, updatable = true)
   private String currentStackVersion;
@@ -111,6 +114,14 @@ public class HostComponentStateEntity {
     this.currentState = currentState;
   }
 
+  public SecurityState getSecurityState() {
+    return securityState;
+  }
+
+  public void setSecurityState(SecurityState securityState) {
+    this.securityState = securityState;
+  }
+
   public UpgradeState getUpgradeState() {
     return upgradeState;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDesiredStateEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDesiredStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDesiredStateEntity.java
index a74b021..2d2c386 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDesiredStateEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceDesiredStateEntity.java
@@ -19,6 +19,7 @@
 package org.apache.ambari.server.orm.entities;
 
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.State;
 import org.apache.commons.lang.StringUtils;
 
@@ -53,7 +54,10 @@ public class ServiceDesiredStateEntity {
   @Enumerated(value = EnumType.STRING)
   private MaintenanceState maintenanceState = MaintenanceState.OFF;
   
-  
+  @Column(name = "security_state", nullable = false, insertable = true, updatable = true)
+  @Enumerated(value = EnumType.STRING)
+  private SecurityState securityState = SecurityState.UNSECURED;
+
   @OneToOne
   @javax.persistence.JoinColumns(
       {
@@ -110,6 +114,14 @@ public class ServiceDesiredStateEntity {
     maintenanceState = state;
   }
 
+  public SecurityState getSecurityState() {
+    return securityState;
+  }
+
+  public void setSecurityState(SecurityState securityState) {
+    this.securityState = securityState;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) return true;

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/state/SecurityState.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/SecurityState.java b/ambari-server/src/main/java/org/apache/ambari/server/state/SecurityState.java
new file mode 100644
index 0000000..8d8b136
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/SecurityState.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.state;
+
+import java.util.EnumSet;
+
+/**
+ * Indicates the security state of a service or component.
+ */
+public enum SecurityState {
+  /**
+   * Indicates that it is not known whether the service or component is secured or not
+   */
+  UNKNOWN,
+  /**
+   * Indicates service or component is not or should not be secured
+   */
+  UNSECURED,
+  /**
+   * Indicates component is or should be secured using Kerberos
+   */
+  SECURED_KERBEROS,
+  /**
+   * Indicates the component is in the process of being secured
+   */
+  SECURING,
+  /**
+   * Indicates the component is in the process of being unsecured
+   */
+  UNSECURING,
+  /**
+   * Indicates the component is not secured due to an error condition
+   */
+  ERROR;
+
+  /**
+   * The subset of states that are considered endpoints, meaning they do not indicate the state is
+   * in transition.
+   */
+  public static final EnumSet<SecurityState> ENDPOINT_STATES =
+      EnumSet.of(UNKNOWN, UNSECURED, ERROR, SECURED_KERBEROS);
+
+  /**
+   * The subset of states that are considered transitional, meaning they indicate a task is in
+   * process to reach some endpoint state
+   */
+  public static final EnumSet<SecurityState> TRANSITIONAL_STATES =
+      EnumSet.of(SECURING, UNSECURING);
+
+  /**
+   * Tests this SecurityState to see if it is an endpoint state.
+   *
+   * @return true if this state is an endpoint state; otherwise false
+   */
+  public boolean isEndpoint() {
+    return ENDPOINT_STATES.contains(this);
+  }
+
+  /**
+   * Tests this SecurityState to see if it is a transitional state.
+   *
+   * @return true if this state is a transitional state; otherwise false
+   */
+  public boolean isTransitional() {
+    return TRANSITIONAL_STATES.contains(this);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
index 4a18c69..552ccee 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/Service.java
@@ -49,6 +49,24 @@ public interface Service {
 
   public void setDesiredState(State state);
 
+  /**
+   * Gets this Service's security state.
+   *
+   * @return this services desired SecurityState
+   */
+  public SecurityState getSecurityState();
+
+  /**
+   * Sets this Service's desired security state
+   * <p/>
+   * It is expected that the new SecurityState is a valid endpoint state such that
+   * SecurityState.isEndpoint() == true.
+   *
+   * @param securityState the desired SecurityState for this Service
+   * @throws AmbariException if the new state is not an endpoint state
+   */
+  public void setSecurityState(SecurityState securityState) throws AmbariException;
+
   public StackId getDesiredStackVersion();
 
   public void setDesiredStackVersion(StackId stackVersion);

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
index 3142974..74e2371 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentHost.java
@@ -78,6 +78,46 @@ public interface ServiceComponentHost {
 
   public void setState(State state);
 
+  /**
+   * Gets the current security state for this ServiceComponent
+   * <p/>
+   * The returned SecurityState may be any endpoint or transitional state.
+   *
+   * @return the current SecurityState for this ServiceComponent
+   */
+  public SecurityState getSecurityState();
+
+
+  /**
+   * Sets the current security state for this ServiceComponent
+   * <p/>
+   * The new SecurityState may be any endpoint or transitional state.
+   *
+   * @param state the current SecurityState for this ServiceComponent
+   */
+  public void setSecurityState(SecurityState state);
+
+  /**
+   * Gets the desired security state for this ServiceComponent
+   * <p/>
+   * The returned SecurityState is a valid endpoint state where
+   * SecurityState.isEndpoint() == true.
+   *
+   * @return the desired SecurityState for this ServiceComponent
+   */
+  public SecurityState getDesiredSecurityState();
+
+  /**
+   * Sets the desired security state for this ServiceComponent
+   * <p/>
+   * It is expected that the new SecurityState is a valid endpoint state such that
+   * SecurityState.isEndpoint() == true.
+   *
+   * @param securityState the desired SecurityState for this ServiceComponent
+   * @throws AmbariException if the new state is not an endpoint state
+   */
+  public void setDesiredSecurityState(SecurityState securityState) throws AmbariException;
+
   public void setUpgradeState(UpgradeState upgradeState);
   
   public StackId getStackVersion();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
index 4b4a305..7fa5afe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
@@ -350,6 +350,48 @@ public class ServiceImpl implements Service {
   }
 
   @Override
+  public SecurityState getSecurityState() {
+    clusterGlobalLock.readLock().lock();
+    try {
+      readWriteLock.readLock().lock();
+      try {
+        return serviceDesiredStateEntity.getSecurityState();
+      } finally {
+        readWriteLock.readLock().unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
+  public void setSecurityState(SecurityState securityState) throws AmbariException {
+    if(!securityState.isEndpoint())
+      throw new AmbariException("The security state must be an endpoint state");
+
+    clusterGlobalLock.readLock().lock();
+    try {
+      readWriteLock.writeLock().lock();
+      try {
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Setting DesiredSecurityState of Service"
+              + ", clusterName=" + cluster.getClusterName()
+              + ", clusterId=" + cluster.getClusterId()
+              + ", serviceName=" + getName()
+              + ", oldDesiredSecurityState=" + getSecurityState()
+              + ", newDesiredSecurityState=" + securityState);
+        }
+        serviceDesiredStateEntity.setSecurityState(securityState);
+        saveIfPersisted();
+      } finally {
+        readWriteLock.writeLock().unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
   public StackId getDesiredStackVersion() {
     clusterGlobalLock.readLock().lock();
     try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 606751d..a3fec84 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
@@ -46,6 +46,7 @@ import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntityPK;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostComponentAdminState;
@@ -770,6 +771,71 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     }
   }
 
+  @Override
+  public SecurityState getSecurityState() {
+    clusterGlobalLock.readLock().lock();
+    try {
+      readLock.lock();
+      try {
+        return stateEntity.getSecurityState();
+      } finally {
+        readLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
+  public void setSecurityState(SecurityState securityState) {
+    clusterGlobalLock.readLock().lock();
+    try {
+      writeLock.lock();
+      try {
+        stateEntity.setSecurityState(securityState);
+        saveIfPersisted();
+      } finally {
+        writeLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
+  public SecurityState getDesiredSecurityState() {
+    clusterGlobalLock.readLock().lock();
+    try {
+      readLock.lock();
+      try {
+        return desiredStateEntity.getSecurityState();
+      } finally {
+        readLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
+  @Override
+  public void setDesiredSecurityState(SecurityState securityState) throws AmbariException {
+    if(!securityState.isEndpoint())
+      throw new AmbariException("The security state must be an endpoint state");
+
+    clusterGlobalLock.readLock().lock();
+    try {
+      writeLock.lock();
+      try {
+        desiredStateEntity.setSecurityState(securityState);
+        saveIfPersisted();
+      } finally {
+        writeLock.unlock();
+      }
+    } finally {
+      clusterGlobalLock.readLock().unlock();
+    }
+  }
+
   /***
    * To be called during the upgrade of a specific Component in a host.
    * The potential upgrade states are NONE (default), PENDING, IN_PROGRESS, FAILED.
@@ -1198,6 +1264,8 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
           .append(", desiredState=").append(getDesiredState())
           .append(", stackVersion=").append(getStackVersion())
           .append(", state=").append(getState())
+          .append(", securityState=").append(getSecurityState())
+          .append(", desiredSecurityState=").append(getDesiredSecurityState())
           .append(" }");
       } finally {
         readLock.unlock();

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
index b5556ed..4735980 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog200.java
@@ -25,6 +25,7 @@ import java.util.List;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.UpgradeState;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -89,6 +90,14 @@ public class UpgradeCatalog200 extends AbstractUpgradeCatalog {
     dbAccessor.addColumn(ALERT_DEFINITION_TABLE, new DBColumnInfo(
         "ignore_host", Short.class, 1, 0, false));
 
+    // add security_state to various tables
+    dbAccessor.addColumn("hostcomponentdesiredstate", new DBColumnInfo(
+        "security_state", String.class, 32, SecurityState.UNSECURED.toString(), false));
+    dbAccessor.addColumn("hostcomponentstate", new DBColumnInfo(
+        "security_state", String.class, 32, SecurityState.UNSECURED.toString(), false));
+    dbAccessor.addColumn("servicedesiredstate", new DBColumnInfo(
+        "security_state", String.class, 32, SecurityState.UNSECURED.toString(), false));
+
     dbAccessor.addColumn(ALERT_DEFINITION_TABLE, new DBColumnInfo(
         "description", char[].class, 32672, null, true));
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index edcaa50..f0623f8 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -100,6 +100,7 @@ CREATE TABLE hostcomponentdesiredstate (
   service_name VARCHAR(255) NOT NULL,
   admin_state VARCHAR(32),
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required TINYINT(1) NOT NULL DEFAULT 0,
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
@@ -111,6 +112,7 @@ CREATE TABLE hostcomponentstate (
   host_name VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
 CREATE TABLE hosts (
@@ -164,6 +166,7 @@ CREATE TABLE servicedesiredstate (
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, service_name));
 
 CREATE TABLE users (

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index 8ab0619..fd7343b 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -91,6 +91,7 @@ CREATE TABLE hostcomponentdesiredstate (
   service_name VARCHAR2(255) NOT NULL,
   admin_state VARCHAR2(32) NULL,
   maintenance_state VARCHAR2(32) NOT NULL,
+  security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
   restart_required NUMBER(1) DEFAULT 0 NOT NULL,
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
@@ -101,7 +102,8 @@ CREATE TABLE hostcomponentstate (
   current_state VARCHAR2(255) NOT NULL,
   host_name VARCHAR2(255) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
-  upgrade_state VARCHAR2(255) NOT NULL DEFAULT 'NONE',
+  upgrade_state VARCHAR2(255) DEFAULT 'NONE' NOT NULL,
+  security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
 CREATE TABLE hosts (
@@ -155,6 +157,7 @@ CREATE TABLE servicedesiredstate (
   desired_state VARCHAR2(255) NOT NULL,
   service_name VARCHAR2(255) NOT NULL,
   maintenance_state VARCHAR2(32) NOT NULL,
+  security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
   PRIMARY KEY (cluster_id, service_name));
 
 CREATE TABLE users (

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index a918f22..f4d9c86 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -99,6 +99,7 @@ CREATE TABLE hostcomponentdesiredstate (
   service_name VARCHAR(255) NOT NULL,
   admin_state VARCHAR(32),
   maintenance_state VARCHAR(32) NOT NULL,
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
@@ -110,6 +111,7 @@ CREATE TABLE hostcomponentstate (
   host_name VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 
 CREATE TABLE hosts (
@@ -162,6 +164,7 @@ CREATE TABLE servicedesiredstate (
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL,
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, service_name));
 
 CREATE TABLE users (

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
index 2e7aa07..f80bb32 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
@@ -120,6 +120,7 @@ CREATE TABLE ambari.hostcomponentdesiredstate (
   service_name VARCHAR(255) NOT NULL,
   admin_state VARCHAR(32),
   maintenance_state VARCHAR(32) NOT NULL,
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 GRANT ALL PRIVILEGES ON TABLE ambari.hostcomponentdesiredstate TO :username;
@@ -132,6 +133,7 @@ CREATE TABLE ambari.hostcomponentstate (
   host_name VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   upgrade_state VARCHAR(32) NOT NULL DEFAULT 'NONE',
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, component_name, host_name, service_name));
 GRANT ALL PRIVILEGES ON TABLE ambari.hostcomponentstate TO :username;
 
@@ -190,6 +192,7 @@ CREATE TABLE ambari.servicedesiredstate (
   desired_state VARCHAR(255) NOT NULL,
   service_name VARCHAR(255) NOT NULL,
   maintenance_state VARCHAR(32) NOT NULL,
+  security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   PRIMARY KEY (cluster_id, service_name));
 GRANT ALL PRIVILEGES ON TABLE ambari.servicedesiredstate TO :username;
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index e3e3414..ca4738c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -39,12 +39,12 @@ CREATE TABLE serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id
 CREATE TABLE clusterconfigmapping (cluster_id BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, version_tag VARCHAR(255) NOT NULL, create_timestamp BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY CLUSTERED (cluster_id, type_name, create_timestamp));
 CREATE TABLE clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY CLUSTERED (service_name, cluster_id));
 CREATE TABLE clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY CLUSTERED (cluster_id));
-CREATE TABLE hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL, restart_required BIT NOT NULL DEFAULT 0, PRIMARY KEY CLUSTERED (cluster_id, component_name, host_name, service_name));
-CREATE TABLE hostcomponentstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, current_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY CLUSTERED (cluster_id, component_name, host_name, service_name));
+CREATE TABLE hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL, security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED', restart_required BIT NOT NULL DEFAULT 0, PRIMARY KEY CLUSTERED (cluster_id, component_name, host_name, service_name));
+CREATE TABLE hostcomponentstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, current_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255), security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED' NOT NULL, PRIMARY KEY CLUSTERED (cluster_id, component_name, host_name, service_name));
 CREATE TABLE hosts (host_name VARCHAR(255) NOT NULL, cpu_count INTEGER NOT NULL, ph_cpu_count INTEGER, cpu_info VARCHAR(255) NOT NULL, discovery_status VARCHAR(2000) NOT NULL, host_attributes VARCHAR(MAX) NOT NULL, ipv4 VARCHAR(255), ipv6 VARCHAR(255), public_host_name VARCHAR(255), last_registration_time BIGINT NOT NULL, os_arch VARCHAR(255) NOT NULL, os_info VARCHAR(1000) NOT NULL, os_type VARCHAR(255) NOT NULL, rack_info VARCHAR(255) NOT NULL, total_mem BIGINT NOT NULL, PRIMARY KEY CLUSTERED (host_name));
 CREATE TABLE hoststate (agent_version VARCHAR(255) NOT NULL, available_mem BIGINT NOT NULL, current_state VARCHAR(255) NOT NULL, health_status VARCHAR(255), host_name VARCHAR(255) NOT NULL, time_in_state BIGINT NOT NULL, maintenance_state VARCHAR(512), PRIMARY KEY CLUSTERED (host_name));
 CREATE TABLE servicecomponentdesiredstate (component_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY CLUSTERED (component_name, cluster_id, service_name));
-CREATE TABLE servicedesiredstate (cluster_id BIGINT NOT NULL, desired_host_role_mapping INTEGER NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, maintenance_state VARCHAR(32) NOT NULL, PRIMARY KEY CLUSTERED (cluster_id, service_name));
+CREATE TABLE servicedesiredstate (cluster_id BIGINT NOT NULL, desired_host_role_mapping INTEGER NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, maintenance_state VARCHAR(32) NOT NULL, security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED', PRIMARY KEY CLUSTERED (cluster_id, service_name));
 CREATE TABLE users (user_id INTEGER, principal_id BIGINT NOT NULL, ldap_user INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL, create_time DATETIME DEFAULT GETDATE(), user_password VARCHAR(255), active INTEGER NOT NULL DEFAULT 1, PRIMARY KEY CLUSTERED (user_id), UNIQUE (ldap_user, user_name));
 CREATE TABLE groups (group_id INTEGER, principal_id BIGINT NOT NULL, group_name VARCHAR(255) NOT NULL, ldap_group INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (group_id));
 CREATE TABLE members (member_id INTEGER, group_id INTEGER NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (member_id));

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
index 493291d..ecfe403 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceTest.java
@@ -90,6 +90,7 @@ public class ServiceTest {
     Assert.assertEquals(cluster.getClusterName(),
         service.getCluster().getClusterName());
     Assert.assertEquals(State.INIT, service.getDesiredState());
+    Assert.assertEquals(SecurityState.UNSECURED, service.getSecurityState());
     Assert.assertFalse(
         service.getDesiredStackVersion().getStackId().isEmpty());
   }
@@ -299,16 +300,53 @@ public class ServiceTest {
     Assert.assertNotNull(entity);
     Assert.assertEquals(MaintenanceState.OFF, entity.getServiceDesiredStateEntity().getMaintenanceState());
     Assert.assertEquals(MaintenanceState.OFF, service.getMaintenanceState());
-    
+
     service.setMaintenanceState(MaintenanceState.ON);
     Assert.assertEquals(MaintenanceState.ON, service.getMaintenanceState());
 
     entity = dao.findByClusterAndServiceNames(clusterName, serviceName);
     Assert.assertNotNull(entity);
     Assert.assertEquals(MaintenanceState.ON, entity.getServiceDesiredStateEntity().getMaintenanceState());
-    
-    
   }
-  
-  
+
+  @Test
+  public void testSecurityState() throws Exception {
+    String serviceName = "HDFS";
+    Service s = serviceFactory.createNew(cluster, serviceName);
+    cluster.addService(s);
+    s.persist();
+
+    Service service = cluster.getService(serviceName);
+    Assert.assertNotNull(service);
+
+    ClusterServiceDAO dao = injector.getInstance(ClusterServiceDAO.class);
+    ClusterServiceEntity entity = dao.findByClusterAndServiceNames(clusterName, serviceName);
+    Assert.assertNotNull(entity);
+    Assert.assertEquals(SecurityState.UNSECURED, entity.getServiceDesiredStateEntity().getSecurityState());
+    Assert.assertEquals(SecurityState.UNSECURED, service.getSecurityState());
+
+    service.setSecurityState(SecurityState.SECURED_KERBEROS);
+    Assert.assertEquals(SecurityState.SECURED_KERBEROS, service.getSecurityState());
+
+    entity = dao.findByClusterAndServiceNames(clusterName, serviceName);
+    Assert.assertNotNull(entity);
+    Assert.assertEquals(SecurityState.SECURED_KERBEROS, entity.getServiceDesiredStateEntity().getSecurityState());
+
+    // Make sure there are no issues setting all endpoint values...
+    for(SecurityState state: SecurityState.ENDPOINT_STATES) {
+      service.setSecurityState(state);
+      Assert.assertEquals(state, service.getSecurityState());
+    }
+
+    // Make sure there transitional states are not allowed
+    for(SecurityState state: SecurityState.TRANSITIONAL_STATES) {
+      try {
+        service.setSecurityState(state);
+        Assert.fail(String.format("SecurityState %s is not a valid desired service state", state.toString()));
+      }
+      catch (AmbariException e) {
+        // this is acceptable
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
index aa7aab5..2a04c71 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
@@ -33,8 +33,11 @@ import org.apache.ambari.server.controller.ServiceComponentHostResponse;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
+import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
+import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
+import org.apache.ambari.server.orm.entities.HostComponentStateEntityPK;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.Clusters;
@@ -44,6 +47,7 @@ import org.apache.ambari.server.state.ConfigHelper;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.HostConfig;
 import org.apache.ambari.server.state.MaintenanceState;
+import org.apache.ambari.server.state.SecurityState;
 import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.ServiceComponent;
 import org.apache.ambari.server.state.ServiceComponentFactory;
@@ -166,6 +170,8 @@ public class ServiceComponentHostTest {
 
     Assert.assertEquals(State.INIT, impl.getState());
     Assert.assertEquals(State.INIT, impl.getDesiredState());
+    Assert.assertEquals(SecurityState.UNSECURED, impl.getSecurityState());
+    Assert.assertEquals(SecurityState.UNSECURED, impl.getDesiredSecurityState());
     Assert.assertEquals(c.getClusterName(), impl.getClusterName());
     Assert.assertEquals(c.getClusterId(), impl.getClusterId());
     Assert.assertEquals(s.getName(), impl.getServiceName());
@@ -1100,5 +1106,58 @@ public class ServiceComponentHostTest {
   }
 
 
+  @Test
+  public void testSecurityState() throws Exception {
+    String stackVersion="HDP-2.0.6";
+    String clusterName = "c2";
+    String hostName = "h3";
+
+    clusters.addCluster(clusterName);
+    clusters.addHost(hostName);
+    setOsFamily(clusters.getHost(hostName), "redhat", "5.9");
+    clusters.getHost(hostName).persist();
+    Cluster c2 = clusters.getCluster(clusterName);
+    StackId stackId = new StackId(stackVersion);
+    c2.setDesiredStackVersion(stackId);
+    c2.createClusterVersion(stackId.getStackName(), stackId.getStackVersion(), "admin", RepositoryVersionState.CURRENT);
+    metaInfo.init();
+    clusters.mapHostToCluster(hostName, clusterName);
+
+    Cluster cluster = clusters.getCluster(clusterName);
+
+    ServiceComponentHost sch1 = createNewServiceComponentHost(cluster, "HDFS", "NAMENODE", hostName);
+
+    HostComponentDesiredStateDAO daoHostComponentDesiredState = injector.getInstance(HostComponentDesiredStateDAO.class);
+    HostComponentDesiredStateEntity entityHostComponentDesiredState;
+    HostComponentDesiredStateEntityPK pkHostComponentDesiredState = new HostComponentDesiredStateEntityPK();
+    pkHostComponentDesiredState.setClusterId(cluster.getClusterId());
+    pkHostComponentDesiredState.setComponentName(sch1.getServiceComponentName());
+    pkHostComponentDesiredState.setServiceName(sch1.getServiceName());
+    pkHostComponentDesiredState.setHostName(hostName);
+
+    HostComponentStateDAO daoHostComponentState = injector.getInstance(HostComponentStateDAO.class);
+    HostComponentStateEntity entityHostComponentState;
+    HostComponentStateEntityPK pkHostComponentState = new HostComponentStateEntityPK();
+    pkHostComponentState.setClusterId(cluster.getClusterId());
+    pkHostComponentState.setComponentName(sch1.getServiceComponentName());
+    pkHostComponentState.setServiceName(sch1.getServiceName());
+    pkHostComponentState.setHostName(hostName);
+
+    for(SecurityState state: SecurityState.values()) {
+      sch1.setSecurityState(state);
+      entityHostComponentState = daoHostComponentState.findByPK(pkHostComponentState);
+      Assert.assertNotNull(entityHostComponentState);
+      Assert.assertEquals(state, entityHostComponentState.getSecurityState());
 
+      try {
+        sch1.setDesiredSecurityState(state);
+        Assert.assertTrue(state.isEndpoint());
+        entityHostComponentDesiredState = daoHostComponentDesiredState.findByPK(pkHostComponentDesiredState);
+        Assert.assertNotNull(entityHostComponentDesiredState);
+        Assert.assertEquals(state, entityHostComponentDesiredState.getSecurityState());
+      } catch (AmbariException e) {
+        Assert.assertFalse(state.isEndpoint());
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6b93fb54/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
index be9c9bf..6ff92c3 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
@@ -43,6 +43,7 @@ import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.state.SecurityState;
 import org.easymock.Capture;
 import org.junit.After;
 import org.junit.Assert;
@@ -90,6 +91,9 @@ public class UpgradeCatalog200Test {
     Capture<DBAccessor.DBColumnInfo> alertDefinitionIgnoreColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> alertDefinitionDescriptionColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<DBAccessor.DBColumnInfo> hostComponentStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> hostComponentStateSecurityStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> hostComponentDesiredStateSecurityStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
+    Capture<DBAccessor.DBColumnInfo> serviceDesiredStateSecurityStateColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
     Capture<List<DBAccessor.DBColumnInfo>> clusterVersionCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
     Capture<List<DBAccessor.DBColumnInfo>> hostVersionCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
     Capture<DBAccessor.DBColumnInfo> valueColumnCapture = new Capture<DBAccessor.DBColumnInfo>();
@@ -113,6 +117,18 @@ public class UpgradeCatalog200Test {
     dbAccessor.addColumn(eq("hostcomponentstate"),
         capture(hostComponentStateColumnCapture));
 
+    // Host Component State: security State
+    dbAccessor.addColumn(eq("hostcomponentstate"),
+        capture(hostComponentStateSecurityStateColumnCapture));
+
+    // Host Component Desired State: security State
+    dbAccessor.addColumn(eq("hostcomponentdesiredstate"),
+        capture(hostComponentDesiredStateSecurityStateColumnCapture));
+
+    // Service Desired State: security State
+    dbAccessor.addColumn(eq("servicedesiredstate"),
+        capture(serviceDesiredStateSecurityStateColumnCapture));
+
     // Cluster Version
     dbAccessor.createTable(eq("cluster_version"),
         capture(clusterVersionCapture), eq("id"));
@@ -156,6 +172,11 @@ public class UpgradeCatalog200Test {
     assertEquals("NONE", upgradeStateColumn.getDefaultValue());
     assertFalse(upgradeStateColumn.isNullable());
 
+    // verify security_state columns
+    verifyComponentSecurityStateColumn(hostComponentStateSecurityStateColumnCapture);
+    verifyComponentSecurityStateColumn(hostComponentDesiredStateSecurityStateColumnCapture);
+    verifyServiceSecurityStateColumn(serviceDesiredStateSecurityStateColumnCapture);
+
     // Verify capture group sizes
     assertEquals(8, clusterVersionCapture.getValue().size());
     assertEquals(5, hostVersionCapture.getValue().size());
@@ -224,6 +245,34 @@ public class UpgradeCatalog200Test {
     Assert.assertEquals(2, alertTargetStatesCapture.getValue().size());
   }
 
+  /**
+   * Verifies new security_state column in servicedesiredsstate table.
+   *
+   * @param securityStateColumnCapture
+   */
+  private void verifyServiceSecurityStateColumn(
+      Capture<DBAccessor.DBColumnInfo> securityStateColumnCapture) {
+    DBColumnInfo column = securityStateColumnCapture.getValue();
+    Assert.assertEquals(SecurityState.UNSECURED.toString(), column.getDefaultValue());
+    Assert.assertEquals(Integer.valueOf(32), column.getLength());
+    Assert.assertEquals(String.class, column.getType());
+    Assert.assertEquals("security_state", column.getName());
+  }
+
+  /**
+   * Verifies new security_state column in hostcomponentdesiredstate and hostcomponentstate tables
+   *
+   * @param securityStateColumnCapture
+   */
+  private void verifyComponentSecurityStateColumn(
+      Capture<DBAccessor.DBColumnInfo> securityStateColumnCapture) {
+    DBColumnInfo column = securityStateColumnCapture.getValue();
+    Assert.assertEquals(SecurityState.UNSECURED.toString(), column.getDefaultValue());
+    Assert.assertEquals(Integer.valueOf(32), column.getLength());
+    Assert.assertEquals(String.class, column.getType());
+    Assert.assertEquals("security_state", column.getName());
+  }
+
   @Test
   public void testGetSourceVersion() {
     final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);