mirror of
https://github.com/apache/cloudstack.git
synced 2025-12-16 10:32:34 +01:00
Merge branch 'master' of ssh://git.cloud.com/var/lib/git/cloudstack-oss
This commit is contained in:
commit
7d2a927973
@ -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
|
||||
|
||||
@ -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"/>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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() {
|
||||
}
|
||||
|
||||
|
||||
6
core/src/com/cloud/event/EventTypes.java
Normal file → Executable file
6
core/src/com/cloud/event/EventTypes.java
Normal file → Executable file
@ -88,6 +88,9 @@ public class EventTypes {
|
||||
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_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";
|
||||
|
||||
@ -2237,4 +2237,17 @@ public interface ManagementServer {
|
||||
|
||||
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
1
core/src/com/cloud/storage/StorageManager.java
Normal file → Executable 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);
|
||||
}
|
||||
|
||||
@ -166,7 +166,6 @@ public abstract class StorageResource extends ServerResourceBase implements Serv
|
||||
}
|
||||
|
||||
private Answer execute(UploadCommand cmd) {
|
||||
s_logger.warn(" Nitin got the cmd " +cmd);
|
||||
return _uploadManager.handleUploadCommand(cmd);
|
||||
}
|
||||
|
||||
|
||||
7
core/src/com/cloud/storage/Upload.java
Normal file
7
core/src/com/cloud/storage/Upload.java
Normal 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}
|
||||
}
|
||||
219
core/src/com/cloud/storage/UploadVO.java
Executable file
219
core/src/com/cloud/storage/UploadVO.java
Executable 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;
|
||||
}
|
||||
|
||||
}
|
||||
55
core/src/com/cloud/storage/VMTemplateHostVO.java
Normal file → Executable file
55
core/src/com/cloud/storage/VMTemplateHostVO.java
Normal file → Executable file
@ -61,9 +61,6 @@ 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;
|
||||
|
||||
@ -71,25 +68,15 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
|
||||
@Enumerated(EnumType.STRING)
|
||||
private Status downloadState;
|
||||
|
||||
@Column (name="upload_state")
|
||||
@Enumerated(EnumType.STRING)
|
||||
private Status uploadState;
|
||||
|
||||
@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;
|
||||
|
||||
@ -280,43 +264,4 @@ public class VMTemplateHostVO implements VMTemplateStorageResourceAssoc {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
15
core/src/com/cloud/storage/dao/UploadDao.java
Normal file
15
core/src/com/cloud/storage/dao/UploadDao.java
Normal 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);
|
||||
|
||||
}
|
||||
74
core/src/com/cloud/storage/dao/UploadDaoImpl.java
Executable file
74
core/src/com/cloud/storage/dao/UploadDaoImpl.java
Executable 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);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
@ -44,9 +44,6 @@ public interface VMTemplateHostDao extends GenericDao<VMTemplateHostVO, Long> {
|
||||
|
||||
void update(VMTemplateHostVO instance);
|
||||
|
||||
void updateUploadStatus(long hostId, long templateId, int uploadPercent, Status uploadState,
|
||||
String jobId, String uploadUrl );
|
||||
|
||||
List<VMTemplateHostVO> listByTemplateStatus(long templateId, VMTemplateHostVO.Status downloadState);
|
||||
|
||||
List<VMTemplateHostVO> listByTemplateStatus(long templateId, long datacenterId, VMTemplateHostVO.Status downloadState);
|
||||
@ -59,5 +56,4 @@ public interface VMTemplateHostDao extends GenericDao<VMTemplateHostVO, Long> {
|
||||
|
||||
boolean templateAvailable(long templateId, long hostId);
|
||||
|
||||
List<VMTemplateHostVO> listByTemplateUploadStatus(long templateId,Status UploadState);
|
||||
}
|
||||
|
||||
@ -50,26 +50,17 @@ 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 = ? "
|
||||
"UPDATE type_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 = ?";
|
||||
+ "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=? "
|
||||
+ " and t.template_id=? and t.download_state=?" ;
|
||||
@ -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();
|
||||
@ -114,11 +102,6 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
||||
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();
|
||||
|
||||
TemplateStatesSearch = createSearchBuilder();
|
||||
TemplateStatesSearch.and("template_id", TemplateStatesSearch.entity().getTemplateId(), SearchCriteria.Op.EQ);
|
||||
TemplateStatesSearch.and("states", TemplateStatesSearch.entity().getDownloadState(), SearchCriteria.Op.IN);
|
||||
@ -151,27 +134,6 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
SearchCriteria<VMTemplateHostVO> sc = HostSearch.create();
|
||||
@ -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) {
|
||||
|
||||
@ -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)
|
||||
@ -91,16 +91,15 @@ public class FtpTemplateUploader implements TemplateUploader {
|
||||
}
|
||||
}
|
||||
status = TemplateUploader.Status.UPLOAD_FINISHED;
|
||||
s_logger.warn("Nitin in FtpTemplateUploader " +status);
|
||||
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
|
||||
{
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,21 +295,10 @@ 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;
|
||||
@ -318,7 +308,7 @@ public class UploadManagerImpl implements UploadManager {
|
||||
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
2
server/src/com/cloud/api/BaseCmd.java
Normal file → Executable 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"),
|
||||
|
||||
@ -49,6 +49,7 @@ public class AssociateIPAddrCmd extends BaseCmd {
|
||||
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.ONE_TO_ONE_NAT, Boolean.FALSE));
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
|
||||
92
server/src/com/cloud/api/commands/ExtractIsoCmd.java
Normal file
92
server/src/com/cloud/api/commands/ExtractIsoCmd.java
Normal 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;
|
||||
}
|
||||
}
|
||||
5
server/src/com/cloud/api/commands/ExtractTemplateCmd.java
Normal file → Executable file
5
server/src/com/cloud/api/commands/ExtractTemplateCmd.java
Normal file → Executable 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://")){
|
||||
|
||||
86
server/src/com/cloud/api/commands/ExtractVolumeCmd.java
Normal file
86
server/src/com/cloud/api/commands/ExtractVolumeCmd.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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");
|
||||
|
||||
@ -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;
|
||||
@ -4800,6 +4802,48 @@ public class ManagementServerImpl implements ManagementServer {
|
||||
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
3
server/src/com/cloud/storage/StorageManagerImpl.java
Normal file → Executable 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) {
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
83
server/src/com/cloud/storage/upload/UploadListener.java
Normal file → Executable file
83
server/src/com/cloud/storage/upload/UploadListener.java
Normal file → Executable 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;
|
||||
@ -80,11 +83,10 @@ public class UploadListener implements Listener {
|
||||
|
||||
|
||||
private HostVO sserver;
|
||||
private VMTemplateVO template;
|
||||
|
||||
private boolean uploadActive = true;
|
||||
|
||||
private VMTemplateHostDao vmTemplateHostDao;
|
||||
private UploadDao uploadDao;
|
||||
|
||||
private final UploadMonitorImpl uploadMonitor;
|
||||
|
||||
@ -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) {
|
||||
public UploadListener(HostVO host, Timer _timer, UploadDao uploadDao,
|
||||
Long uploadId, UploadMonitorImpl uploadMonitor, UploadCommand cmd,
|
||||
Long accountId, String typeName, Type type) {
|
||||
this.sserver = host;
|
||||
this.template = template;
|
||||
this.vmTemplateHostDao = dao;
|
||||
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) {
|
||||
|
||||
116
server/src/com/cloud/storage/upload/UploadMonitorImpl.java
Normal file → Executable file
116
server/src/com/cloud/storage/upload/UploadMonitorImpl.java
Normal file → Executable 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
|
||||
@ -67,8 +74,6 @@ public class UploadMonitorImpl implements UploadMonitor {
|
||||
@Inject
|
||||
HostDao _serverDao = null;
|
||||
@Inject
|
||||
private final DataCenterDao _dcDao = null;
|
||||
@Inject
|
||||
VMTemplateDao _templateDao = null;
|
||||
@Inject
|
||||
private final EventDao _eventDao = null;
|
||||
@ -84,7 +89,7 @@ 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
|
||||
@ -92,34 +97,71 @@ public class UploadMonitorImpl implements UploadMonitor {
|
||||
// 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);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void extractTemplate( VMTemplateVO template, String url,
|
||||
VMTemplateHostVO vmTemplateHost,Long dataCenterId){
|
||||
public void extractVolume(VolumeVO volume, String url, Long dataCenterId, String installPath){
|
||||
|
||||
if (isTemplateUploadInProgress(template.getId()) ){
|
||||
if ( isTypeUploadInProgress(volume.getId(), Type.VOLUME) ){
|
||||
return;
|
||||
}
|
||||
|
||||
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 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){
|
||||
|
||||
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);
|
||||
|
||||
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 {
|
||||
}*/
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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
4
setup/db/create-index-fk.sql
Normal file → Executable 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;
|
||||
|
||||
@ -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`)
|
||||
|
||||
@ -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;
|
||||
|
||||
BIN
ui/new/images/gridbot_actionbutton.gif
Normal file
BIN
ui/new/images/gridbot_actionbutton.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 549 B |
BIN
ui/new/images/gridbot_actionbutton_hover.gif
Normal file
BIN
ui/new/images/gridbot_actionbutton_hover.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 547 B |
@ -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>
|
||||
|
||||
@ -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>
|
||||
<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 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_actionpanel">
|
||||
<div class="grid_actionbox">
|
||||
<div class="grid_actionsdropdown_box" style="display:none;">
|
||||
<ul class="actionsdropdown_boxlist" id="action_list">
|
||||
<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>
|
||||
<div class="grid_editbox"></div>
|
||||
<div class="gridheader_loaderbox" style="border:1px solid #999; display:none;">
|
||||
<div class="gridheader_loader"></div>
|
||||
<p>Detaching Disk …</p>
|
||||
</div>
|
||||
|
||||
<div class="gridheader_message" style="border:1px solid #999; display:block;">
|
||||
<p>Disk has been succesfully dettached …</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 …</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 class="grid_editbox">
|
||||
</div>
|
||||
<div class="grid_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="id">
|
||||
<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 …</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_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 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>
|
||||
</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 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("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 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>
|
||||
<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 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>
|
||||
<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 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 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 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>
|
||||
<div class="grid_rows even">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
<%=t.t("State")%>:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="state">
|
||||
<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) -->
|
||||
@ -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);
|
||||
%>
|
||||
|
||||
@ -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);
|
||||
%>
|
||||
|
||||
@ -1,26 +1,25 @@
|
||||
<%@ 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>
|
||||
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 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 class="content_tabs off">
|
||||
@ -28,298 +27,355 @@
|
||||
<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 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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles">
|
||||
<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 …</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_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 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 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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<div class="grid_rows odd">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
Allocated:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles">
|
||||
<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>
|
||||
<!-- 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>
|
||||
<!-- 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_header_cell" style="width:20%">
|
||||
<div class="grid_header_title">Private Port</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_header_cell" style="width:29%">
|
||||
<div class="grid_header_title">Protocol</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 …</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid_header_cell" style="width:30%; border:none;">
|
||||
<div class="grid_header_title">Instance</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 …</p>
|
||||
</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 …</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 …</p>
|
||||
</div>
|
||||
</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 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_header_cell" style="width:20%">
|
||||
<div class="grid_header_title">Public Port</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_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 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_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 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 …</p>
|
||||
</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 …</p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<!-- Load Balancer ends here-->
|
||||
</div>
|
||||
|
||||
@ -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>
|
||||
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 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 odd">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
<%=t.t("ID")%>:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="id">
|
||||
<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 …</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_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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<div class="grid_rows odd">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
<%=t.t("Bootable")%>:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="bootable">
|
||||
<div id="icon">
|
||||
<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 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) -->
|
||||
159
ui/new/jsp/router.jsp
Normal file
159
ui/new/jsp/router.jsp
Normal 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 …</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) -->
|
||||
@ -1,101 +1,124 @@
|
||||
<!--
|
||||
<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>
|
||||
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 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 odd">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
<%=t.t("ID")%>:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="id">
|
||||
<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 …</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_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="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("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 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>
|
||||
<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 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>
|
||||
<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 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>
|
||||
<div class="grid_rows odd">
|
||||
<div class="grid_row_cell" style="width: 20%;">
|
||||
<div class="row_celltitles">
|
||||
<%=t.t("Domain")%>:</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_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="domain">
|
||||
<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>
|
||||
|
||||
@ -1,171 +1,205 @@
|
||||
<!--
|
||||
<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 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 class="grid_row_cell" style="width: 79%;">
|
||||
<div class="row_celltitles" id="id">
|
||||
<div class="grid_editbox" id="edit_icon">
|
||||
</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 …</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_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 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 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("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>
|
||||
</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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -16,38 +16,27 @@ $(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(){
|
||||
|
||||
$("#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),
|
||||
@ -60,6 +49,18 @@ $(document).ready(function() {
|
||||
var $midmenuItem1 = $midmenuItem.clone();
|
||||
$midmenuItem1.data("toRightPanelFn", toRightPanel);
|
||||
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);
|
||||
|
||||
@ -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;
|
||||
@ -509,11 +538,16 @@ 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();
|
||||
$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 = {};
|
||||
|
||||
|
||||
@ -519,6 +519,14 @@ function setBooleanField(value, $field) {
|
||||
$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();
|
||||
$("#midmenu_action_link").hide();
|
||||
@ -529,6 +537,9 @@ function clearRightPanel() {
|
||||
$("#right_panel_content #action_message_box").hide();
|
||||
}
|
||||
|
||||
var selected_leftmenu_id = null;
|
||||
var selected_midmenu_id = null;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
95
ui/new/scripts/cloud.core2.router.js
Normal file
95
ui/new/scripts/cloud.core2.router.js
Normal 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
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,13 @@
|
||||
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")
|
||||
|
||||
@ -20,11 +20,6 @@ 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")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user