/** * 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.orm.entities; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.OneToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import javax.persistence.TableGenerator; import org.apache.ambari.server.actionmanager.HostRoleStatus; import org.apache.ambari.server.state.stack.upgrade.Direction; import org.apache.ambari.server.state.stack.upgrade.UpgradeType; /** * Models the data representation of an upgrade */ @Entity @Table(name = "upgrade") @TableGenerator( name = "upgrade_id_generator", table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value", pkColumnValue = "upgrade_id_seq", initialValue = 0) @NamedQueries({ @NamedQuery(name = "UpgradeEntity.findAll", query = "SELECT u FROM UpgradeEntity u"), @NamedQuery(name = "UpgradeEntity.findAllForCluster", query = "SELECT u FROM UpgradeEntity u WHERE u.clusterId = :clusterId"), @NamedQuery(name = "UpgradeEntity.findUpgrade", query = "SELECT u FROM UpgradeEntity u WHERE u.upgradeId = :upgradeId"), @NamedQuery(name = "UpgradeEntity.findUpgradeByRequestId", query = "SELECT u FROM UpgradeEntity u WHERE u.requestId = :requestId"), @NamedQuery(name = "UpgradeEntity.findLatestForClusterInDirection", query = "SELECT u FROM UpgradeEntity u JOIN RequestEntity r ON u.requestId = r.requestId WHERE u.clusterId = :clusterId AND u.direction = :direction ORDER BY r.startTime DESC, u.upgradeId DESC"), @NamedQuery(name = "UpgradeEntity.findLatestForCluster", query = "SELECT u FROM UpgradeEntity u JOIN RequestEntity r ON u.requestId = r.requestId WHERE u.clusterId = :clusterId ORDER BY r.startTime DESC"), @NamedQuery(name = "UpgradeEntity.findAllRequestIds", query = "SELECT upgrade.requestId FROM UpgradeEntity upgrade") }) public class UpgradeEntity { @Id @Column(name = "upgrade_id", nullable = false, insertable = true, updatable = false) @GeneratedValue(strategy = GenerationType.TABLE, generator = "upgrade_id_generator") private Long upgradeId; @Column(name = "cluster_id", nullable = false, insertable = true, updatable = false) private Long clusterId; @Column(name = "request_id", nullable = false, insertable = false, updatable = false) private Long requestId; /** * The request entity associated with this upgrade. This relationship allows * JPA to correctly order non-flushed commits during the transaction which * creates the upgrade. Without it, JPA would not know the correct order and * may try to create the upgrade before the request. */ @OneToOne(optional = false, fetch = FetchType.LAZY) @JoinColumn(name = "request_id", nullable = false, insertable = true, updatable = false) private RequestEntity requestEntity = null; @Column(name="from_version", nullable = false) private String fromVersion = null; @Column(name="to_version", nullable = false) private String toVersion = null; @Column(name="direction", nullable = false) @Enumerated(value = EnumType.STRING) private Direction direction = Direction.UPGRADE; @Column(name="upgrade_package", nullable = false) private String upgradePackage; @Column(name="upgrade_type", nullable = false) @Enumerated(value = EnumType.STRING) private UpgradeType upgradeType; @Column(name = "skip_failures", nullable = false) private Integer skipFailures = 0; @Column(name = "skip_sc_failures", nullable = false) private Integer skipServiceCheckFailures = 0; @Column(name="downgrade_allowed", nullable = false) private Short downgrade_allowed = 1; /** * {@code true} if the upgrade has been marked as suspended. */ @Column(name = "suspended", nullable = false, length = 1) private Short suspended = 0; @OneToMany(mappedBy = "upgradeEntity", cascade = { CascadeType.ALL }) private List<UpgradeGroupEntity> upgradeGroupEntities; /** * @return the id */ public Long getId() { return upgradeId; } /** * @param id the id */ public void setId(Long id) { upgradeId = id; } /** * @return the cluster id */ public Long getClusterId() { return clusterId; } /** * @param id the cluster id */ public void setClusterId(Long id) { clusterId = id; } /** * @return the upgrade items */ public List<UpgradeGroupEntity> getUpgradeGroups() { return upgradeGroupEntities; } /** * @param items the upgrade items */ public void setUpgradeGroups(List<UpgradeGroupEntity> items) { for (UpgradeGroupEntity entity : items) { entity.setUpgradeEntity(this); } upgradeGroupEntities = items; } /** * @return the request id */ public Long getRequestId() { return requestId; } public void setRequestEntity(RequestEntity requestEntity) { this.requestEntity = requestEntity; requestId = requestEntity.getRequestId(); } /** * @return the "from" version */ public String getFromVersion() { return fromVersion; } /** * @param version the "from" version */ public void setFromVersion(String version) { fromVersion = version; } /** * @return the "to" version */ public String getToVersion() { return toVersion; } /** * @param version the "to" version */ public void setToVersion(String version) { toVersion = version; } /** * @return the direction of the upgrade */ public Direction getDirection() { return direction; } /** * @param direction the direction of the upgrade */ public void setDirection(Direction direction) { this.direction = direction; } /** * @return the upgrade type, such as rolling oNr non_rolling */ public UpgradeType getUpgradeType() { return upgradeType; } /** * @return possibility to process downgrade */ public Boolean isDowngradeAllowed() { return downgrade_allowed != null ? (downgrade_allowed != 0) : null; } /** * @param canDowngrade {@code true} to allow downgrade, {@code false} to disallow downgrade */ public void setDowngradeAllowed(boolean canDowngrade) { downgrade_allowed = (!canDowngrade ? (short)0 : (short)1); } /** * @param upgradeType the upgrade type to set */ public void setUpgradeType(UpgradeType upgradeType) { this.upgradeType = upgradeType; } /** * @return the upgrade package name, without the extension. */ public String getUpgradePackage() { return upgradePackage; } /** * @param upgradePackage the upgrade pack to set */ public void setUpgradePackage(String upgradePackage) { this.upgradePackage = upgradePackage; } /** * Gets whether skippable components that failed are automatically skipped. * They will be placed into the {@link HostRoleStatus#SKIPPED_FAILED} state. * * @return {@code true} if skippable failed components are automatically * skipped when they fail. */ public boolean isComponentFailureAutoSkipped() { return skipFailures != 0; } /** * Sets whether skippable components that failed are automatically skipped. * * @param autoSkipComponentFailures * {@code true} to automatically skip component failures which are * marked as skippable. */ public void setAutoSkipComponentFailures(boolean autoSkipComponentFailures) { skipFailures = autoSkipComponentFailures ? 1 : 0; } /** * Gets whether skippable service checks that failed are automatically * skipped. They will be placed into the {@link HostRoleStatus#SKIPPED_FAILED} * state. * * @return {@code true} if service checks are automatically skipped when they * fail. */ public boolean isServiceCheckFailureAutoSkipped() { return skipServiceCheckFailures != 0; } /** * Sets whether skippable service checks that failed are automatically * skipped. * * @param autoSkipServiceCheckFailures * {@code true} to automatically skip service check failures which * are marked as being skippable. */ public void setAutoSkipServiceCheckFailures(boolean autoSkipServiceCheckFailures) { skipServiceCheckFailures = autoSkipServiceCheckFailures ? 1 : 0; } /** * Gets whether the upgrade is suspended. A suspended upgrade will appear to * have its request aborted, but the intent is to resume it at a later point. * * @return {@code true} if the upgrade is suspended. */ public boolean isSuspended() { return suspended != 0; } /** * Sets whether the upgrade is suspended. * * @param suspended * {@code true} to mark the upgrade as suspended. */ public void setSuspended(boolean suspended) { this.suspended = suspended ? (short) 1 : (short) 0; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } UpgradeEntity that = (UpgradeEntity) o; if (upgradeId != null ? !upgradeId.equals(that.upgradeId) : that.upgradeId != null) { return false; } if (clusterId != null ? !clusterId.equals(that.clusterId) : that.clusterId != null) { return false; } if (requestId != null ? !requestId.equals(that.requestId) : that.requestId != null) { return false; } if (fromVersion != null ? !fromVersion.equals(that.fromVersion) : that.fromVersion != null) { return false; } if (toVersion != null ? !toVersion.equals(that.toVersion) : that.toVersion != null) { return false; } if (direction != null ? !direction.equals(that.direction) : that.direction != null) { return false; } if (suspended != null ? !suspended.equals(that.suspended) : that.suspended != null) { return false; } if (upgradeType != null ? !upgradeType.equals(that.upgradeType) : that.upgradeType != null) { return false; } if (upgradePackage != null ? !upgradePackage.equals(that.upgradePackage) : that.upgradePackage != null) { return false; } return true; } @Override public int hashCode() { int result = upgradeId != null ? upgradeId.hashCode() : 0; result = 31 * result + (clusterId != null ? clusterId.hashCode() : 0); result = 31 * result + (requestId != null ? requestId.hashCode() : 0); result = 31 * result + (fromVersion != null ? fromVersion.hashCode() : 0); result = 31 * result + (toVersion != null ? toVersion.hashCode() : 0); result = 31 * result + (direction != null ? direction.hashCode() : 0); result = 31 * result + (suspended != null ? suspended.hashCode() : 0); result = 31 * result + (upgradeType != null ? upgradeType.hashCode() : 0); result = 31 * result + (upgradePackage != null ? upgradePackage.hashCode() : 0); return result; } }