Authored by xuhui

腾讯云伸缩

package com.ui.cloud;
import lombok.Data;
/**
* 修改伸缩组的通用请求参数
* Created by xh on 2017/5/10.
*/
@Data
public class CommAutoModifyScalingGroupReq {
/**
* 云类型
* 1:亚马逊
* 2:腾讯
*/
private int cloudType;
/**
* 各个云的请求参数有可能不一样,所以分开
* 腾讯云
*/
private QcloudModifyScalingGroupReq qCloudParms;
//亚马逊云
}
\ No newline at end of file
... ...
package com.ui.cloud;
import lombok.Data;
/**
* 接口:ModifyScalingGroup
* 请求参数
* Created by xh on 2017/5/10.
*/
@Data
public class QcloudModifyScalingGroupReq {
/**
* 必填
* 待修改的伸缩组Id
*/
private String scalingGroupId;
/**
* 必填
* 修改后的伸缩组的最小伸缩数,即伸缩组内最小CVM实例数,范围0-30,且不大于maxSize。当伸缩组CVM实例数小于minSize时,AS会自动添加CVM实例,使得伸缩组内的当前实例数等于minSize
*/
private int minSize;
/**
* 必填
* 修改后的伸缩组的最大伸缩数,即伸缩组内最大CVM实例数,范围0-30,不小于minSize。当伸缩组CVM实例数大于maxSize时,AS会自动移出CVM实例,使得伸缩组内的当前实例数等于maxSize
*/
private int maxSize;
/**
* 必填
* 伸缩组的移除策略。只有两种取值:RemoveOldestInstance,表示移除最旧策略,即当需要移除实例时,移除最先加入伸缩组的实例;RemoveNewestInstance,表示移除最新策略,即当需要移除实例时,移除最后加入伸缩组的实例
* 默认:RemoveNewestInstance
*/
private String removePolicy = "RemoveNewestInstance";
/**
* 不是必填
* 用户定义的伸缩组名称,若不传,表示不修改名称
*/
private String scalingGroupName;
/**
* 不用填
* 修改当前伸缩组绑定的启动配置。修改之后,余量子机使用的是替换之前的配置,增量子机使用的是新替换的配置。若不传,表示不修改原有的启动配置
*/
private String scalingConfigurationId;
/**
* 不必填
* 期望实例数,期望实例数是指伸缩组当前合理的实例数量,大小介于最小实例数和最大实例数之间, 它的值可以被手动调整,当定时任务和告警伸缩任务触发时也会被调整。伸缩组会自动调整实际实例数, 使之与期望实例数相等
*/
private int desiredCapacity;
}
\ No newline at end of file
... ...
... ... @@ -267,7 +267,22 @@ public class HttpUriContants {
public static final String GET_ALARMGROUP_GET_ALL = "/alarmGroup/getAllAlarmGroup";
/**
* 亚马逊云信息查询
* 云伸缩组信息查询
*/
public static final String GET_AWS_AUTOSCALING_CONFIG = "/aws/autoScalingConfig";
public static final String GET_CLOUD_AUTOSCALING_CONFIG = "/cloud/getAutoScalingConfig";
/**
* 修改伸缩组信息
*/
public static final String GET_CLOUD_MODIFY_SCALING_GROUP = "/cloud/modifyScalingGroup";
/**
* 腾讯云:修改伸缩组后的下一个流程是查询伸缩活动
* 亚马逊云待定
*/
public static final String GET_CLOUD_DESCRIBE_SCALING_ACTIVITY = "/cloud/describeScalingActivity";
/**
* 腾讯云:根据实例id获取内网ip等信息
* 亚马逊云待定
*/
public static final String GET_QCLOUD_DESCRIBE_INSTANCES = "/cloud/describeInstances";
}
\ No newline at end of file
... ...
package com.ui.ctrl;
import com.ui.cloud.CommAutoModifyScalingGroupReq;
import com.ui.cloud.QcloudModifyScalingGroupReq;
import com.ui.contants.HttpUriContants;
import com.ui.http.HttpRestClient;
import com.ui.model.BaseResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
/**
* 亚马逊云 腾讯云 伸缩组操作
* Created by xh on 2017/5/9.
*/
@Controller
@RequestMapping("autoScalingTool")
public class AutoScalingCtrl {
@Autowired
private HttpRestClient httpClient;
/**
* 跳转到页面
* @param model
* @return
*/
@RequestMapping("/toautoscalingpage")
public ModelAndView toAutoScalingPage(Model model) {
return new ModelAndView("manager/autoscaling");
}
/**
* 显示配置信息
* @param cloudType 云类型 1:AWS 2:QCLOUD
* @return
*/
@RequestMapping("/autoscalingconfig")
@ResponseBody
public BaseResponse<?> autoScalingConfig(int cloudType) {
BaseResponse<?> response = httpClient.defaultPost(
HttpUriContants.GET_CLOUD_AUTOSCALING_CONFIG + "?cloudType="+cloudType, null,
BaseResponse.class);
return response;
}
/**
* 显示配置信息
* @param qCloudReq 修改的相关参数,暂时只用了腾讯云的,日后考虑亚马逊的
* @return
*/
@RequestMapping("/modifyScalingGroup")
@ResponseBody
public BaseResponse<?> modifyScalingGroup(QcloudModifyScalingGroupReq qCloudReq, int cloudType) {
CommAutoModifyScalingGroupReq req = new CommAutoModifyScalingGroupReq();
req.setCloudType(cloudType);
req.setQCloudParms(qCloudReq);
BaseResponse<?> response = httpClient.defaultPost(
HttpUriContants.GET_CLOUD_MODIFY_SCALING_GROUP, req, BaseResponse.class);
return response;
}
/**
* 腾讯云:修改伸缩组后的下一个流程是查询伸缩活动
* 亚马逊云:修改伸缩组后的下一个流程待定,因为不清楚
* @param scalingGroupId 待查询的伸缩组Id
* @param startTime 开始时间,如果不填,则默认是当前时间前10秒之后发生的活动
* @return
*/
@RequestMapping("/describeScalingActivity")
@ResponseBody
public BaseResponse<?> describeScalingActivity(String scalingGroupId, String startTime){
String url = String.format(HttpUriContants.GET_CLOUD_DESCRIBE_SCALING_ACTIVITY+"?scalingGroupId=%s&startTime=%s",scalingGroupId,startTime);
BaseResponse<?> response = httpClient.defaultPost(url, null, BaseResponse.class);
return response;
}
/**
* 腾讯云:根据实例id获取内网ip
* 亚马逊云待定:不清楚流程
* @param ids 实例id集合
* @return
*/
@RequestMapping("/getQcloudDescribeInstances")
@ResponseBody
public BaseResponse<?> getQcloudDescribeInstances(String ids){
String url = String.format(HttpUriContants.GET_QCLOUD_DESCRIBE_INSTANCES+"?instanceIds=%s",ids);
BaseResponse<?> response = httpClient.defaultPost(url, null, BaseResponse.class);
return response;
}
}
\ No newline at end of file
... ...
package com.ui.ctrl;
import com.ui.contants.HttpUriContants;
import com.ui.http.HttpRestClient;
import com.ui.model.BaseResponse;
import com.ui.model.req.AwsSnsReq;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
/**
* Created by hui.xu on 2017/5/2.
* 亚马逊云订阅
*/
@Controller
@RequestMapping("awsapi")
public class AwsController {
/**
* 日志接口
*/
private Logger logger = LoggerFactory.getLogger(getClass());
private static final String AWS_SNS_HEAD_TYPE = "x-amz-sns-message-type";
... ... @@ -36,16 +26,12 @@ public class AwsController {
private static final String NEED_TO_DEAL_WITH_TYPE = "SubscriptionConfirmation";
@Autowired
private HttpRestClient httpClient;
@Autowired
private RestTemplate restTemplate;
/**
* 处理亚马逊订阅消息
*
* @param request 用于获取请求头
* @param req 用户获取请求json对象
* 通知
* @param request
* @param req
*/
@RequestMapping(value = "/sns")
public void awsSns(HttpServletRequest request, @RequestBody AwsSnsReq req) {
... ... @@ -69,7 +55,6 @@ public class AwsController {
return;
}
logger.info(" - AwsController - awsSns - subscribeURL is:" + subscribeURL);
//请求当前返回的Url
restTemplate.getForObject(subscribeURL, String.class);
logger.info(" - request - " + subscribeURL + " - success");
}else{
... ... @@ -79,24 +64,4 @@ public class AwsController {
logger.error(" - AwsController - awsSns - error", e);
}
}
/**
* 跳转到报警组管理页面
*
* @param model
* @return
*/
@RequestMapping("/toautoscalingpage")
public ModelAndView toAutoScalingPage(Model model) {
return new ModelAndView("manager/autoscaling");
}
@RequestMapping("/autoscalingconfig")
@ResponseBody
public BaseResponse<?> autoScalingConfig() {
BaseResponse<?> response = httpClient.defaultPost(
HttpUriContants.GET_AWS_AUTOSCALING_CONFIG, null,
BaseResponse.class);
return response;
}
}
\ No newline at end of file
... ...
... ... @@ -77,12 +77,29 @@
<a href="#" title="Go to Home" class="tip-bottom"><i class="icon-home"></i>Home</a> <a href="#" class="current">AutoScaling</a>
</div>
<div class="container-fluid">
<div id="autoscalingTable"
style="overflow-y: auto; overflow-x: hidden; max-height: 800px"/>
<div class="widget-box">
<div class="widget-title" style="height: 35px;">
<div>
<div class="form-inline" role="form" id="inBoxQueryDiv"
style="margin-left: 15px;float: left;">
<div class="input-group" style="float: left;">
<span class="input-group-addon">云类型:</span>
<select id="cloudType" name="cloudType" class="form-control" onchange="changeByCloudType()">
<option value="1">AWS</option>
<option value="2" selected = "selected">QCLOUD</option>
</select>
</div>
</div>
</div>
</div>
<div class="widget-content">
<div id="autoscalingTable"
style="overflow-y: auto; overflow-x: hidden; max-height: 800px"/>
</div>
</div>
</div>
</div>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" style="margin:0 auto;margin-top:100px;width: 600px" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" style="margin:0 auto;margin-top:20px;width: 600px" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content" style="width: 100%">
<div class="modal-header">
... ... @@ -93,25 +110,32 @@
<div class="modal-body">
<form id="hostGroupForm" class="form-horizontal">
<div class="form-group">
<label style="vertical-align: middle" class="col-sm-2 control-label">免于缩减的服务器台数:</label>
<label style="vertical-align: middle" class="col-sm-2 control-label">免于缩减的实例数:</label>
<div class="col-sm-8">
<input type="text" class="form-control" readonly="readonly" id="protectedFromCount" name="protectedFromCount" size="40" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">最少服务器台数:</label>
<label class="col-sm-2 control-label">最少实例数:</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="minSize" name="minSize" size="40"
onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">最多服务器台数:</label>
<label class="col-sm-2 control-label">最多实例数:</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="maxSize" name="maxSize" size="40"
onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">期望容量:</label>
<div class="col-sm-8">
<input type="text" class="form-control" id="desiredCapacity" name="desiredCapacity" size="40"
onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')" />
</div>
</div>
</form>
</div>
<div class="modal-footer">
... ... @@ -123,6 +147,28 @@
</div>
<!-- /.modal -->
</div>
<div class="modal fade" id="myModalMessage" tabindex="-1" role="dialog" style="margin:0 auto;margin-top:20px;width: 480px" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content" style="width: 480px">
<div class="modal-header">
<h4 class="modal-title" id="myModalMessageLabel"></h4>
</div>
<div class="modal-body" style="width: 480px">
<form id="messagehostGroupForm" class="">
<div class="form-group" style="margin-top: -10px">
<textarea id="resultScalingMessage" style="text-align: left; background-color: black; color: white;height:360px;width: 445px;"
readonly="readonly"></textarea>
</div>
</form>
</div>
<div class="modal-footer" style="width: 480px">
<button type="button" class="btn btn-danger" id="closeButton" disabled="disabled" data-dismiss="modal">关闭</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal -->
</div>
<script src="<%=basePath%>js/pagination.js"></script>
<script src="<%=basePath%>script/common/genarate_left_panel.js"></script>
... ...
... ... @@ -3,141 +3,427 @@ $(function() {
refreshAutosSalingTable();
});
// 刷新表格数据
//根据类型获取需要显示的列
function getColumns(){
var columns = [
{
title : "索引",
width : "50px",
formatter : function(value, rowData, rowIndex) {
return (rowIndex + 1);
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "组名",
field : "scalingGroupName",
width : "25%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "IP",
field : "ip",
width : "25%",
formatter : function(value, rowData, rowIndex) {
var instances = rowData.scalingInstancess;
if(instances == null || instances.length == 0){
return;
}
var ips = "";
for(var index = 0;index < instances.length;index++){
var protectedB = instances[index].protectedFrom;
var message = "";
if(protectedB != null && protectedB != undefined){
if("TRUE" == protectedB.toUpperCase()){
message = "免于缩减";
}
}
if(message != ""){
ips += "<font color='#FF0000'>" + instances[index].ip + ":" + message + "</font><br>";
}else{
ips += instances[index].ip + "<br>";
}
}
return ips;
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "期望容量",
field : "desiredCapacity",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "最少实例数",
field : "minSize",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "最多实例数",
field : "maxSize",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "操作",
width : "100px",
formatter : function(value, rowData, rowIndex) {
var div = $("<div>");
$("<button onclick=\"changeServer(\'"
+ rowData.scalingGroupId + "\',\'"
+ rowData.scalingGroupName + "\',\'"
+ rowData.protectedFromCount + "\',\'"
+ rowData.desiredCapacity + "\',\'"
+ rowData.minSize + "\',\'"
+ rowData.maxSize + "\')\">").addClass(
"btn btn-xs btn-success").html("扩充或缩减")
.appendTo(div);
return div;
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
} ];
return columns;
}
//刷新表格数据
function refreshAutosSalingTable() {
var columns = getColumns();
$("#autoscalingTable").table(
{
columnAutoWidth : false,
url : contextPath + "awsapi/autoscalingconfig",
url : contextPath + "autoScalingTool/autoscalingconfig?cloudType=" + $("#cloudType").val(),
striped : true,
title : "Auto Scaling 组集合",
loadFilter : function(data) {
return defaultLoadFilter(data);
},
columns : [
{
title : "索引",
width : "50px",
formatter : function(value, rowData, rowIndex) {
return (rowIndex + 1);
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "组名",
field : "autoScalingGroupName",
width : "25%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "IP",
field : "ip",
width : "25%",
formatter : function(value, rowData, rowIndex) {
var awsInstances = rowData.awsInstancess;
if(awsInstances == null || awsInstances.length == 0){
return;
}
var ips = "";
for(var index = 0;index < awsInstances.length;index++){
var protectedB = awsInstances[index].protectedFrom;
var message = "";
if(protectedB != null && protectedB != undefined){
if("TRUE" == protectedB.toUpperCase()){
message = "免于缩减";
}
}
if(message != ""){
ips += "<font color='#FF0000'>" + awsInstances[index].ip + ":" + message + "</font><br>";
}else{
ips += awsInstances[index].ip + "<br>";
}
}
return ips;
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "目前服务器台数",
field : "desiredCapacity",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "最少服务器台数",
field : "minSize",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "最多服务器台数",
field : "maxSize",
width : "10%",
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
},
{
title : "操作",
width : "100px",
formatter : function(value, rowData, rowIndex) {
var div = $("<div>");
$("<button onclick=\"changeServer(\'"
+ rowData.autoScalingGroupName + "\',\'"
+ rowData.protectedFromCount + "\',\'"
+ rowData.minSize + "\',\'"
+ rowData.maxSize + "\')\">").addClass(
"btn btn-xs btn-success").html("扩充或缩减")
.appendTo(div);
return div;
},
styler : function(value, rowData, rowIndex){
return {
"vertical-align" : "middle"
};
}
} ]
columns : columns
});
}
function changeServer(groupName, protectedFromCount, minSize, maxSize){
//修改前原始数据,用于判断是否需要调用修改接口
var scalingGroupName;
var souScalingGroupId;
var souProtectedFromCount;
var souDesiredCapacity;
var souMinSize;
var souMaxSize;
//修改伸缩组
function changeServer(scalingGroupId, groupName, protectedFromCount, desiredCapacity, minSize, maxSize){
scalingGroupName = groupName;
souScalingGroupId = scalingGroupId;
souProtectedFromCount = protectedFromCount;
souDesiredCapacity = desiredCapacity;
souMinSize = minSize;
souMaxSize = maxSize;
$("#myModalLabel").text("");
$("#protectedFromCount").val("");
$("#minSize").val("");
$("#maxSize").val("");
$("#desiredCapacity").val("");
$("#myModalLabel").text(groupName + " : 扩充或缩减");
$("#protectedFromCount").val(protectedFromCount);
$("#minSize").val(minSize);
$("#maxSize").val(maxSize);
$("#desiredCapacity").val(desiredCapacity);
$("#myModal").modal('show');
}
function changeOk(){
//异常处理
if(souScalingGroupId == "" || souScalingGroupId == undefined
|| souProtectedFromCount == "" || souProtectedFromCount == undefined
|| souMinSize == "" || souMinSize == undefined
|| souMaxSize == "" || souMaxSize == undefined
|| souDesiredCapacity == "" || souDesiredCapacity == undefined){
alert("异常,请重新点击 扩充或缩减 开始");
return;
}
//受保护的实例数
var protectedFromCount = $("#protectedFromCount").val();
//最少实例数,大于等于受保护的实例数
var minSize = $("#minSize").val();
//最多实例数
var maxSize = $("#maxSize").val();
//期望实例数,大于等于最小实例数 小于等于最多实例数
var desiredCapacity = $("#desiredCapacity").val();
alert("待续......");
if((protectedFromCount == souProtectedFromCount) && (minSize == souMinSize)
&& (maxSize == souMaxSize)
&& (desiredCapacity == souDesiredCapacity)){
alert("数据未做修改!");
$("#myModal").modal('hide');
return;
}
if(minSize < protectedFromCount){
alert("期望调整的最小实例数 小于 受保护的实例数!");
return;
}else if(maxSize < minSize){
alert("期望调整的最大实例数 小于 最小实例数!");
return;
}else if((desiredCapacity < minSize) || (desiredCapacity > maxSize)){
alert("期望调整的容量必须在最小和最大实例数之间,最大<=容量>=最小!");
return;
}
var showMessage;
if(desiredCapacity == souDesiredCapacity){
//基础信息修改,不涉及到缩容或者扩容
showMessage = "";
}else{
if(desiredCapacity < souDesiredCapacity){
showMessage = "缩容";
}else if(desiredCapacity > souDesiredCapacity){
showMessage = "扩容";
}
}
if(confirm("是否确定要执行!")){
$("#myModal").modal('hide');
var parms = {};
if(2 != $("#cloudType").val()){
alert("暂时只提供腾讯云的操作!");
return;
}else{
var qCloudParms = {};
parms.cloudType = parseInt($("#cloudType").val());
qCloudParms.scalingGroupId = souScalingGroupId;
qCloudParms.minSize = parseInt(minSize);
qCloudParms.maxSize = parseInt(maxSize);
qCloudParms.desiredCapacity = parseInt(desiredCapacity);
parms.qCloudParms = qCloudParms;
}
$.ajax({
url: '/autoScalingTool/modifyScalingGroup?cloudType=' + parseInt($("#cloudType").val()),
type: 'POST',
data: qCloudParms,
dataType: 'json',
success: function (data) {
if (!data || data.code != 200) {
alert('修改伸缩组失败:'+data.message);
}else{
if(showMessage == "" || showMessage == undefined){
alert("修改基础信息成功!");
clear_Sour();
return;
}
$("#myModalMessageLabel").text(scalingGroupName + ":正在 " + showMessage);
$("#myModalMessage").modal('show');
$("#myModalMessage").unbind("keyup");
$(".modal-backdrop").unbind("click");
//清空
$("#resultScalingMessage").html("");
$("#closeButton").attr("disabled","disabled");
refCloudMessage(showMessage, Math.abs(souDesiredCapacity - desiredCapacity));
}
},
error: function (data) {
alert('系统异常');
clear_Sour();
}
});
}
}
function clear_Sour(){
//清空
souProtectedFromCount = "";
souDesiredCapacity = "";
souMinSize = "";
souMaxSize = "";
}
//腾讯云:修改伸缩组后的下一个流程是查询伸缩活动
function refCloudMessage(showMessage, serverCount){
var timestamp = Date.parse(new Date());
var count = 0;
writeToText("开始..........");
var intervalIndex = setInterval(function() {
$.ajax({
url: '/autoScalingTool/describeScalingActivity?scalingGroupId=' + souScalingGroupId + '&startTime=' + timestamp,
type: 'POST',
dataType: 'json',
success: function (data) {
if (!data || data.code != 200) {
clearInterval(intervalIndex);
}else{
var returnJson = data.data[0];
if(showMessage == "缩容"){
if(returnJson.msg != "success"){
if(count == 0){
writeToText(returnJson.desciption);
}else{
writeToText("......");
}
}else{
writeToText("第 1 步:" + showMessage + " 成功!");
$("#closeButton").removeAttr("disabled");
clearInterval(intervalIndex);
unDeploy();
writeToText("结束..........");
return;
}
}else{
if(returnJson.succInsList == undefined || returnJson.succInsList.length != 2){
if(count == 0){
writeToText(returnJson.desciption);
}else{
writeToText("......");
}
}else{
writeToText("第 1 步:" + showMessage + " 成功!");
writeToText("...")
clearInterval(intervalIndex);
//扩容成功后执行
deploy(returnJson.succInsList);
writeToText("结束..........");
}
}
}
count += 1;
},
error: function (data) {
alert('系统异常');
}
});
}, 5000);
}
//写入消息
function writeToText(msg){
var d = $("#resultScalingMessage").val();
$("#resultScalingMessage").html(d + "&#13" + msg);
var scrollTop = $("#resultScalingMessage")[0].scrollHeight;
$("#resultScalingMessage").scrollTop(scrollTop);
}
//1:扩容成功后执行
function deploy(instanceIds){
if(instanceIds == undefined){
//发布完之后,显示关闭按钮
$("#closeButton").removeAttr("disabled");
return;
}
var instanceIdStr = "";
for (var i = 0; i < instanceIds.length; i ++) {
if(i == instanceIds.length - 1){
instanceIdStr += instanceIds[i];
}else{
instanceIdStr += instanceIds[i] + ",";
}
}
writeToText("实例ID为:" + instanceIdStr);
writeToText("正在通过实例ID获取实例的内网ip:请稍后...");
var ips = getIpByInstanceIds(instanceIdStr);
writeToText("第 2 步:获取内网成功!")
if(ips == undefined){
writeToText("系统异常,执行失败....");
deployLaster();
return;
}
writeToText("正在发布系统,请稍后...");
deployProject(ips);
writeToText("第 3 步:系统部署成功!");
deployLaster();
}
//发布成功和失败都执行
function deployLaster(){
//发布完之后,显示关闭按钮
$("#closeButton").removeAttr("disabled");
//成功后清空
clear_Sour();
}
//2:根据实例id获取内网ip地址
function getIpByInstanceIds(instanceIds){
var returnIps;
$.ajax({
url: '/autoScalingTool/getQcloudDescribeInstances?ids=' + instanceIds,
type: 'POST',
dataType: 'json',
async:false,
success: function (data) {
if (!data || data.code != 200) {
alert(data.message);
}else{
//组装内网ip
var dataJson = data.data;
if(dataJson == undefined){
writeToText("系统异常,执行失败....");
//发布完之后,显示关闭按钮
$("#closeButton").removeAttr("disabled");
return;
}
//展现
var ips = "";
for(var i = 0;i < dataJson.length;i++){
if(i == dataJson.length - 1){
ips += dataJson[i].lanIp;
}else{
ips += dataJson[i].lanIp + ",";
}
writeToText("实例id:" + dataJson[i].unInstanceId + " - ip:" + dataJson[i].lanIp);
}
returnIps = ips;
}
},
error: function (data) {
writeToText('系统异常!');
deployLaster();
}
});
return returnIps;
}
//3:根据ip发布项目
function deployProject(ips){
}
//缩容成功后执行
function unDeploy(){
//发布完之后,显示关闭按钮
$("#closeButton").removeAttr("disabled");
//成功后清空
clear_Sour();
}
function changeByCloudType(){
refreshAutosSalingTable();
}
\ No newline at end of file
... ...
... ... @@ -100,7 +100,7 @@ innerHTML += "<ul><li id='li_user'><a id='li_user_a' href=''>用户管理</a></l
innerHTML += "<li id='li_module'><a id='li_module_a' href=''>模块管理</a></li>";
innerHTML += "<li id='li_taskConfigure'><a id='li_taskConfigure_a' href=''>任务管理</a></li>";
innerHTML += "<li id='li_alarmgroup'><a id='li_alarmgroup_a' href=''>报警组管理</a></li>";
innerHTML += "<li id='li_autoscaling'><a id='li_autoscaling_a' href=''>AutoScaling</a></li>";
innerHTML += "<li id='li_autoscaling'><a id='li_autoscaling_a' href=''>伸缩组</a></li>";
innerHTML += "</ul></li>";
/*其他*/
... ... @@ -134,7 +134,7 @@ document.getElementById("li_user_a").setAttribute("href", path + "/manage/toUser
document.getElementById("li_module_a").setAttribute("href", path + "/manage/toModule");
document.getElementById("li_taskConfigure_a").setAttribute("href", path + "/taskConfigure/toTaskConfigure");
document.getElementById("li_alarmgroup_a").setAttribute("href", path + "/alarmGroup/toAlarmGroupPage");
document.getElementById("li_autoscaling_a").setAttribute("href", path + "/awsapi/toautoscalingpage");
document.getElementById("li_autoscaling_a").setAttribute("href", path + "/autoScalingTool/toautoscalingpage");
//document.getElementById("li_nginxswitch_a").setAttribute("href", path + "/nginxswitch/toNginxSwitch");
//document.getElementById("li_luaswitch_a").setAttribute("href", path + "/luaswitch/toLuaSwitch");
document.getElementById("li_projectHistory_a").setAttribute("href", path + "/project/toHistory");
... ...