/*************************************************************************
* Copyright 2009-2013 Eucalyptus Systems, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*
* Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta
* CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need
* additional information or have any questions.
************************************************************************/
package com.eucalyptus.loadbalancing;
import java.util.Collection;
import javax.annotation.Nonnull;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.PersistenceContext;
import javax.persistence.PostLoad;
import javax.persistence.PrePersist;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.eucalyptus.entities.AbstractPersistent;
import com.eucalyptus.entities.Entities;
import com.eucalyptus.entities.TransactionResource;
import com.eucalyptus.loadbalancing.LoadBalancer.LoadBalancerCoreView;
import com.eucalyptus.loadbalancing.activities.LoadBalancerServoInstance;
import com.eucalyptus.loadbalancing.activities.LoadBalancerServoInstance.LoadBalancerServoInstanceCoreView;
import com.eucalyptus.loadbalancing.activities.LoadBalancerServoInstance.LoadBalancerServoInstanceCoreViewTransform;
import com.eucalyptus.util.Exceptions;
import com.eucalyptus.util.NonNullFunction;
import com.eucalyptus.util.TypeMapper;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
/**
* @author Sang-Min Park (spark@eucalyptus.com)
*
*/
@Entity
@PersistenceContext( name = "eucalyptus_loadbalancing" )
@Table( name = "metadata_group" )
public class LoadBalancerSecurityGroup extends AbstractPersistent {
public enum STATE { InService, OutOfService }
@Transient
private static final long serialVersionUID = 1L;
private LoadBalancerSecurityGroup(){}
@Transient
private LoadBalancerSecurityGroupRelationView view = null;
@PostLoad
private void onLoad(){
if(this.view==null)
this.view = new LoadBalancerSecurityGroupRelationView(this);
}
private LoadBalancerSecurityGroup(LoadBalancer lb, String ownerAccountId, String groupName){
this.loadbalancer = lb;
this.groupName = groupName;
this.ownerAccountId = ownerAccountId;
this.state= STATE.InService.name();
}
public static LoadBalancerSecurityGroup create(LoadBalancer lb, String ownerAccountId, String groupName){
final LoadBalancerSecurityGroup instance = new LoadBalancerSecurityGroup(lb, ownerAccountId, groupName);
instance.uniqueName = instance.createUniqueName();
return instance;
}
public static LoadBalancerSecurityGroup named(LoadBalancer lb, String ownerAccountId, String groupName){
final LoadBalancerSecurityGroup instance = new LoadBalancerSecurityGroup(lb, ownerAccountId, groupName);
instance.uniqueName = instance.createUniqueName();
return instance;
}
public static LoadBalancerSecurityGroup named(LoadBalancer lb, String ownerAccountId, String groupName, STATE state){
final LoadBalancerSecurityGroup instance = new LoadBalancerSecurityGroup(lb, ownerAccountId, groupName);
instance.state = state.name();
instance.uniqueName = instance.createUniqueName();
return instance;
}
public static LoadBalancerSecurityGroup withState(STATE state){
final LoadBalancerSecurityGroup instance = new LoadBalancerSecurityGroup();
instance.state = state.name();
return instance;
}
@OneToOne
@JoinColumn( name = "metadata_loadbalancer_fk", nullable=true)
private LoadBalancer loadbalancer = null;
@Column(name="group_name", nullable=false)
private String groupName = null;
@Column(name="group_owner_account_id", nullable=false)
private String ownerAccountId = null;
@Column(name="metadata_state", nullable=false)
private String state = null;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "security_group")
private Collection<LoadBalancerServoInstance> servoInstances = null;
@Column(name="metadata_unique_name", nullable=false, unique=true)
private String uniqueName = null;
public String getName(){
return this.groupName;
}
public String getGroupOwnerAccountId(){
return this.ownerAccountId;
}
public Collection<LoadBalancerServoInstanceCoreView> getServoInstances(){
return this.view.getServoInstances();
}
public LoadBalancerCoreView getLoadBalancer(){
return this.view.getLoadBalancer();
}
public void setLoadBalancer(final LoadBalancer lb){
this.loadbalancer = lb;
}
public void setState(STATE state){
this.state = state.name();
}
public STATE getState(){
return Enum.valueOf(STATE.class, this.state);
}
@PrePersist
private void generateOnCommit( ) {
if(this.uniqueName==null)
this.uniqueName = createUniqueName( );
}
private String createUniqueName(){
return String.format("loadbalancer-sgroup-%s-%s-%s-%s", this.loadbalancer.getOwnerAccountNumber(), this.loadbalancer.getDisplayName(), this.ownerAccountId, this.groupName);
}
@Override
public String toString(){
return this.uniqueName;
}
public static class LoadBalancerSecurityGroupCoreView {
private LoadBalancerSecurityGroup group = null;
LoadBalancerSecurityGroupCoreView(final LoadBalancerSecurityGroup group){
this.group = group;
}
public String getName(){
return this.group.getName();
}
public String getGroupOwnerAccountId(){
return this.group.getGroupOwnerAccountId();
}
public STATE getState(){
return this.group.getState();
}
}
@TypeMapper
public enum LoadBalancerSecurityGroupCoreViewTransform implements Function<LoadBalancerSecurityGroup, LoadBalancerSecurityGroupCoreView> {
INSTANCE;
@Override
public LoadBalancerSecurityGroupCoreView apply( final LoadBalancerSecurityGroup group ) {
return new LoadBalancerSecurityGroupCoreView( group );
}
}
public enum LoadBalancerSecurityGroupEntityTransform implements NonNullFunction<LoadBalancerSecurityGroupCoreView, LoadBalancerSecurityGroup> {
INSTANCE;
@Nonnull
@Override
public LoadBalancerSecurityGroup apply( LoadBalancerSecurityGroupCoreView arg0 ) {
try ( final TransactionResource db = Entities.transactionFor( LoadBalancerSecurityGroup.class ) ) {
return Entities.uniqueResult(arg0.group);
}catch(final Exception ex){
throw Exceptions.toUndeclared(ex);
}
}
}
public static class LoadBalancerSecurityGroupRelationView {
private LoadBalancer loadBalancer = null;
private ImmutableList<LoadBalancerServoInstanceCoreView> servoViews = null;
LoadBalancerSecurityGroupRelationView(LoadBalancerSecurityGroup group) {
if(group.loadbalancer!=null) {
Entities.initialize( group.loadbalancer );
this.loadBalancer = group.loadbalancer;
}
if(group.servoInstances!=null)
servoViews = ImmutableList.copyOf( Collections2.transform(group.servoInstances,
LoadBalancerServoInstanceCoreViewTransform.INSTANCE));
}
LoadBalancerCoreView getLoadBalancer(){
return this.loadBalancer.getCoreView();
}
public ImmutableList<LoadBalancerServoInstanceCoreView> getServoInstances(){
return this.servoViews;
}
}
}