Merge branch 'master' of ssh://git.cloud.com/var/lib/git/cloudstack-oss

This commit is contained in:
alena 2010-09-15 14:29:10 -07:00
commit 7d2a927973
54 changed files with 2160 additions and 1145 deletions

View File

@ -73,6 +73,7 @@ deleteIso=com.cloud.api.commands.DeleteIsoCmd;15
copyIso=com.cloud.api.commands.CopyIsoCmd;15
updateIsoPermissions=com.cloud.api.commands.UpdateIsoPermissionsCmd;15
listIsoPermissions=com.cloud.api.commands.ListIsoPermissionsCmd;15
extractIso=com.cloud.api.commands.ExtractIsoCmd;15
#### guest OS commands
listOsTypes=com.cloud.api.commands.ListGuestOsCmd;15
@ -179,6 +180,7 @@ detachVolume=com.cloud.api.commands.DetachVolumeCmd;15
createVolume=com.cloud.api.commands.CreateVolumeCmd;15
deleteVolume=com.cloud.api.commands.DeleteVolumeCmd;15
listVolumes=com.cloud.api.commands.ListVolumesCmd;15
extractVolume=com.cloud.api.commands.ExtractVolumeCmd;15
#### registration command: FIXME -- this really should be something in management server that
#### generates a new key for the user and they just have to

View File

@ -88,6 +88,7 @@
<dao name="ResourceCount" class="com.cloud.configuration.dao.ResourceCountDaoImpl"/>
<dao name="UserAccount" class="com.cloud.user.dao.UserAccountDaoImpl"/>
<dao name="VM Template Host" class="com.cloud.storage.dao.VMTemplateHostDaoImpl"/>
<dao name="Upload" class="com.cloud.storage.dao.UploadDaoImpl"/>
<dao name="VM Template Pool" class="com.cloud.storage.dao.VMTemplatePoolDaoImpl"/>
<dao name="VM Template Zone" class="com.cloud.storage.dao.VMTemplateZoneDaoImpl"/>
<dao name="Launch Permission" class="com.cloud.storage.dao.LaunchPermissionDaoImpl"/>

View File

@ -29,6 +29,7 @@ public class IPAssocCommand extends RoutingCommand {
private String publicIp;
private boolean sourceNat;
private boolean add;
private boolean oneToOneNat;
private boolean firstIP;
private String vlanId;
private String vlanGateway;
@ -63,6 +64,10 @@ public class IPAssocCommand extends RoutingCommand {
return add;
}
public boolean isOneToOneNat(){
return this.oneToOneNat;
}
public boolean isFirstIP() {
return firstIP;
}

View File

@ -4,8 +4,7 @@ import java.io.File;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.Command;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.UploadVO;
public class UploadAnswer extends Answer {
@ -13,7 +12,7 @@ public class UploadAnswer extends Answer {
private String jobId;
private int uploadPct;
private String errorString;
private VMTemplateHostVO.Status uploadStatus;
private UploadVO.Status uploadStatus;
private String uploadPath;
private String installPath;
public Long templateSize = 0L;
@ -29,7 +28,7 @@ public class UploadAnswer extends Answer {
return uploadStatus.toString();
}
public VMTemplateHostVO.Status getUploadStatus() {
public UploadVO.Status getUploadStatus() {
return uploadStatus;
}
@ -48,7 +47,7 @@ public class UploadAnswer extends Answer {
}
public UploadAnswer(String jobId, int uploadPct, String errorString,
Status uploadStatus, String fileSystemPath, String installPath, long templateSize) {
UploadVO.Status uploadStatus, String fileSystemPath, String installPath, long templateSize) {
super();
this.jobId = jobId;
this.uploadPct = uploadPct;
@ -60,7 +59,7 @@ public class UploadAnswer extends Answer {
}
public UploadAnswer(String jobId, int uploadPct, Command command,
Status uploadStatus, String fileSystemPath, String installPath) {
UploadVO.Status uploadStatus, String fileSystemPath, String installPath) {
super(command);
this.jobId = jobId;
this.uploadPct = uploadPct;
@ -81,7 +80,7 @@ public class UploadAnswer extends Answer {
return path;
}
public void setUploadStatus(VMTemplateHostVO.Status uploadStatus) {
public void setUploadStatus(UploadVO.Status uploadStatus) {
this.uploadStatus = uploadStatus;
}

View File

@ -1,6 +1,7 @@
package com.cloud.agent.api.storage;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.Upload.Type;
import com.cloud.storage.VMTemplateVO;
import com.cloud.agent.api.storage.AbstractUploadCommand;
import com.cloud.agent.api.storage.DownloadCommand.PasswordAuth;
@ -17,6 +18,7 @@ public class UploadCommand extends AbstractUploadCommand {
private PasswordAuth auth;
private long templateSizeInBytes;
private long id;
private Type type;
public UploadCommand(VMTemplateVO template, String url, VMTemplateHostVO vmTemplateHost) {
@ -29,6 +31,15 @@ public class UploadCommand extends AbstractUploadCommand {
}
public UploadCommand(String url, long id, long sizeInBytes, String installPath, Type type){
this.template = null;
this.url = url;
this.installPath = installPath;
this.id = id;
this.type = type;
this.templateSizeInBytes = sizeInBytes;
}
protected UploadCommand() {
}

8
core/src/com/cloud/event/EventTypes.java Normal file → Executable file
View File

@ -87,7 +87,10 @@ public class EventTypes {
public static final String EVENT_VOLUME_CREATE = "VOLUME.CREATE";
public static final String EVENT_VOLUME_DELETE = "VOLUME.DELETE";
public static final String EVENT_VOLUME_ATTACH = "VOLUME.ATTACH";
public static final String EVENT_VOLUME_DETACH = "VOLUME.DETACH";
public static final String EVENT_VOLUME_DETACH = "VOLUME.DETACH";
public static final String EVENT_VOLUME_UPLOAD_START = "VOLUME.UPLOAD.START";
public static final String EVENT_VOLUME_UPLOAD_SUCCESS = "VOLUME.UPLOAD.SUCCESS";
public static final String EVENT_VOLUME_UPLOAD_FAILED = "VOLUME.UPLOAD.FAILED";
// Domains
public static final String EVENT_DOMAIN_CREATE = "DOMAIN.CREATE";
@ -107,6 +110,9 @@ public class EventTypes {
public static final String EVENT_ISO_COPY = "ISO.COPY";
public static final String EVENT_ISO_ATTACH = "ISO.ATTACH";
public static final String EVENT_ISO_DETACH = "ISO.DETACH";
public static final String EVENT_ISO_UPLOAD_FAILED = "ISO.UPLOAD.FAILED";
public static final String EVENT_ISO_UPLOAD_START = "ISO.UPLOAD.START";
public static final String EVENT_ISO_UPLOAD_SUCCESS = "ISO.UPLOAD.SUCCESS";
//SSVM
public static final String EVENT_SSVM_CREATE = "SSVM.CREATE";

View File

@ -2236,5 +2236,18 @@ public interface ManagementServer {
InstanceGroupVO getGroupForVm(long vmId);
List<VlanVO> searchForZoneWideVlans(long dcId, String vlanType,String vlanId);
/**
* Extracts the volume to a particular location.
* @param url - the url where the volume needs to be extracted to
* @param zoneId - zone id of the volume
* @param volume id - the id of the volume
* @throws URISyntaxException
* @throws InternalErrorException
*
*/
void extractVolume(String url, Long volumeId, Long zoneId) throws
URISyntaxException, InternalErrorException;
}

1
core/src/com/cloud/storage/StorageManager.java Normal file → Executable file
View File

@ -331,4 +331,5 @@ public interface StorageManager extends Manager {
<T extends VMInstanceVO> VolumeVO allocate(VolumeType type, DiskOfferingVO offering, String name, Long size, VMTemplateVO template, T vm, AccountVO account);
<T extends VMInstanceVO> void create(T vm);
Long findHostIdForStoragePool(StoragePoolVO pool);
}

View File

@ -165,8 +165,7 @@ public abstract class StorageResource extends ServerResourceBase implements Serv
return Answer.createUnsupportedCommandAnswer(cmd);
}
private Answer execute(UploadCommand cmd) {
s_logger.warn(" Nitin got the cmd " +cmd);
private Answer execute(UploadCommand cmd) {
return _uploadManager.handleUploadCommand(cmd);
}

View File

@ -0,0 +1,7 @@
package com.cloud.storage;
public interface Upload {
public static enum Status {UNKNOWN, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS}
public static enum Type {VOLUME, TEMPLATE, ISO}
}

View File

@ -0,0 +1,219 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It 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, either version 3 of the License, or any later version.
* 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/>.
*
*/
package com.cloud.storage;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import com.cloud.utils.db.GenericDaoBase;
/**
* Table for storing all the upload information.
* @author nitin
*
*/
@Entity
@Table(name="upload")
public class UploadVO implements Upload {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
Long id;
@Column(name="host_id")
private long hostId;
@Column(name="type_id")
private long typeId;
@Column(name=GenericDaoBase.CREATED_COLUMN)
private Date created = null;
@Column(name="last_updated")
@Temporal(value=TemporalType.TIMESTAMP)
private Date lastUpdated = null;
@Column (name="upload_pct")
private int uploadPercent;
@Column (name="type")
@Enumerated(EnumType.STRING)
private Type type;
@Column (name="upload_state")
@Enumerated(EnumType.STRING)
private Status uploadState;
@Column (name="error_str")
private String errorString;
@Column (name="job_id")
private String jobId;
@Column (name="url")
private String uploadUrl;
public long getHostId() {
return hostId;
}
public void setHostId(long hostId) {
this.hostId = hostId;
}
public Long getId() {
return id;
}
public Date getCreated() {
return created;
}
public Date getLastUpdated() {
return lastUpdated;
}
public void setLastUpdated(Date date) {
lastUpdated = date;
}
public UploadVO(long hostId, long templateId) {
super();
this.hostId = hostId;
this.typeId = templateId;
}
public UploadVO(long hostId, long typeId, Date lastUpdated,
Status uploadState, int uploadPercent, Type type,
String errorString, String jobId, String uploadUrl) {
super();
this.hostId = hostId;
this.typeId = typeId;
this.lastUpdated = lastUpdated;
this.uploadState = uploadState;
this.uploadPercent = uploadPercent;
this.type = type;
this.errorString = errorString;
this.jobId = jobId;
this.uploadUrl = uploadUrl;
}
protected UploadVO() {
}
public UploadVO(Long uploadId) {
this.id = uploadId;
}
public void setErrorString(String errorString) {
this.errorString = errorString;
}
public String getErrorString() {
return errorString;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getJobId() {
return jobId;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof UploadVO) {
UploadVO other = (UploadVO)obj;
if (id == null && other.getId() == null) {
return (this.typeId==other.getTypeId() && this.hostId==other.getHostId() && this.type == other.getType());
} else if (id == null && other.getId() != null) {
return false;
} else if (id != null && other.getId() == null) {
return false;
} else {
return (this.id.equals(other.getId()));
}
}
return false;
}
@Override
public int hashCode() {
return id.hashCode();
}
public int getUploadPercent() {
return uploadPercent;
}
public void setUploadPercent(int uploadPercent) {
this.uploadPercent = uploadPercent;
}
public Status getUploadState() {
return uploadState;
}
public void setUploadState(Status uploadState) {
this.uploadState = uploadState;
}
public long getTypeId() {
return typeId;
}
public void setTypeId(long typeId) {
this.typeId = typeId;
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public String getUploadUrl() {
return uploadUrl;
}
public void setUploadUrl(String uploadUrl) {
this.uploadUrl = uploadUrl;
}
public void setId(Long id) {
this.id = id;
}
public void setCreated(Date created) {
this.created = created;
}
}

61
core/src/com/cloud/storage/VMTemplateHostVO.java Normal file → Executable file
View File

@ -60,36 +60,23 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
@Column (name="download_pct")
private int downloadPercent;
@Column (name="upload_pct")
private int uploadPercent;
@Column (name="size")
private long size;
@Column (name="download_state")
@Enumerated(EnumType.STRING)
private Status downloadState;
@Column (name="upload_state")
@Enumerated(EnumType.STRING)
private Status uploadState;
private Status downloadState;
@Column (name="local_path")
private String localDownloadPath;
@Column (name="error_str")
private String errorString;
@Column (name="upload_error_str")
private String upload_errorString;
@Column (name="job_id")
private String jobId;
@Column (name="upload_job_id")
private String uploadJobId;
@Column (name="pool_id")
private Long poolId;
@ -99,9 +86,6 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
@Column (name="url")
private String downloadUrl;
@Column (name="upload_url")
private String uploadUrl;
@Column(name="is_copy")
private boolean isCopy = false;
@ -279,44 +263,5 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
public boolean isCopy() {
return isCopy;
}
public int getUploadPercent() {
return uploadPercent;
}
public void setUploadPercent(int uploadPercent) {
this.uploadPercent = uploadPercent;
}
public Status getUploadState() {
return uploadState;
}
public void setUploadState(Status uploadState) {
this.uploadState = uploadState;
}
public String getUpload_errorString() {
return upload_errorString;
}
public void setUpload_errorString(String uploadErrorString) {
upload_errorString = uploadErrorString;
}
public String getUploadUrl() {
return uploadUrl;
}
public void setUploadUrl(String uploadUrl) {
this.uploadUrl = uploadUrl;
}
public String getUploadJobId() {
return uploadJobId;
}
public void setUploadJobId(String uploadJobId) {
this.uploadJobId = uploadJobId;
}
}

View File

@ -0,0 +1,15 @@
package com.cloud.storage.dao;
import java.util.List;
import com.cloud.storage.UploadVO;
import com.cloud.storage.Upload.Status;
import com.cloud.storage.Upload.Type;
import com.cloud.utils.db.GenericDao;
public interface UploadDao extends GenericDao<UploadVO, Long> {
List<UploadVO> listByTypeUploadStatus(long typeId, Type type,
Status uploadState);
}

View File

@ -0,0 +1,74 @@
package com.cloud.storage.dao;
import java.sql.PreparedStatement;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;
import javax.ejb.Local;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import com.cloud.storage.UploadVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
@Local(value={UploadDao.class})
public class UploadDaoImpl extends GenericDaoBase<UploadVO, Long> implements UploadDao {
public static final Logger s_logger = Logger.getLogger(UploadDaoImpl.class.getName());
protected final SearchBuilder<UploadVO> typeUploadStatusSearch;
protected static final String UPDATE_UPLOAD_INFO =
"UPDATE upload SET upload_state = ?, upload_pct= ?, last_updated = ? "
+ ", upload_error_str = ?, upload_job_id = ? "
+ "WHERE host_id = ? and type_id = ? and type = ?";
protected static final String UPLOADS_STATE_DC=
"SELECT * FROM upload t, host h where t.host_id = h.id and h.data_center_id=? "
+ " and t.type_id=? and t.upload_state = ?" ;
public UploadDaoImpl() {
typeUploadStatusSearch = createSearchBuilder();
typeUploadStatusSearch.and("type_id", typeUploadStatusSearch.entity().getTypeId(), SearchCriteria.Op.EQ);
typeUploadStatusSearch.and("upload_state", typeUploadStatusSearch.entity().getUploadState(), SearchCriteria.Op.EQ);
typeUploadStatusSearch.and("type", typeUploadStatusSearch.entity().getType(), SearchCriteria.Op.EQ);
typeUploadStatusSearch.done();
}
@Override
public List<UploadVO> listByTypeUploadStatus(long typeId, UploadVO.Type type, UploadVO.Status uploadState) {
SearchCriteria<UploadVO> sc = typeUploadStatusSearch.create();
sc.setParameters("type_id", typeId);
sc.setParameters("type", type);
sc.setParameters("upload_state", uploadState.toString());
return listBy(sc);
}
/*
public void updateUploadStatus(long hostId, long typeId, int uploadPercent, UploadVO.Status uploadState,
String uploadJobId, String uploadUrl ) {
Transaction txn = Transaction.currentTxn();
PreparedStatement pstmt = null;
try {
Date now = new Date();
String sql = UPDATE_UPLOAD_INFO;
pstmt = txn.prepareAutoCloseStatement(sql);
pstmt.setString(1, uploadState.toString());
pstmt.setInt(2, uploadPercent);
pstmt.setString(3, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now));
pstmt.setString(4, uploadJobId);
pstmt.setLong(5, hostId);
pstmt.setLong(6, typeId);
pstmt.setString(7, uploadUrl);
pstmt.executeUpdate();
} catch (Exception e) {
s_logger.warn("Exception: ", e);
}
}*/
}

View File

@ -42,10 +42,7 @@ public interface VMTemplateHostDao extends GenericDao<VMTemplateHostVO, Long> {
List<VMTemplateHostVO> listByTemplatePool(long templateId, long poolId);
void update(VMTemplateHostVO instance);
void updateUploadStatus(long hostId, long templateId, int uploadPercent, Status uploadState,
String jobId, String uploadUrl );
void update(VMTemplateHostVO instance);
List<VMTemplateHostVO> listByTemplateStatus(long templateId, VMTemplateHostVO.Status downloadState);
@ -58,6 +55,5 @@ public interface VMTemplateHostDao extends GenericDao<VMTemplateHostVO, Long> {
List<VMTemplateHostVO> listDestroyed(long hostId);
boolean templateAvailable(long templateId, long hostId);
List<VMTemplateHostVO> listByTemplateUploadStatus(long templateId,Status UploadState);
}

View File

@ -50,25 +50,16 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
protected final SearchBuilder<VMTemplateHostVO> HostTemplatePoolSearch;
protected final SearchBuilder<VMTemplateHostVO> TemplateStatusSearch;
protected final SearchBuilder<VMTemplateHostVO> TemplateStatesSearch;
protected final SearchBuilder<VMTemplateHostVO> TemplateUploadStatusSearch;
protected static final String UPDATE_TEMPLATE_HOST_REF =
"UPDATE template_host_ref SET download_state = ?, download_pct= ?, last_updated = ? "
+ ", error_str = ?, local_path = ?, job_id = ? "
+ "WHERE host_id = ? and template_id = ?";
protected static final String UPDATE_UPLOAD_INFO =
"UPDATE template_host_ref SET upload_state = ?, upload_pct= ?, last_updated = ? "
+ ", upload_error_str = ?, upload_job_id = ? "
+ "WHERE host_id = ? and template_id = ?";
protected static final String UPDATE_TEMPLATE_HOST_REF =
"UPDATE type_host_ref SET download_state = ?, download_pct= ?, last_updated = ? "
+ ", error_str = ?, local_path = ?, job_id = ? "
+ "WHERE host_id = ? and type_id = ?";
protected static final String DOWNLOADS_STATE_DC=
"SELECT * FROM template_host_ref t, host h where t.host_id = h.id and h.data_center_id=? "
+ " and t.template_id=? and t.download_state = ?" ;
protected static final String UPLOADS_STATE_DC=
"SELECT * FROM template_host_ref t, host h where t.host_id = h.id and h.data_center_id=? "
+ " and t.template_id=? and t.upload_state = ?" ;
protected static final String DOWNLOADS_STATE_DC_POD=
"SELECT * FROM template_host_ref t, host h where t.host_id = h.id and h.data_center_id=? and h.pod_id=? "
@ -79,9 +70,6 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
+ " where t.template_id=? and t.download_state=?";
protected static final String UPLOADS_STATE=
"SELECT * FROM template_host_ref t "
+ " where t.template_id=? and t.upload_state=?";
public VMTemplateHostDaoImpl () {
HostSearch = createSearchBuilder();
@ -112,12 +100,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
TemplateStatusSearch = createSearchBuilder();
TemplateStatusSearch.and("template_id", TemplateStatusSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
TemplateStatusSearch.and("download_state", TemplateStatusSearch.entity().getDownloadState(), SearchCriteria.Op.EQ);
TemplateStatusSearch.done();
TemplateUploadStatusSearch = createSearchBuilder();
TemplateUploadStatusSearch.and("template_id", TemplateUploadStatusSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
TemplateUploadStatusSearch.and("upload_state", TemplateUploadStatusSearch.entity().getUploadState(), SearchCriteria.Op.EQ);
TemplateUploadStatusSearch.done();
TemplateStatusSearch.done();
TemplateStatesSearch = createSearchBuilder();
TemplateStatesSearch.and("template_id", TemplateStatesSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
@ -149,28 +132,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
} catch (Exception e) {
s_logger.warn("Exception: ", e);
}
}
public void updateUploadStatus(long hostId, long templateId, int uploadPercent, Status uploadState,
String uploadJobId, String uploadUrl ) {
Transaction txn = Transaction.currentTxn();
PreparedStatement pstmt = null;
try {
Date now = new Date();
String sql = UPDATE_UPLOAD_INFO;
pstmt = txn.prepareAutoCloseStatement(sql);
pstmt.setString(1, uploadState.toString());
pstmt.setInt(2, uploadPercent);
pstmt.setString(3, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), now));
pstmt.setString(4, uploadJobId);
pstmt.setLong(5, hostId);
pstmt.setLong(6, templateId);
pstmt.setString(7, uploadUrl);
pstmt.executeUpdate();
} catch (Exception e) {
s_logger.warn("Exception: ", e);
}
}
}
@Override
public List<VMTemplateHostVO> listByHostId(long id) {
@ -202,13 +164,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
return findOneBy(sc);
}
@Override
public List<VMTemplateHostVO> listByTemplateUploadStatus(long templateId, VMTemplateHostVO.Status uploadState) {
SearchCriteria<VMTemplateHostVO> sc = TemplateUploadStatusSearch.create();
sc.setParameters("template_id", templateId);
sc.setParameters("upload_state", uploadState.toString());
return listBy(sc);
}
@Override
public List<VMTemplateHostVO> listByTemplateStatus(long templateId, VMTemplateHostVO.Status downloadState) {

View File

@ -34,7 +34,7 @@ public class FtpTemplateUploader implements TemplateUploader {
this.ftpUrl = url;
this.completionCallback = callback;
this.templateSizeinBytes = templateSizeinBytes;
s_logger.warn("Nitin in FtpTemplateUploader " +url + " "+sourcePath);
}
public long upload(UploadCompleteCallback callback )
@ -50,7 +50,7 @@ public class FtpTemplateUploader implements TemplateUploader {
}
Date start = new Date();
s_logger.warn("Nitin in FtpTemplateUploader ");
StringBuffer sb = new StringBuffer();
// check for authentication else assume its anonymous access.
/* if (user != null && password != null)
@ -90,17 +90,16 @@ public class FtpTemplateUploader implements TemplateUploader {
done = true;
}
}
status = TemplateUploader.Status.UPLOAD_FINISHED;
s_logger.warn("Nitin in FtpTemplateUploader " +status);
status = TemplateUploader.Status.UPLOAD_FINISHED;
return totalBytes;
} catch (MalformedURLException e) {
status = TemplateUploader.Status.UNRECOVERABLE_ERROR;
errorString = e.getMessage();
s_logger.error("Nitin in FtpTemplateUploader " +errorString);
s_logger.error(errorString);
} catch (IOException e) {
status = TemplateUploader.Status.UNRECOVERABLE_ERROR;
errorString = e.getMessage();
s_logger.error("Nitin in FtpTemplateUploader " +errorString);
s_logger.error(errorString);
}
finally
{

View File

@ -1,14 +1,10 @@
package com.cloud.storage.template;
import java.util.List;
import java.util.Map;
import com.cloud.agent.api.storage.UploadAnswer;
import com.cloud.agent.api.storage.UploadCommand;
import com.cloud.agent.api.storage.UploadCommand;
import com.cloud.storage.StorageResource;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Upload.Status;
import com.cloud.utils.component.Manager;
public interface UploadManager extends Manager {
@ -26,7 +22,7 @@ public interface UploadManager extends Manager {
* @param jobId job Id
* @return status of the upload job
*/
public VMTemplateHostVO.Status getUploadStatus2(String jobId);
public Status getUploadStatus2(String jobId);
/**
* Get the upload percent of a upload job

View File

@ -24,6 +24,7 @@ import com.cloud.agent.api.storage.UploadAnswer;
import com.cloud.agent.api.storage.UploadCommand;
import com.cloud.storage.StorageLayer;
import com.cloud.storage.StorageResource;
import com.cloud.storage.UploadVO;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.template.TemplateUploader.UploadCompleteCallback;
@ -225,31 +226,31 @@ public class UploadManagerImpl implements UploadManager {
return Status.UNKNOWN;
}
public static VMTemplateHostVO.Status convertStatus(Status tds) {
public static UploadVO.Status convertStatus(Status tds) {
switch (tds) {
case ABORTED:
return VMTemplateHostVO.Status.NOT_UPLOADED;
return UploadVO.Status.NOT_UPLOADED;
case UPLOAD_FINISHED:
return VMTemplateHostVO.Status.UPLOAD_IN_PROGRESS;
return UploadVO.Status.UPLOAD_IN_PROGRESS;
case IN_PROGRESS:
return VMTemplateHostVO.Status.UPLOAD_IN_PROGRESS;
return UploadVO.Status.UPLOAD_IN_PROGRESS;
case NOT_STARTED:
return VMTemplateHostVO.Status.NOT_UPLOADED;
return UploadVO.Status.NOT_UPLOADED;
case RECOVERABLE_ERROR:
return VMTemplateHostVO.Status.NOT_UPLOADED;
return UploadVO.Status.NOT_UPLOADED;
case UNKNOWN:
return VMTemplateHostVO.Status.UNKNOWN;
return UploadVO.Status.UNKNOWN;
case UNRECOVERABLE_ERROR:
return VMTemplateHostVO.Status.UPLOAD_ERROR;
return UploadVO.Status.UPLOAD_ERROR;
case POST_UPLOAD_FINISHED:
return VMTemplateHostVO.Status.UPLOADED;
return UploadVO.Status.UPLOADED;
default:
return VMTemplateHostVO.Status.UNKNOWN;
return UploadVO.Status.UNKNOWN;
}
}
@Override
public com.cloud.storage.VMTemplateHostVO.Status getUploadStatus2(String jobId) {
public com.cloud.storage.UploadVO.Status getUploadStatus2(String jobId) {
return convertStatus(getUploadStatus(jobId));
}
@Override
@ -265,7 +266,7 @@ public class UploadManagerImpl implements UploadManager {
if (jobId != null)
uj = jobs.get(jobId);
if (uj == null) {
return new UploadAnswer(null, 0, "Cannot find job", com.cloud.storage.VMTemplateHostVO.Status.UNKNOWN, "", "", 0);
return new UploadAnswer(null, 0, "Cannot find job", com.cloud.storage.UploadVO.Status.UNKNOWN, "", "", 0);
}
TemplateUploader td = uj.getTemplateUploader();
switch (cmd.getRequest()) {
@ -294,31 +295,20 @@ public class UploadManagerImpl implements UploadManager {
@Override
public UploadAnswer handleUploadCommand(UploadCommand cmd) {
s_logger.warn(" handliing the upload " +cmd.getInstallPath() + " " + cmd.getId());
s_logger.warn("Handling the upload " +cmd.getInstallPath() + " " + cmd.getId());
if (cmd instanceof UploadProgressCommand) {
return handleUploadProgressCmd((UploadProgressCommand) cmd);
}
/*
if (cmd.getUrl() == null) {
return new UploadAnswer(null, 0, "Template is corrupted on storage due to an invalid url , cannot Upload", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.UPLOAD_ERROR, "", "", 0);
}
if (cmd.getName() == null) {
return new UploadAnswer(null, 0, "Invalid Name", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.UPLOAD_ERROR, "", "", 0);
}*/
// String installPathPrefix = null;
// installPathPrefix = publicTemplateRepo;
String user = null;
String password = null;
String password = null;
String jobId = uploadPublicTemplate(cmd.getId(), cmd.getUrl(), cmd.getName(),
cmd.getFormat(), cmd.getAccountId(), cmd.getDescription(),
cmd.getChecksum(), cmd.getInstallPath(), user, password,
cmd.getTemplateSizeInBytes());
sleep();
if (jobId == null) {
return new UploadAnswer(null, 0, "Internal Error", com.cloud.storage.VMTemplateStorageResourceAssoc.Status.UPLOAD_ERROR, "", "", 0);
return new UploadAnswer(null, 0, "Internal Error", com.cloud.storage.UploadVO.Status.UPLOAD_ERROR, "", "", 0);
}
return new UploadAnswer(jobId, getUploadPct(jobId), getUploadError(jobId), getUploadStatus2(jobId), getUploadLocalPath(jobId), getInstallPath(jobId),
getUploadTemplateSize(jobId));

2
server/src/com/cloud/api/BaseCmd.java Normal file → Executable file
View File

@ -281,6 +281,7 @@ public abstract class BaseCmd {
OS_TYPE_ID("ostypeid", BaseCmd.TYPE_LONG, "osTypeId"),
OS_TYPE_NAME("ostypename", BaseCmd.TYPE_STRING, "osTypeName"),
OP("op", BaseCmd.TYPE_STRING, "op"),
ONE_TO_ONE_NAT("onetoonenat",BaseCmd.TYPE_BOOLEAN,"oneToOneNat"),
PAGE("page", BaseCmd.TYPE_INT, "page"),
PAGESIZE("pagesize", BaseCmd.TYPE_INT, "pagesize"),
PARENT_ID("parentid", BaseCmd.TYPE_LONG, "parentId"),
@ -344,6 +345,7 @@ public abstract class BaseCmd {
SOURCE_ID("sourceid", BaseCmd.TYPE_LONG, "sourceid"),
SOURCE_TYPE("sourcetype",BaseCmd.TYPE_STRING,"sourcetype"),
STORAGE_TYPE("storagetype", BaseCmd.TYPE_STRING, "storageType"),
STATUS("status", BaseCmd.TYPE_STRING, "status"),
SUCCESS("success", BaseCmd.TYPE_BOOLEAN, "success"),
SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"),
SYSTEM_VM_TYPE("systemvmtype", BaseCmd.TYPE_STRING, "systemvmtype"),

View File

@ -48,7 +48,8 @@ public class AssociateIPAddrCmd extends BaseCmd {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.USER_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ONE_TO_ONE_NAT, Boolean.FALSE));
}
public String getName() {

View File

@ -0,0 +1,92 @@
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.api.ServerApiException;
import com.cloud.dc.DataCenterVO;
import com.cloud.server.ManagementServer;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
public class ExtractIsoCmd extends BaseCmd {
public static final Logger s_logger = Logger.getLogger(ExtractIsoCmd.class.getName());
private static final String s_name = "extractisoresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.URL, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
String url = (String) params.get(BaseCmd.Properties.URL.getName());
Long templateId = (Long) params.get(BaseCmd.Properties.ID.getName());
Long zoneId = (Long) params.get(BaseCmd.Properties.ZONE_ID.getName());
Account account = (Account) params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
ManagementServer managementServer = getManagementServer();
VMTemplateVO template = managementServer.findTemplateById(templateId.longValue());
if (template == null) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to find ISO with id " + templateId);
}
if (template.getName().startsWith("xs-tools") ){
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to extract the ISO " + template.getName() + " It is not supported yet");
}
if (template.getFormat() != ImageFormat.ISO ){
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unsupported format, could not extract the ISO");
}
if(url.toLowerCase().contains("file://")){
throw new ServerApiException(BaseCmd.PARAM_ERROR, "file:// type urls are currently unsupported");
}
if (account != null) {
if(!isAdmin(account.getType())){
if (template.getAccountId() != account.getId()){
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find ISO with ID: " + templateId + " for account: " + account.getAccountName());
}
}else if(!managementServer.isChildDomain(account.getDomainId(), managementServer.findDomainIdByAccountId(template.getAccountId())) ) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract ISO " + templateId + " to " + url + ", permission denied.");
}
}
try {
managementServer.extractTemplate(url, templateId, zoneId);
} catch (Exception e) {
s_logger.error(e.getMessage(), e);
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the ISO " + e.getMessage());
}
DataCenterVO zone = managementServer.getDataCenterBy(zoneId);
List<Pair<String, Object>> response = new ArrayList<Pair<String, Object>>();
response.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_ID.getName(), templateId));
response.add(new Pair<String, Object>(BaseCmd.Properties.NAME.getName(), template.getName()));
response.add(new Pair<String, Object>(BaseCmd.Properties.DISPLAY_TEXT.getName(), template.getDisplayText()));
response.add(new Pair<String, Object>(BaseCmd.Properties.URL.getName(), url));
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), zoneId));
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName()));
response.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_STATUS.getName(), "Processing"));
return response;
}
@Override
public String getName() {
return s_name;
}
@Override
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
}

View File

@ -12,6 +12,7 @@ import com.cloud.api.ServerApiException;
import com.cloud.dc.DataCenterVO;
import com.cloud.server.ManagementServer;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
@ -41,8 +42,8 @@ public class ExtractTemplateCmd extends BaseCmd {
if (template == null) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to find template with id " + templateId);
}
if (template.getName().startsWith("xs-tools") ){
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to extract the template " + template.getName() + " It is not supported yet");
if (template.getFormat() == ImageFormat.ISO ){
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unsupported format, could not extract the template");
}
if(url.toLowerCase().contains("file://")){

View File

@ -0,0 +1,86 @@
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.api.ServerApiException;
import com.cloud.dc.DataCenterVO;
import com.cloud.server.ManagementServer;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeVO;
import com.cloud.user.Account;
import com.cloud.utils.Pair;
public class ExtractVolumeCmd extends BaseCmd {
public static final Logger s_logger = Logger.getLogger(ExtractVolumeCmd.class.getName());
private static final String s_name = "extractvolumeresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.URL, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ZONE_ID, Boolean.TRUE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
String url = (String) params.get(BaseCmd.Properties.URL.getName());
Long volumeId = (Long) params.get(BaseCmd.Properties.ID.getName());
Long zoneId = (Long) params.get(BaseCmd.Properties.ZONE_ID.getName());
Account account = (Account) params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
ManagementServer managementServer = getManagementServer();
VolumeVO volume = managementServer.findVolumeById(volumeId);
if (volume == null) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Unable to find volume with id " + volumeId);
}
if(url.toLowerCase().contains("file://")){
throw new ServerApiException(BaseCmd.PARAM_ERROR, "file:// type urls are currently unsupported");
}
if (account != null) {
if(!isAdmin(account.getType())){
if (volume.getAccountId() != account.getId()){
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to find volume with ID: " + volumeId + " for account: " + account.getAccountName());
}
}else if(!managementServer.isChildDomain(account.getDomainId(), volume.getDomainId())){
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Unable to extract volume " + volumeId + " to " + url + ", permission denied.");
}
}
try {
managementServer.extractVolume(url, volumeId, zoneId);
} catch (Exception e) {
s_logger.error(e.getMessage(), e);
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal Error Extracting the volume " + e.getMessage());
}
DataCenterVO zone = managementServer.getDataCenterBy(zoneId);
List<Pair<String, Object>> response = new ArrayList<Pair<String, Object>>();
response.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_ID.getName(), volumeId));
response.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_NAME.getName(), volume.getName()));
response.add(new Pair<String, Object>(BaseCmd.Properties.URL.getName(), url));
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_ID.getName(), zoneId));
response.add(new Pair<String, Object>(BaseCmd.Properties.ZONE_NAME.getName(), zone.getName()));
response.add(new Pair<String, Object>(BaseCmd.Properties.STATUS.getName(), "Processing"));
return response;
}
@Override
public String getName() {
return s_name;
}
@Override
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
}

View File

@ -424,7 +424,7 @@ public class ConfigurationServerImpl implements ConfigurationServer {
throw new RuntimeException("No home directory was detected. Set the HOME environment variable to point to your user profile or home directory.");
}
String keygenOutput = Script.runSimpleBashScript("if [ -f ~/.ssh/id_rsa ] ; then true ; else yes '' | ssh-keygen -t rsa -q -O no-pty ; fi");
String keygenOutput = Script.runSimpleBashScript("if [ -f ~/.ssh/id_rsa ] ; then true ; else yes '' | ssh-keygen -t rsa -q ; fi");
File privkeyfile = new File(homeDir + "/.ssh/id_rsa");
File pubkeyfile = new File(homeDir + "/.ssh/id_rsa.pub");

View File

@ -54,6 +54,8 @@ import org.apache.log4j.Logger;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.GetVncPortAnswer;
import com.cloud.agent.api.GetVncPortCommand;
import com.cloud.agent.api.storage.CopyVolumeAnswer;
import com.cloud.agent.api.storage.CopyVolumeCommand;
import com.cloud.alert.AlertManager;
import com.cloud.alert.AlertVO;
import com.cloud.alert.dao.AlertDao;
@ -4799,7 +4801,49 @@ public class ManagementServerImpl implements ManagementServer {
public VlanVO findVlanById(long vlanDbId) {
return _vlanDao.findById(vlanDbId);
}
@Override
public void extractVolume(String url, Long volumeId, Long zoneId) throws URISyntaxException, InternalErrorException{
URI uri = new URI(url);
if ( (uri.getScheme() == null) || (!uri.getScheme().equalsIgnoreCase("ftp") )) {
throw new IllegalArgumentException("Unsupported scheme for url: " + url);
}
String host = uri.getHost();
try {
InetAddress hostAddr = InetAddress.getByName(host);
if (hostAddr.isAnyLocalAddress() || hostAddr.isLinkLocalAddress() || hostAddr.isLoopbackAddress() || hostAddr.isMulticastAddress() ) {
throw new IllegalArgumentException("Illegal host specified in url");
}
if (hostAddr instanceof Inet6Address) {
throw new IllegalArgumentException("IPV6 addresses not supported (" + hostAddr.getHostAddress() + ")");
}
} catch (UnknownHostException uhe) {
throw new IllegalArgumentException("Unable to resolve " + host);
}
if (_dcDao.findById(zoneId) == null) {
throw new IllegalArgumentException("Please specify a valid zone.");
}
VolumeVO volume = findVolumeById(volumeId);
String secondaryStorageURL = _storageMgr.getSecondaryStorageURL(zoneId);
StoragePoolVO srcPool = _poolDao.findById(volume.getPoolId());
Long sourceHostId = _storageMgr.findHostIdForStoragePool(srcPool);
// Copy the volume from the source storage pool to secondary storage
CopyVolumeCommand cvCmd = new CopyVolumeCommand(volume.getId(), volume.getPath(), srcPool, secondaryStorageURL, true);
CopyVolumeAnswer cvAnswer = (CopyVolumeAnswer) _agentMgr.easySend(sourceHostId, cvCmd);
if (cvAnswer == null || !cvAnswer.getResult()) {
throw new InternalErrorException("Failed to copy the volume from the source primary storage pool to secondary storage.");
}
}
@Override
public void extractTemplate(String url, Long templateId, Long zoneId) throws URISyntaxException{

3
server/src/com/cloud/storage/StorageManagerImpl.java Normal file → Executable file
View File

@ -423,7 +423,8 @@ public class StorageManagerImpl implements StorageManager {
return null;
}
protected Long findHostIdForStoragePool(StoragePoolVO pool) {
@Override
public Long findHostIdForStoragePool(StoragePoolVO pool) {
List<StoragePoolHostVO> poolHosts = _poolHostDao.listByHostStatus(pool.getId(), Status.Up);
if (poolHosts.size() == 0) {

View File

@ -1,7 +1,7 @@
package com.cloud.storage.upload;
import com.cloud.agent.api.storage.UploadProgressCommand.RequestType;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.Upload.Status;
public class UploadAbandonedState extends UploadInactiveState {

View File

@ -1,7 +1,7 @@
package com.cloud.storage.upload;
import com.cloud.agent.api.storage.UploadProgressCommand.RequestType;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.Upload.Status;
public class UploadCompleteState extends UploadInactiveState {

View File

@ -4,7 +4,7 @@ import org.apache.log4j.Level;
import com.cloud.agent.api.storage.UploadAnswer;
import com.cloud.agent.api.storage.UploadProgressCommand.RequestType;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.Upload.Status;
public class UploadErrorState extends UploadInactiveState {

91
server/src/com/cloud/storage/upload/UploadListener.java Normal file → Executable file
View File

@ -27,10 +27,13 @@ import com.cloud.event.EventTypes;
import com.cloud.event.EventVO;
import com.cloud.host.HostVO;
import com.cloud.storage.Storage;
import com.cloud.storage.UploadVO;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.dao.UploadDao;
import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.Upload.Status;
import com.cloud.storage.Upload.Type;
import com.cloud.storage.download.DownloadState.DownloadEvent;
import com.cloud.storage.upload.UploadMonitorImpl;
import com.cloud.storage.upload.UploadState.UploadEvent;
@ -79,13 +82,12 @@ public class UploadListener implements Listener {
public static final String UPLOAD_ABANDONED=Status.ABANDONED.toString();
private HostVO sserver;
private VMTemplateVO template;
private HostVO sserver;
private boolean uploadActive = true;
private VMTemplateHostDao vmTemplateHostDao;
private UploadDao uploadDao;
private final UploadMonitorImpl uploadMonitor;
private UploadState currState;
@ -98,17 +100,24 @@ public class UploadListener implements Listener {
private TimeoutTask timeoutTask;
private Date lastUpdated = new Date();
private String jobId;
private Long accountId;
private String typeName;
private Type type;
private final Map<String, UploadState> stateMap = new HashMap<String, UploadState>();
private Long templateHostId;
private Long uploadId;
public UploadListener(HostVO host, VMTemplateVO template, Timer _timer, VMTemplateHostDao dao, Long templHostId, UploadMonitorImpl uploadMonitor, UploadCommand cmd) {
this.sserver = host;
this.template = template;
this.vmTemplateHostDao = dao;
public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao,
Long uploadId, UploadMonitorImpl uploadMonitor, UploadCommand cmd,
Long accountId, String typeName, Type type) {
this.sserver = host;
this.uploadDao = uploadDao;
this.uploadMonitor = uploadMonitor;
this.cmd = cmd;
this.templateHostId = templHostId;
this.uploadId = uploadId;
this.accountId = accountId;
this.typeName = typeName;
this.type = type;
initStateMachine();
this.currState = getState(Status.NOT_UPLOADED.toString());
this.timer = _timer;
@ -203,11 +212,19 @@ public class UploadListener implements Listener {
public void setUploadInactive(Status reason) {
uploadActive=false;
uploadMonitor.handleUploadEvent(sserver, template, reason);
uploadMonitor.handleUploadEvent(sserver, accountId, typeName, type, uploadId, reason);
}
public void logUploadStart() {
uploadMonitor.logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_UPLOAD_START, "Storage server " + sserver.getName() + " started upload of template " + template.getName(), EventVO.LEVEL_INFO);
String event;
if (type == Type.TEMPLATE){
event = EventTypes.EVENT_TEMPLATE_UPLOAD_START;
}else if (type == Type.ISO){
event = EventTypes.EVENT_ISO_UPLOAD_START;
}else{
event = EventTypes.EVENT_VOLUME_UPLOAD_START;
}
uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " started upload of " +type.toString() + " " + typeName, EventVO.LEVEL_INFO);
}
public void cancelTimeoutTask() {
@ -268,7 +285,7 @@ public class UploadListener implements Listener {
}
public void log(String message, Level level) {
s_logger.log(level, message + ", template=" + template.getName() + " at host " + sserver.getName());
s_logger.log(level, message + ", " + type.toString() + " = " + typeName + " at host " + sserver.getName());
}
public void setDisconnected() {
@ -294,44 +311,44 @@ public class UploadListener implements Listener {
public void updateDatabase(Status state, String uploadErrorString) {
VMTemplateHostVO vo = vmTemplateHostDao.createForUpdate();
UploadVO vo = uploadDao.createForUpdate();
vo.setUploadState(state);
vo.setLastUpdated(new Date());
vo.setUpload_errorString(uploadErrorString);
vmTemplateHostDao.update(getTemplateHostId(), vo);
vo.setErrorString(uploadErrorString);
uploadDao.update(getUploadId(), vo);
}
public void updateDatabase(Status state, String uploadUrl,String uploadErrorString) {
VMTemplateHostVO vo = vmTemplateHostDao.createForUpdate();
UploadVO vo = uploadDao.createForUpdate();
vo.setUploadState(state);
vo.setLastUpdated(new Date());
vo.setUploadUrl(uploadUrl);
vo.setUploadJobId(null);
vo.setJobId(null);
vo.setUploadPercent(0);
vo.setUpload_errorString(uploadErrorString);
vo.setErrorString(uploadErrorString);
vmTemplateHostDao.update(getTemplateHostId(), vo);
uploadDao.update(getUploadId(), vo);
}
private Long getTemplateHostId() {
if (templateHostId == null){
private Long getUploadId() {
/*if (uploadId == null){
VMTemplateHostVO templHost = vmTemplateHostDao.findByHostTemplate(sserver.getId(), template.getId());
templateHostId = templHost.getId();
}
return templateHostId;
uploadId = templHost.getId();
}*/ //TO DO
return uploadId;
}
public synchronized void updateDatabase(UploadAnswer answer) {
VMTemplateHostVO updateBuilder = vmTemplateHostDao.createForUpdate();
UploadVO updateBuilder = uploadDao.createForUpdate();
updateBuilder.setUploadPercent(answer.getUploadPct());
updateBuilder.setUploadState(answer.getUploadStatus());
updateBuilder.setLastUpdated(new Date());
updateBuilder.setUpload_errorString(answer.getErrorString());
updateBuilder.setUploadJobId(answer.getJobId());
updateBuilder.setErrorString(answer.getErrorString());
updateBuilder.setJobId(answer.getJobId());
vmTemplateHostDao.update(getTemplateHostId(), updateBuilder);
uploadDao.update(getUploadId(), updateBuilder);
}
public void sendCommand(RequestType reqType) {
@ -352,8 +369,16 @@ public class UploadListener implements Listener {
}
public void logDisconnect() {
s_logger.warn("Unable to monitor upload progress of " + template.getName() + " at host " + sserver.getName());
uploadMonitor.logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED, "Storage server " + sserver.getName() + " disconnected during upload of template " + template.getName(), EventVO.LEVEL_WARN);
s_logger.warn("Unable to monitor upload progress of " + typeName + " at host " + sserver.getName());
String event;
if (type == Type.TEMPLATE){
event = EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED;
}else if (type == Type.ISO){
event = EventTypes.EVENT_ISO_UPLOAD_FAILED;
}else{
event = EventTypes.EVENT_VOLUME_UPLOAD_FAILED;
}
uploadMonitor.logEvent(accountId, event, "Storage server " + sserver.getName() + " disconnected during upload of " + typeName, EventVO.LEVEL_WARN);
}
public void scheduleImmediateStatusCheck(RequestType request) {

View File

@ -29,13 +29,18 @@ import com.cloud.host.Host;
import com.cloud.host.HostVO;
import com.cloud.host.dao.HostDao;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.storage.Upload;
import com.cloud.storage.UploadVO;
import com.cloud.storage.VMTemplateHostVO;
import com.cloud.storage.VMTemplateStoragePoolVO;
import com.cloud.storage.VMTemplateStorageResourceAssoc;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeVO;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Upload.Type;
import com.cloud.storage.VMTemplateStorageResourceAssoc.Status;
import com.cloud.storage.dao.StoragePoolHostDao;
import com.cloud.storage.dao.UploadDao;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VMTemplateHostDao;
import com.cloud.storage.dao.VMTemplatePoolDao;
@ -46,7 +51,7 @@ import com.cloud.vm.dao.SecondaryStorageVmDao;
/**
* @author nitin
*
* Monitors the progress of upload.
*/
@Local(value={UploadMonitor.class})
public class UploadMonitorImpl implements UploadMonitor {
@ -56,6 +61,8 @@ public class UploadMonitorImpl implements UploadMonitor {
private String _hyperVisorType;
@Inject
VMTemplateHostDao _vmTemplateHostDao;
@Inject
UploadDao _uploadDao;
@Inject
VMTemplatePoolDao _vmTemplatePoolDao;
@Inject
@ -65,9 +72,7 @@ public class UploadMonitorImpl implements UploadMonitor {
@Inject
HostDao _serverDao = null;
@Inject
private final DataCenterDao _dcDao = null;
HostDao _serverDao = null;
@Inject
VMTemplateDao _templateDao = null;
@Inject
@ -84,42 +89,79 @@ public class UploadMonitorImpl implements UploadMonitor {
Timer _timer;
final Map<VMTemplateHostVO, UploadListener> _listenerMap = new ConcurrentHashMap<VMTemplateHostVO, UploadListener>();
final Map<UploadVO, UploadListener> _listenerMap = new ConcurrentHashMap<UploadVO, UploadListener>();
@Override
public void cancelAllUploads(Long templateId) {
// TODO Auto-generated method stub
}
public boolean isTemplateUploadInProgress(Long templateId) {
List<VMTemplateHostVO> uploadsInProgress =
_vmTemplateHostDao.listByTemplateStatus(templateId, VMTemplateHostVO.Status.UPLOAD_IN_PROGRESS);
}
private boolean isTypeUploadInProgress(Long typeId, Type type) {
List<UploadVO> uploadsInProgress =
_uploadDao.listByTypeUploadStatus(typeId, type, UploadVO.Status.UPLOAD_IN_PROGRESS);
return (uploadsInProgress.size() != 0);
}
public void extractVolume(VolumeVO volume, String url, Long dataCenterId, String installPath){
if ( isTypeUploadInProgress(volume.getId(), Type.VOLUME) ){
return;
}
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId);
HostVO sserver = storageServers.get(0);
UploadVO uploadVolumeObj = new UploadVO(sserver.getId(), volume.getId(), new Date(),
Upload.Status.NOT_UPLOADED, 0, Type.VOLUME,
null, "jobid0000", url);
_uploadDao.persist(uploadVolumeObj);
//_vmTemplateHostDao.updateUploadStatus(sserver.getId(), template.getId(), 0, VMTemplateStorageResourceAssoc.Status.NOT_UPLOADED, "jobid0000", url);
start();
UploadCommand ucmd = new UploadCommand(url, volume.getId(), volume.getSize(), installPath, Type.VOLUME);
UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadVolumeObj.getId(), this, ucmd, volume.getAccountId(), volume.getName(), Type.VOLUME);
_listenerMap.put(uploadVolumeObj, ul);
long result = send(sserver.getId(), ucmd, ul);
if (result == -1) {
s_logger.warn("Unable to start upload of volume " + volume.getName() + " from " + sserver.getName() + " to " +url);
ul.setDisconnected();
ul.scheduleStatusCheck(RequestType.GET_OR_RESTART);
}
}
@Override
public void extractTemplate( VMTemplateVO template, String url,
VMTemplateHostVO vmTemplateHost,Long dataCenterId){
if (isTemplateUploadInProgress(template.getId()) ){
return;
Type type = (template.getFormat() == ImageFormat.ISO) ? Type.ISO : Type.TEMPLATE ;
if (isTypeUploadInProgress(template.getId(), type) ){
return; // TO DO raise an exception.
}
List<HostVO> storageServers = _serverDao.listByTypeDataCenter(Host.Type.SecondaryStorage, dataCenterId);
HostVO sserver = storageServers.get(0);
_vmTemplateHostDao.updateUploadStatus(sserver.getId(), template.getId(), 0, VMTemplateStorageResourceAssoc.Status.NOT_UPLOADED, "jobid0000", url);
UploadVO uploadTemplateObj = new UploadVO(sserver.getId(), template.getId(), new Date(),
Upload.Status.NOT_UPLOADED, 0, type,
null, "jobid0000", url);
_uploadDao.persist(uploadTemplateObj);
if(vmTemplateHost != null) {
start();
UploadCommand ucmd = new UploadCommand(template, url, vmTemplateHost);
UploadListener ul = new UploadListener(sserver, template, _timer, _vmTemplateHostDao, vmTemplateHost.getId(), this, ucmd);
_listenerMap.put(vmTemplateHost, ul);
UploadListener ul = new UploadListener(sserver, _timer, _uploadDao, uploadTemplateObj.getId(), this, ucmd, template.getAccountId(), template.getName(), type);//TO DO - remove template
_listenerMap.put(uploadTemplateObj, ul);
long result = send(sserver.getId(), ucmd, ul);
if (result == -1) {
s_logger.warn("Unable to start upload of template " + template.getUniqueName() + " from " + sserver.getName() + " to " +url);
s_logger.warn("Unable to start upload of " + template.getUniqueName() + " from " + sserver.getName() + " to " +url);
ul.setDisconnected();
ul.scheduleStatusCheck(RequestType.GET_OR_RESTART);
}
@ -169,23 +211,39 @@ public class UploadMonitorImpl implements UploadMonitor {
return true;
}
public void handleUploadEvent(HostVO host, VMTemplateVO template, Status upldStatus) {
public String getEvent(Upload.Status status, Type type){
if (status == Upload.Status.UPLOADED){
if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_SUCCESS;
if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_SUCCESS;
if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_SUCCESS;
}
if ((upldStatus == VMTemplateStorageResourceAssoc.Status.UPLOADED) || (upldStatus==Status.ABANDONED)){
VMTemplateHostVO vmTemplateHost = new VMTemplateHostVO(host.getId(), template.getId());
UploadListener oldListener = _listenerMap.get(vmTemplateHost);
if (status == Upload.Status.UPLOAD_ERROR || status == Upload.Status.ABANDONED){
if(type == Type.TEMPLATE) return EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED;
if(type == Type.ISO) return EventTypes.EVENT_ISO_UPLOAD_FAILED;
if(type == Type.VOLUME) return EventTypes.EVENT_VOLUME_UPLOAD_FAILED;
}
return null;
}
public void handleUploadEvent(HostVO host, Long accountId, String typeName, Type type, Long uploadId, com.cloud.storage.Upload.Status reason) {
if ((reason == Upload.Status.UPLOADED) || (reason==Upload.Status.ABANDONED)){
UploadVO uploadObj = new UploadVO(uploadId);
UploadListener oldListener = _listenerMap.get(uploadObj);
if (oldListener != null) {
_listenerMap.remove(vmTemplateHost);
_listenerMap.remove(uploadObj);
}
}
if (upldStatus == VMTemplateStorageResourceAssoc.Status.UPLOADED) {
logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_UPLOAD_SUCCESS, template.getName() + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO);
if (reason == Upload.Status.UPLOADED) {
logEvent(accountId, getEvent(reason, type), typeName + " successfully uploaded from storage server " + host.getName(), EventVO.LEVEL_INFO);
}
if (upldStatus == Status.UPLOAD_ERROR) {
logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED, template.getName() + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR);
if (reason == Upload.Status.UPLOAD_ERROR) {
logEvent(accountId, getEvent(reason, type), typeName + " failed to upload from storage server " + host.getName(), EventVO.LEVEL_ERROR);
}
if (upldStatus == Status.ABANDONED) {
logEvent(template.getAccountId(), EventTypes.EVENT_TEMPLATE_UPLOAD_FAILED, template.getName() + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN);
if (reason == Upload.Status.ABANDONED) {
logEvent(accountId, getEvent(reason, type), typeName + " :aborted upload from storage server " + host.getName(), EventVO.LEVEL_WARN);
}
/*VMTemplateHostVO vmTemplateHost = _vmTemplateHostDao.findByHostTemplate(host.getId(), template.getId());
@ -261,7 +319,7 @@ public class UploadMonitorImpl implements UploadMonitor {
@Override
public void handleUploadTemplateSync(long sserverId, Map<String, TemplateInfo> templateInfo) {
HostVO storageHost = _serverDao.findById(sserverId);
/*HostVO storageHost = _serverDao.findById(sserverId);
if (storageHost == null) {
s_logger.warn("Huh? Agent id " + sserverId + " does not correspond to a row in hosts table?");
return;
@ -300,7 +358,7 @@ public class UploadMonitorImpl implements UploadMonitor {
templateInfo.remove(uniqueName);
continue;
}
/*if (tmpltHost != null && tmpltHost.getUploadState() != Status.UPLOADED) {
if (tmpltHost != null && tmpltHost.getUploadState() != Status.UPLOADED) {
s_logger.info("Template Sync did not find " + uniqueName + " ready on server " + sserverId + ", will request upload to start/resume shortly");
} else if (tmpltHost == null) {
@ -310,5 +368,5 @@ public class UploadMonitorImpl implements UploadMonitor {
}*/
}
}
}

View File

@ -79,6 +79,7 @@
<dao name="UserAccount" class="com.vmops.user.dao.UserAccountDaoImpl"/>
<dao name="Usage IPAddress" class="com.vmops.usage.dao.UsageIPAddressDaoImpl"/>
<dao name="VM Template Host" class="com.vmops.storage.dao.VMTemplateHostDaoImpl"/>
<dao name="Upload" class="com.vmops.storage.dao.UploadDaoImpl"/>
<dao name="VM Template Pool" class="com.vmops.storage.dao.VMTemplatePoolDaoImpl"/>
<dao name="Launch Permission" class="com.vmops.storage.dao.LaunchPermissionDaoImpl"/>
<dao name="Configuration" class="com.vmops.configuration.dao.ConfigurationDaoImpl"/>

4
setup/db/create-index-fk.sql Normal file → Executable file
View File

@ -159,6 +159,10 @@ ALTER TABLE `cloud`.`template_host_ref` ADD INDEX `i_template_host_ref__host_id`
ALTER TABLE `cloud`.`template_host_ref` ADD CONSTRAINT `fk_template_host_ref__template_id` FOREIGN KEY `fk_template_host_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`) ON DELETE CASCADE;
ALTER TABLE `cloud`.`template_host_ref` ADD INDEX `i_template_host_ref__template_id`(`template_id`);
ALTER TABLE `cloud`.`upload` ADD CONSTRAINT `fk_upload__host_id` FOREIGN KEY `fk_upload__host_id` (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE;
ALTER TABLE `cloud`.`upload` ADD INDEX `i_upload__host_id`(`host_id`);
ALTER TABLE `cloud`.`upload` ADD INDEX `i_upload__type_id`(`type_id`);
ALTER TABLE `cloud`.`template_zone_ref` ADD CONSTRAINT `fk_template_zone_ref__zone_id` FOREIGN KEY `fk_template_zone_ref__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE;
ALTER TABLE `cloud`.`template_zone_ref` ADD INDEX `i_template_zone_ref__zone_id`(`zone_id`);
ALTER TABLE `cloud`.`template_zone_ref` ADD CONSTRAINT `fk_template_zone_ref__template_id` FOREIGN KEY `fk_template_zone_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`) ON DELETE CASCADE;

View File

@ -24,6 +24,7 @@ DROP TABLE IF EXISTS `cloud`.`pricing`;
DROP TABLE IF EXISTS `cloud`.`sequence`;
DROP TABLE IF EXISTS `cloud`.`user_vm`;
DROP TABLE IF EXISTS `cloud`.`template_host_ref`;
DROP TABLE IF EXISTS `cloud`.`upload`;
DROP TABLE IF EXISTS `cloud`.`template_zone_ref`;
DROP TABLE IF EXISTS `cloud`.`ha_work`;
DROP TABLE IF EXISTS `cloud`.`dc_vnet_alloc`;
@ -627,6 +628,21 @@ CREATE TABLE `cloud`.`domain_router` (
PRIMARY KEY (`id`)
) ENGINE = InnoDB DEFAULT CHARSET=utf8 COMMENT = 'information about the domR instance';
CREATE TABLE `cloud`.`upload` (
`id` bigint unsigned NOT NULL auto_increment,
`host_id` bigint unsigned NOT NULL,
`type_id` bigint unsigned NOT NULL,
`type` varchar(255),
`created` DATETIME NOT NULL,
`last_updated` DATETIME,
`job_id` varchar(255),
`upload_pct` int(10) unsigned,
`upload_state` varchar(255),
`error_str` varchar(255),
`url` varchar(255),
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `cloud`.`template_host_ref` (
`id` bigint unsigned NOT NULL auto_increment,
`host_id` bigint unsigned NOT NULL,
@ -635,18 +651,13 @@ CREATE TABLE `cloud`.`template_host_ref` (
`created` DATETIME NOT NULL,
`last_updated` DATETIME,
`job_id` varchar(255),
`upload_job_id` varchar(255),
`download_pct` int(10) unsigned,
`upload_pct` int(10) unsigned,
`size` bigint unsigned,
`download_state` varchar(255),
`upload_state` varchar(255),
`error_str` varchar(255),
`upload_error_str` varchar(255),
`local_path` varchar(255),
`install_path` varchar(255),
`url` varchar(255),
`upload_url` varchar(255),
`destroyed` tinyint(1) COMMENT 'indicates whether the template_host entry was destroyed by the user or not',
`is_copy` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'indicates whether this was copied ',
PRIMARY KEY (`id`)

View File

@ -1381,6 +1381,7 @@ a:visited {
padding:0;
}
.searchpanel {
width:223px;
height:27px;
@ -2179,6 +2180,34 @@ a:visited {
padding:0 0 0 0;
}
.grid_botactionpanel {
width:100%;
height:23px;
float:left;
margin:15px 0 0 0;
padding:0 0 0 0;
}
.gridbot_buttons {
width:64px;
height:17px;
float:left;
color:#FFF;
background:url(../images/gridbot_actionbutton.gif) no-repeat top left;
text-align:center;
font-weight:normal;
font-size:12px;
margin:0 10px 0 0;
padding:4px 0 0 0;
cursor:pointer;
cursor:hand;
}
.gridbot_buttons:hover {
background:url(../images/gridbot_actionbutton_hover.gif) no-repeat top left;
}
.grid_actionbox {
width:35px;
height:17px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

View File

@ -54,6 +54,8 @@ long milliseconds = new Date().getTime();
<script type="text/javascript" src="scripts/cloud.core2.iso.js?t=<%=milliseconds%>"></script>
<script type="text/javascript" src="scripts/cloud.core2.router.js?t=<%=milliseconds%>"></script>
<title>Cloud.com CloudStack</title>
</head>
<body>

View File

@ -1,149 +1,146 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.account.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- account detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_accountsicon.gif" alt="Accounts" /></div>
<h1>Accounts</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div class="grid_actionpanel">
<div class="grid_actionbox">
<div class="grid_actionsdropdown_box" style="display:none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
</ul>
</div>
</div>
<div class="grid_editbox"></div>
<div class="gridheader_loaderbox" style="border:1px solid #999; display:none;">
<div class="gridheader_loader"></div>
<p>Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" style="border:1px solid #999; display:block;">
<p>Disk has been succesfully dettached &hellip;</p>
<div class="close_button"></div>
</div>
<div class="gridheader_message error" style="border:1px solid #999; display:none;">
<p>Some problem occured while dettaching disk &hellip;</p>
<div class="close_button"></div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("id")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Role")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="role">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Domain")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="domain">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("VMs")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="vm_total">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("IPs")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ip_total">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bytes.Received")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bytes_received">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bytes.Sent")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bytes_sent">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("State")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="state">
</div>
</div>
</div>
</div>
</div>
<!-- account detail panel (end) -->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- account detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_accountsicon.gif" alt="Accounts" /></div>
<h1>
Accounts</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
<div class="grid_editbox">
</div>
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="icon">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("id")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Role")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="role">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Domain")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="domain">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("VMs")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="vm_total">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("IPs")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ip_total">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bytes.Received")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bytes_received">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bytes.Sent")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bytes_sent">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("State")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="state">
</div>
</div>
</div>
</div>
</div>
</div>
<!-- account detail panel (end) -->

View File

@ -1,12 +1,7 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.alert.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>

View File

@ -1,12 +1,7 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.event.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>

View File

@ -1,326 +1,382 @@
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- IP Address detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_ipicon.gif" alt="IP Address" /></div>
<h1>IP Address
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
<div class="content_tabs off">
<%=t.t("Port Forwarding")%></div>
<div class="content_tabs off">
<%=t.t("Load Balancer")%></div>
</div>
<div class="grid_actionpanel">
<div class="grid_actionbox"></div>
<div class="grid_editbox"></div>
</div>
<!-- Network Details start here-->
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
IP:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Zone:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
VLAN:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Level")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="level">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Source NAT:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Network Type:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Domain:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Account:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Allocated:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
</div>
<!-- Network Details ends here-->
<!-- Port Forwarding start here-->
<div class="grid_container">
<div class="grid_header">
<div class="grid_header_cell" style="width:20%">
<div class="grid_header_title">Public Port</div>
</div>
<div class="grid_header_cell" style="width:20%">
<div class="grid_header_title">Private Port</div>
</div>
<div class="grid_header_cell" style="width:29%">
<div class="grid_header_title">Protocol</div>
</div>
<div class="grid_header_cell" style="width:30%; border:none;">
<div class="grid_header_title">Instance</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 29%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<select class="select" style="width:90%;"><option value="Instance1">Instance Name 1 </option> <option value="Instance2">Instance Name 2 </option> </select>
</div>
<div class="grid_row_cell" style="width: 10%;">
<div class="row_celltitles"><a href="#">Add</a></div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">80</div>
</div>
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">8 GB</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">Instance Name</div>
</div>
<div class="gridrow_loaderbox" style="display:none;">
<div class="gridrow_loader"></div>
<p> Creating &hellip;</p>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">80</div>
</div>
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">8 GB</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">Instance Name</div>
</div>
<div class="gridrow_loaderbox" style="display:none;">
<div class="gridrow_loader"></div>
<p> Creating &hellip;</p>
</div>
</div>
</div>
<!-- Port Forwarding ends here-->
<!-- Load Balancer start here-->
<div class="grid_container">
<div class="grid_header">
<div class="grid_header_cell" style="width:29%">
<div class="grid_header_title">Name</div>
</div>
<div class="grid_header_cell" style="width:20%">
<div class="grid_header_title">Public Port</div>
</div>
<div class="grid_header_cell" style="width:20%">
<div class="grid_header_title">Private Port</div>
</div>
<div class="grid_header_cell" style="width:30%; border:none;">
<div class="grid_header_title">Algorithm</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 29%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width:90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<select class="select" style="width:90%;"><option value="Source1">Source Name 1 </option> <option value="Source2">Source Name 2 </option> </select>
</div>
<div class="grid_row_cell" style="width: 10%;">
<div class="row_celltitles"><a href="#">Add</a></div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">LB#1</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">80</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">Source</div>
</div>
<div class="grid_detailspanel" style="display:block;">
<div class="grid_details_pointer"></div>
<div class="grid_detailsbox">
<div class="grid_details_row odd">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles"><img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<select class="select" style="width:90%;"><option value="Source1">Source Name 1 </option> <option value="Source2">Source Name 2 </option> </select>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles"><a href="#">Add</a></div>
</div>
</div>
<div class="grid_details_row">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles"><img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<div class="row_celltitles">1-2-2-TEST</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles"><a href="#">Remove</a></div>
</div>
</div>
<div class="grid_details_row odd">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles"><img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<div class="row_celltitles">1-2-2-TEST</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles"><a href="#">Remove</a></div>
</div>
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">LB#1</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">80</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">Source</div>
</div>
<div class="gridrow_loaderbox" style="display:none;">
<div class="gridrow_loader"></div>
<p> Creating &hellip;</p>
</div>
</div>
</div>
<!-- Load Balancer ends here-->
</div>
<!-- IP Address detail panel (end) -->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- IP Address detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_ipicon.gif" alt="IP Address" /></div>
<h1>
IP Address
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
<div class="content_tabs off">
<%=t.t("Port Forwarding")%></div>
<div class="content_tabs off">
<%=t.t("Load Balancer")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
<div class="grid_editbox">
</div>
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="icon">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
IP:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Zone:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
VLAN:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Level")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="level">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Source NAT:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Network Type:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Domain:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Account:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
Allocated:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles">
</div>
</div>
</div>
</div>
</div>
<!-- Details ends here-->
<!-- Port Forwarding start here-->
<div id="tab_content_port_forwarding" style="display:none">
<div class="grid_container">
<div class="grid_header">
<div class="grid_header_cell" style="width: 20%">
<div class="grid_header_title">
Public Port</div>
</div>
<div class="grid_header_cell" style="width: 20%">
<div class="grid_header_title">
Private Port</div>
</div>
<div class="grid_header_cell" style="width: 29%">
<div class="grid_header_title">
Protocol</div>
</div>
<div class="grid_header_cell" style="width: 30%; border: none;">
<div class="grid_header_title">
Instance</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 29%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<select class="select" style="width: 90%;">
<option value="Instance1">Instance Name 1 </option>
<option value="Instance2">Instance Name 2 </option>
</select>
</div>
<div class="grid_row_cell" style="width: 10%;">
<div class="row_celltitles">
<a href="#">Add</a></div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
80</div>
</div>
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">
8 GB</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
Instance Name</div>
</div>
<div class="gridrow_loaderbox" style="display: none;">
<div class="gridrow_loader">
</div>
<p>
Creating &hellip;</p>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
80</div>
</div>
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">
8 GB</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
Instance Name</div>
</div>
<div class="gridrow_loaderbox" style="display: none;">
<div class="gridrow_loader">
</div>
<p>
Creating &hellip;</p>
</div>
</div>
</div>
</div>
<!-- Port Forwarding ends here-->
<!-- Load Balancer start here-->
<div id="tab_content_load_balancer" style="display:none">
<div class="grid_container">
<div class="grid_header">
<div class="grid_header_cell" style="width: 29%">
<div class="grid_header_title">
Name</div>
</div>
<div class="grid_header_cell" style="width: 20%">
<div class="grid_header_title">
Public Port</div>
</div>
<div class="grid_header_cell" style="width: 20%">
<div class="grid_header_title">
Private Port</div>
</div>
<div class="grid_header_cell" style="width: 30%; border: none;">
<div class="grid_header_title">
Algorithm</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 29%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<input class="text" style="width: 90%;" type="text" />
</div>
<div class="grid_row_cell" style="width: 20%;">
<select class="select" style="width: 90%;">
<option value="Source1">Source Name 1 </option>
<option value="Source2">Source Name 2 </option>
</select>
</div>
<div class="grid_row_cell" style="width: 10%;">
<div class="row_celltitles">
<a href="#">Add</a></div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">
LB#1</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
80</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
Source</div>
</div>
<div class="grid_detailspanel" style="display: block;">
<div class="grid_details_pointer">
</div>
<div class="grid_detailsbox">
<div class="grid_details_row odd">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles">
<img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<select class="select" style="width: 90%;">
<option value="Source1">Source Name 1 </option>
<option value="Source2">Source Name 2 </option>
</select>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
<a href="#">Add</a></div>
</div>
</div>
<div class="grid_details_row">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles">
<img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<div class="row_celltitles">
1-2-2-TEST</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
<a href="#">Remove</a></div>
</div>
</div>
<div class="grid_details_row odd">
<div class="grid_row_cell" style="width: 9%;">
<div class="row_celltitles">
<img src="images/network_managevmicon.gif" /></div>
</div>
<div class="grid_row_cell" style="width: 60%;">
<div class="row_celltitles">
1-2-2-TEST</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
<a href="#">Remove</a></div>
</div>
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 29%;">
<div class="row_celltitles">
LB#1</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
8080</div>
</div>
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
80</div>
</div>
<div class="grid_row_cell" style="width: 30%;">
<div class="row_celltitles">
Source</div>
</div>
<div class="gridrow_loaderbox" style="display: none;">
<div class="gridrow_loader">
</div>
<p>
Creating &hellip;</p>
</div>
</div>
</div>
</div>
<!-- Load Balancer ends here-->
</div>
<!-- IP Address detail panel (end) -->

View File

@ -1,127 +1,149 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.event.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- ISO detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_isoicon.gif" alt="ISO" /></div>
<h1>ISO
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Zone")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="zonename">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Display.Text")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="displaytext">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Status")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="status">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bootable")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bootable">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Size")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="size">
</div>
</div>
</div>
</div>
</div>
<!-- ISO detail panel (end) -->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- ISO detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_isoicon.gif" alt="ISO" /></div>
<h1>
ISO
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
<div class="grid_editbox">
</div>
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="Div1">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Zone")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="zonename">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Display.Text")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="displaytext">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Status")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="status">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Bootable")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="bootable">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Size")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="size">
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ISO detail panel (end) -->

159
ui/new/jsp/router.jsp Normal file
View File

@ -0,0 +1,159 @@
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- router detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<!--
<div class="main_titleicon">
<img src="images/title_eventsicon.gif" alt="Event" /></div>
-->
<h1>
Router
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
<div class="grid_editbox">
</div>
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="icon">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Status")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="state">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Zone")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="zonename">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Public IP")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="publicip">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Private IP")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="privateip">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Guest IP")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="guestipaddress">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Host")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="hostname">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Network Domain")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="networkdomain">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
</div>
</div>
</div>
<!-- router detail panel (end) -->

View File

@ -1,104 +1,127 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.snapshot.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- snapshot detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_snapshoticon.gif" alt="Instance" /></div>
<h1>Snapshot
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Volume")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="volume_name">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Interval.Type")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="interval_type">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Domain")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="domain">
</div>
</div>
</div>
</div>
</div>
<!-- snapshot detail panel (end) -->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- snapshot detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_snapshoticon.gif" alt="Instance" /></div>
<h1>
Snapshot
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
<div class="grid_editbox">
</div>
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="icon">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
<div class="grid_container">
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Volume")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="volume_name">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Interval.Type")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="interval_type">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Domain")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="domain">
</div>
</div>
</div>
</div>
</div>
</div>
<!-- snapshot detail panel (end) -->

View File

@ -1,172 +1,206 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.event.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
<!-- template detail panel (begin) -->
<div class="main_title" id="right_panel_header">
<div class="main_titleicon">
<img src="images/title_templatesicon.gif" alt="Instance" /></div>
<h1>Template
<h1>
Template
</h1>
</div>
<div class="contentbox" id="right_panel_content">
<div class="info_detailbox errorbox" id="after_action_info_container" style="display:none">
<p id="after_action_info"></p>
<div class="info_detailbox errorbox" id="after_action_info_container" style="display: none">
<p id="after_action_info">
</p>
</div>
<div class="tabbox" style="margin-top:15px;">
<div class="tabbox" style="margin-top: 15px;">
<div class="content_tabs on">
<%=t.t("Details")%></div>
</div>
<div class="grid_container">
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
<%=t.t("Details")%></div>
</div>
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="volume_action_link">
<div class="grid_actionsdropdown_box" id="volume_action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>
<li> <a href="#"> Attach Disk </a> </li>
-->
</ul>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Zone")%>:</div>
<div class="grid_editbox" id="edit_icon">
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="zonename">
<div class="gridheader_loaderbox" id="spinning_wheel" style="border: 1px solid #999;
display: none;">
<div class="gridheader_loader" id="Div1">
</div>
<p id="description">
Detaching Disk &hellip;</p>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
<div class="gridheader_message" id="action_message_box" style="border: 1px solid #999; display: none;">
<p id="description"></p>
<div class="close_button" id="close_button">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Display.Text")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="displaytext"></div>
<input class="text" style="width:200px; display:none;" type="text" />
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Status")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="status">
<div class="grid_container">
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("ID")%>:</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Password.Enabled")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="passwordenabled">
<div id="icon">
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="id">
</div>
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Public")%>:</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Zone")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="zonename">
</div>
</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ispublic">
<div id="icon">
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Name")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="name">
</div>
<input class="text" id="name_edit" style="width: 200px; display: none;" type="text" />
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Display.Text")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="displaytext">
</div>
<input class="text" id="displaytext_edit" style="width: 200px; display: none;" type="text" />
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Status")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="status">
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Password.Enabled")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="passwordenabled">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Public")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ispublic">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Featured")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="isfeatured">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Cross.Zones")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="crossZones">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("OS.Type")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ostypename">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account">
</div>
<select class="select" style="width: 202px; display: none;">
<option value="opt1">Option 1</option>
<option value="opt2">Option 2</option>
</select>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Size")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="size">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Featured")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="isfeatured">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Cross.Zones")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="crossZones">
<div id="icon">
</div>
</div>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("OS.Type")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="ostypename">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Account")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="account"></div>
<select class="select" style="width:202px; display:none;"><option value="opt1">Option 1</option> <option value="opt2">Option 2</option></select>
</div>
</div>
<div class="grid_rows odd">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Created")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="created">
</div>
</div>
</div>
<div class="grid_rows even">
<div class="grid_row_cell" style="width: 20%;">
<div class="row_celltitles">
<%=t.t("Size")%>:</div>
</div>
<div class="grid_row_cell" style="width: 79%;">
<div class="row_celltitles" id="size">
</div>
</div>
<div class="grid_botactionpanel" style="display:none;">
<div class="gridbot_buttons">Save</div>
<div class="gridbot_buttons">Cancel</div>
</div>
</div>
</div>
<!-- template detail panel (end) -->
<!-- template detail panel (end) -->

View File

@ -1,14 +1,8 @@
<!--
<script type="text/javascript" src="scripts/cloud.core.volume.js"></script>
-->
<%@ page import="java.util.*" %>
<%@ page import="com.cloud.utils.*" %>
<%
Locale browserLocale = request.getLocale();
CloudResourceBundle t = CloudResourceBundle.getBundle("resources/resource", browserLocale);
%>
@ -34,8 +28,8 @@
<!--Details tab (start)-->
<div id="tab_content_details">
<div class="grid_actionpanel">
<div class="grid_actionbox" id="volume_action_link">
<div class="grid_actionsdropdown_box" id="volume_action_menu" style="display: none;">
<div class="grid_actionbox" id="action_link">
<div class="grid_actionsdropdown_box" id="action_menu" style="display: none;">
<ul class="actionsdropdown_boxlist" id="action_list">
<!--
<li> <a href="#"> Delete </a> </li>

View File

@ -15,39 +15,28 @@ $(document).ready(function() {
}
});
$("#accordion_menu").show();
$("#midmenu_container").selectable({
selecting: function(event, ui) {
if(ui.selecting.id.indexOf("midmenuItem") != -1) {
var $midmenuItem1 = $("#"+ui.selecting.id);
if($midmenuItem1.find("#content").hasClass("inaction") == false) { //only items not in action are allowed to be selected
var id =$midmenuItem1.data("jsonObj").id;
selectedItemsInMidMenu[id] = $midmenuItem1;
$midmenuItem1.find("#content").addClass("selected");
}
clearRightPanel();
var toRightPanelFn = $midmenuItem1.data("toRightPanelFn");
toRightPanelFn($midmenuItem1);
}
},
unselecting: function(event, ui) {
if(ui.unselecting.id.indexOf("midmenuItem") != -1) {
var $midmenuItem1 = $("#"+ui.unselecting.id);
var id = $midmenuItem1.data("jsonObj").id;
if(id in selectedItemsInMidMenu) {
delete selectedItemsInMidMenu[id];
$midmenuItem1.find("#content").removeClass("selected");
}
}
}
});
var $midmenuItem = $("#midmenu_item");
function listMidMenuItems(leftmenuId, commandString, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSP, toMidmenu, toRightPanel) {
$("#"+leftmenuId).bind("click", function(event) {
if(selected_leftmenu_id != null && selected_leftmenu_id.length > 0)
$("#"+selected_leftmenu_id).removeClass("selected");
selected_leftmenu_id = leftmenuId;
$(this).addClass("selected");
$("#midmenu_container").selectable("destroy" ); //midmenu doesn't need multiple selection
clearLeftMenu();
clearMidMenu();
$("#right_panel").load(rightPanelJSP, function(){
afterLoadRightPanelJSP();
$("#right_panel_content #tab_content_details #action_message_box #close_button").bind("click", function(event){
$(this).parent().hide();
return false;
});
afterLoadRightPanelJSP();
$.ajax({
cache: false,
data: createURL("command="+commandString+"&pagesize="+midmenuItemCount),
@ -59,7 +48,19 @@ $(document).ready(function() {
for(var i=0; i<items.length;i++) {
var $midmenuItem1 = $midmenuItem.clone();
$midmenuItem1.data("toRightPanelFn", toRightPanel);
toMidmenu(items[i], $midmenuItem1);
toMidmenu(items[i], $midmenuItem1);
$midmenuItem1.bind("click", function(event){
var thisMidmenuItem = $(this);
if(selected_midmenu_id != null && selected_midmenu_id.length > 0)
$("#"+selected_midmenu_id).find("#content").removeClass("selected");
selected_midmenu_id = ("midmenuItem_"+thisMidmenuItem.data("jsonObj").id);
thisMidmenuItem.find("#content").addClass("selected");
clearRightPanel();
toRightPanel(thisMidmenuItem);
return false;
});
$("#midmenu_container").append($midmenuItem1.show());
}
}
@ -75,6 +76,7 @@ $(document).ready(function() {
listMidMenuItems("leftmenu_volume", "listVolumes", "listvolumesresponse", "volume", "jsp/volume.jsp", afterLoadVolumeJSP, volumeToMidmenu, volumeToRigntPanel);
listMidMenuItems("leftmenu_snapshot", "listSnapshots", "listsnapshotsresponse", "snapshot", "jsp/snapshot.jsp", afterLoadSnapshotJSP, snapshotToMidmenu, snapshotToRigntPanel);
listMidMenuItems("leftmenu_ip", "listPublicIpAddresses", "listpublicipaddressesresponse", "publicipaddress", "jsp/ip_address.jsp", afterLoadIpJSP, ipToMidmenu, ipToRigntPanel);
listMidMenuItems("leftmenu_router", "listRouters", "listroutersresponse", "router", "jsp/router.jsp", afterLoadRouterJSP, routerToMidmenu, routerToRigntPanel);
listMidMenuItems("leftmenu_submenu_my_template", "listTemplates&templatefilter=self", "listtemplatesresponse", "template", "jsp/template.jsp", afterLoadTemplateJSP, templateToMidmenu, templateToRigntPanel);
listMidMenuItems("leftmenu_submenu_featured_template", "listTemplates&templatefilter=featured", "listtemplatesresponse", "template", "jsp/template.jsp", afterLoadTemplateJSP, templateToMidmenu, templateToRigntPanel);

View File

@ -1,4 +1,33 @@
function clickInstanceGroupHeader($arrowIcon) {
//midmenu needs multiple-selection for actions like start VM, stop VM, reboot VM.
$("#midmenu_container").selectable({
selecting: function(event, ui) {
if(ui.selecting.id.indexOf("midmenuItem") != -1) {
var $midmenuItem1 = $("#"+ui.selecting.id);
if($midmenuItem1.find("#content").hasClass("inaction") == false) { //only items not in action are allowed to be selected
var id =$midmenuItem1.data("jsonObj").id;
selectedItemsInMidMenu[id] = $midmenuItem1;
$midmenuItem1.find("#content").addClass("selected");
}
clearRightPanel();
var toRightPanelFn = $midmenuItem1.data("toRightPanelFn");
toRightPanelFn($midmenuItem1);
}
},
unselecting: function(event, ui) {
if(ui.unselecting.id.indexOf("midmenuItem") != -1) {
var $midmenuItem1 = $("#"+ui.unselecting.id);
var id = $midmenuItem1.data("jsonObj").id;
if(id in selectedItemsInMidMenu) {
delete selectedItemsInMidMenu[id];
$midmenuItem1.find("#content").removeClass("selected");
}
}
}
});
//***** VM Detail (begin) ******************************************************************************
var $vmPopup
var $rightPanelHeader;
@ -508,12 +537,17 @@ function clickInstanceGroupHeader($arrowIcon) {
}
for(var i=0; i < instanceGroupArray.length; i++) {
if(instanceGroupArray[i]!=null && instanceGroupArray[i].length>0) {
var $leftmenuSubmenuTemplate = $("#leftmenu_submenu_template").clone().show();
var $leftmenuSubmenuTemplate = $("#leftmenu_submenu_template").clone().show();
$leftmenuSubmenuTemplate.attr("id", ("leftmenu_instance_group_"+i));
$leftmenuSubmenuTemplate.find("#submenu_name").text(instanceGroupArray[i]);
$leftmenuSubmenuTemplate.find("#icon").attr("src", "images/instance_leftmenuicon.png").show();
$leftmenuSubmenuTemplate.bind("click", function(event) {
//$(this).removeClass("leftmenu_content").addClass("leftmenu_content_selected");
if(selected_leftmenu_id != null && selected_leftmenu_id.length > 0)
$("#"+selected_leftmenu_id).removeClass("selected");
selected_leftmenu_id = $(this).attr("id");
$(this).addClass("selected");
$("#midmenu_container").empty();
selectedItemsInMidMenu = {};

View File

@ -518,6 +518,14 @@ function setBooleanField(value, $field) {
else
$field.find("#icon").removeClass("tick_icon").addClass("cross_icon").show();
}
function clearLeftMenu() {
var $arrowIcon = $("#leftmenu_instance_group_header #arrow_icon");
if($arrowIcon.hasClass("open") == true) {
$arrowIcon.removeClass("open").addClass("close");
$("#leftmenu_instance_group_container").empty();
}
}
function clearMidMenu() {
$("#midmenu_container").empty();
@ -529,6 +537,9 @@ function clearRightPanel() {
$("#right_panel_content #action_message_box").hide();
}
var selected_leftmenu_id = null;
var selected_midmenu_id = null;

View File

@ -0,0 +1,95 @@
function afterLoadRouterJSP() {
}
function routerAfterDetailsTabAction(jsonObj) {
$("#midmenuItem_"+jsonObj.id).data("jsonObj", jsonObj);
routerJsonToDetailsTab(jsonObj);
}
function routerToMidmenu(jsonObj, $midmenuItem1) {
$midmenuItem1.attr("id", ("midmenuItem_"+jsonObj.id));
$midmenuItem1.data("jsonObj", jsonObj);
/*
var $iconContainer = $midmenuItem1.find("#icon_container").show();
$iconContainer.find("#icon").attr("src", "images/midmenuicon_routers_info.png");
*/
$midmenuItem1.find("#first_row").text(jsonObj.name.substring(0,25));
$midmenuItem1.find("#second_row").text(jsonObj.publicip.substring(0,25));
}
function routerToRigntPanel($midmenuItem) {
var jsonObj = $midmenuItem.data("jsonObj");
routerJsonToDetailsTab(jsonObj);
}
function routerJsonToDetailsTab(jsonObj) {
var $detailsTab = $("#right_panel_content #tab_content_details");
$detailsTab.data("jsonObj", jsonObj);
$detailsTab.find("#state").text(fromdb(jsonObj.state));
$detailsTab.find("#zonename").text(fromdb(jsonObj.zonename));
$detailsTab.find("#name").text(fromdb(jsonObj.name));
$detailsTab.find("#publicip").text(fromdb(jsonObj.publicip));
$detailsTab.find("#privateip").text(fromdb(jsonObj.privateip));
$detailsTab.find("#guestipaddress").text(fromdb(jsonObj.guestipaddress));
$detailsTab.find("#hostname").text(fromdb(jsonObj.hostname));
$detailsTab.find("#networkdomain").text(fromdb(jsonObj.networkdomain));
$detailsTab.find("#account").text(fromdb(jsonObj.account));
setDateField(jsonObj.created, $detailsTab.find("#created"));
var $actionLink = $detailsTab.find("#action_link");
$actionLink.bind("mouseover", function(event) {
$(this).find("#action_menu").show();
return false;
});
$actionLink.bind("mouseout", function(event) {
$(this).find("#action_menu").hide();
return false;
});
var $actionMenu = $actionLink.find("#action_menu");
$actionMenu.find("#action_list").empty();
if (jsonObj.state == 'Running') {
//template.find(".grid_links").find("#router_action_stop_container, #router_action_reboot_container, #router_action_view_console_container").show();
buildActionLinkForDetailsTab("Stop Router", routerActionMap, $actionMenu, routerListAPIMap);
buildActionLinkForDetailsTab("Reboot Router", routerActionMap, $actionMenu, routerListAPIMap);
//buildActionLinkForDetailsTab("View Console", routerActionMap, $actionMenu, routerListAPIMap);
}
else if (jsonObj.state == 'Stopped') {
//template.find(".grid_links").find("#router_action_start_container").show();
buildActionLinkForDetailsTab("Start Router", routerActionMap, $actionMenu, routerListAPIMap);
}
}
var routerListAPIMap = {
listAPI: "listRouters",
listAPIResponse: "listroutersresponse",
listAPIResponseObj: "router"
};
var routerActionMap = {
"Stop Router": {
api: "stopRouter",
isAsyncJob: true,
asyncJobResponse: "stoprouterresponse",
inProcessText: "Stopping Router....",
afterActionSeccessFn: routerAfterDetailsTabAction
},
"Start Router": {
api: "startRouter",
isAsyncJob: true,
asyncJobResponse: "startrouterresponse",
inProcessText: "Starting Router....",
afterActionSeccessFn: routerAfterDetailsTabAction
},
"Reboot Router": {
api: "rebootRouter",
isAsyncJob: true,
asyncJobResponse: "rebootrouterresponse",
inProcessText: "Rebooting Router....",
afterActionSeccessFn: routerAfterDetailsTabAction
}
}

View File

@ -1,5 +1,13 @@
function afterLoadTemplateJSP() {
function afterLoadTemplateJSP() {
$("#edit_icon").bind("click", function(event){
var $rightPanelContent = $("#right_panel_content");
$rightPanelContent.find("#name").hide();
$rightPanelContent.find("#name_edit").show();
$rightPanelContent.find("#displaytext").hide();
$rightPanelContent.find("#displaytext_edit").show();
$(this).hide();
return false;
});
}
function templateToMidmenu(jsonObj, $midmenuItem1) {
@ -26,8 +34,12 @@ function templateToRigntPanel($midmenuItem) {
var $rightPanelContent = $("#right_panel_content");
$rightPanelContent.find("#id").text(fromdb(jsonObj.id));
$rightPanelContent.find("#zonename").text(fromdb(jsonObj.zonename));
$rightPanelContent.find("#name").text(fromdb(jsonObj.name));
$rightPanelContent.find("#name_edit").val(fromdb(jsonObj.name));
$rightPanelContent.find("#displaytext").text(fromdb(jsonObj.displaytext));
$rightPanelContent.find("#displaytext_edit").val(fromdb(jsonObj.displaytext));
var status = "Ready";
if (jsonObj.isready == "false")

View File

@ -19,12 +19,7 @@ function afterLoadVolumeJSP() {
}
}
}
});
$("#right_panel_content #tab_content_details #action_message_box #close_button").bind("click", function(event){
$(this).parent().hide();
return false;
});
});
}
function volumeAfterDetailsTabAction(jsonObj) {
@ -69,17 +64,17 @@ function volumeJsonToDetailsTab(jsonObj){
setDateField(jsonObj.created, $detailsTab.find("#created"));
var $actionLink = $detailsTab.find("#volume_action_link");
var $actionLink = $detailsTab.find("#action_link");
$actionLink.bind("mouseover", function(event) {
$(this).find("#volume_action_menu").show();
$(this).find("#action_menu").show();
return false;
});
$actionLink.bind("mouseout", function(event) {
$(this).find("#volume_action_menu").hide();
$(this).find("#action_menu").hide();
return false;
});
var $actionMenu = $actionLink.find("#volume_action_menu");
var $actionMenu = $actionLink.find("#action_menu");
$actionMenu.find("#action_list").empty();
if(jsonObj.type=="ROOT") { //"create template" is allowed(when stopped), "detach disk" is disallowed.
if (jsonObj.vmstate == "Stopped")