guests_show.html 82 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710
  1. {% extends "layout.html" %}
  2. {% block head %}
  3. {{ super() }}
  4. <style type="text/css">
  5. @media (min-width: 768px) {
  6. .form-horizontal .control-label {
  7. text-align: left;
  8. }
  9. }
  10. label>span {
  11. color: deepskyblue;
  12. }
  13. .table {
  14. font-size: 12px;
  15. border-width: 1px;
  16. line-height: 20px;
  17. }
  18. .table > thead > tr > th,
  19. .table > tfoot > tr > th {
  20. color: #999999;
  21. font-weight: normal;
  22. border-bottom: 0 solid #e1e6eb;
  23. background-color: #F5F6FA;
  24. }
  25. .table > tbody > tr > td {
  26. color: #424547;
  27. }
  28. .table-bordered > tbody > tr {
  29. padding-top: 10px;
  30. padding-bottom: 10px;
  31. height: 106px;
  32. }
  33. .table-bordered > thead > tr > th,
  34. .table-bordered > tbody > tr > th,
  35. .table-bordered > tfoot > tr > th,
  36. .table-bordered > thead > tr > td,
  37. .table-bordered > tbody > tr > td,
  38. .table-bordered > tfoot > tr > td {
  39. border-style: solid;
  40. border-width: 1px 0 0 0;
  41. }
  42. .btn,
  43. .form-control,
  44. .form-group>div>div,
  45. .modal-content {
  46. border-radius: 0 !important;
  47. }
  48. .btn-shortcut {
  49. font-size: 12px !important;
  50. padding: 0 26px;
  51. }
  52. .show {
  53. display: inline-block !important;
  54. }
  55. .tr-selected td,
  56. .tr-selected {
  57. color: #000 !important;
  58. background: #fafaff !important;
  59. }
  60. .dropdown-menu {
  61. min-width: 100%;
  62. }
  63. .btn-ability {
  64. margin-right: 16px;
  65. height: 50px;
  66. padding: 8px 20px;
  67. margin-bottom: 30px;
  68. }
  69. .btn-ability-line {
  70. }
  71. </style>
  72. {% endblock head %}
  73. {% block content %}
  74. <script type="text/javascript">
  75. var page = 1;
  76. var page_size = 10;
  77. var keyword = '';
  78. var resource_path = window.location.pathname;
  79. var cur_url = resource_path;
  80. var show_real_password_for_renew = false;
  81. $(document).ready(function() {
  82. page_size = $('#page_size').val();
  83. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size;
  84. var last_ready = null;
  85. $('#content_search').keydown(function() {
  86. if (last_ready !== null) {
  87. clearTimeout(last_ready);
  88. }
  89. last_ready = setTimeout(function () {
  90. keyword = $('#content_search').val();
  91. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size;
  92. if (keyword.length > 0) {
  93. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size + '&keyword=' + keyword;
  94. }
  95. window.location.href=cur_url;
  96. }, 1000);
  97. });
  98. $('#page_size').change(function () {
  99. keyword = $('#content_search').val();
  100. page_size = $('#page_size').val();
  101. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size;
  102. if (keyword.length > 0) {
  103. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size + '&keyword=' + keyword;
  104. }
  105. window.location.href=cur_url;
  106. });
  107. $("thead").on('click', ".all_selector", function() {
  108. if ($("thead .all_selector").is(':checked')) {
  109. $("tbody tr").find('td input[type="checkbox"]:eq(0)').prop('checked', true);
  110. $(".all_selector").prop('checked', true);
  111. } else {
  112. $("tbody tr").find('td input[type="checkbox"]:eq(0)').prop('checked', false);
  113. $(".all_selector").prop('checked', false);
  114. }
  115. select_item_action();
  116. });
  117. $("tfoot").on('click', ".all_selector", function() {
  118. if ($("tfoot .all_selector").is(':checked')) {
  119. $("tbody tr").find('td input[type="checkbox"]:eq(0)').prop('checked', true);
  120. $(".all_selector").prop('checked', true);
  121. } else {
  122. $("tbody tr").find('td input[type="checkbox"]:eq(0)').prop('checked', false);
  123. $(".all_selector").prop('checked', false);
  124. }
  125. select_item_action();
  126. });
  127. $("tbody tr").on('click', "input[type='checkbox']", function() {
  128. select_item_action();
  129. });
  130. $('body').addClass('add-transition');
  131. $('.add-page-transition').on('click', function(){
  132. var transAttr = $(this).attr('data-transition');
  133. $('.add-transition').attr('class', 'add-transition');
  134. $('.add-transition').addClass(transAttr);
  135. });
  136. $('#edit_remark_modal').on('show.bs.modal', function (me) {
  137. $('#edit_remark_instance_uuid').val($(me.relatedTarget).parent().parent().prev().prev().text());
  138. $('#edit_remark').val($(me.relatedTarget).prev().text());
  139. });
  140. $('#migrate_host').chosen({
  141. "disable_search": true
  142. });
  143. $('#migrate_modal').on('show.bs.modal', function (me) {
  144. $('#migrate_instance_uuid').val(
  145. $(me.relatedTarget).parent().parent().parent().parent().parent().children()[0].textContent);
  146. $.ajax({
  147. url : '/api/hosts?alive',
  148. type : 'GET',
  149. contentType: "application/json; charset=utf-8",
  150. dataType: 'json',
  151. error : function() {
  152. },
  153. success : function(data, textStatus, xhr) {
  154. $('#migrate_host').empty();
  155. $.each(data.data, function(k, v) {
  156. $('#migrate_host').append(
  157. $('<option>', {value: v['hostname'], text: v['hostname']})
  158. );
  159. });
  160. $('#migrate_host').trigger("chosen:updated");
  161. }
  162. });
  163. });
  164. $('#reset_password_modal').on('show.bs.modal', function (me) {
  165. $('#reset_password_instance_uuid').val(
  166. $(me.relatedTarget).parent().parent().parent().parent().parent().children()[0].textContent);
  167. show_real_password_for_renew = false;
  168. $('#show_new_password_button').removeClass("icon-elusive-eye").addClass("icon-elusive-eye-off");
  169. $('#new_password').val('');
  170. $('#new_password').attr({type: "password"});
  171. });
  172. $('#allocate_bandwidth_modal').on('show.bs.modal', function (me) {
  173. $('#bandwidth_unit').on('changed.bs.select', function (me) {
  174. render_bandwidth_slider($("#bandwidth"), 'update', $('#bandwidth_unit').val())
  175. });
  176. render_bandwidth_slider($("#bandwidth"), 'create', 'm');
  177. });
  178. $('#batch_allocate_bandwidth_modal').on('show.bs.modal', function (me) {
  179. $('#batch_bandwidth_unit').on('changed.bs.select', function (me) {
  180. render_bandwidth_slider($("#batch_bandwidth"), 'update', $('#batch_bandwidth_unit').val())
  181. });
  182. render_bandwidth_slider($("#batch_bandwidth"), 'create', 'm');
  183. });
  184. $('#adjust_ability_form').formValidation({
  185. framework: 'bootstrap4',
  186. icon: {
  187. valid: 'fa fa-check',
  188. invalid: 'fa fa-times',
  189. validating: 'fa fa-refresh'
  190. },
  191. // Since the Bootstrap Button hides the radio and checkbox
  192. // We exclude the disabled elements only
  193. excluded: ':disabled',
  194. locale: 'zh_CN',
  195. fields: {
  196. ability: {
  197. validators: {
  198. notEmpty: {
  199. }
  200. }
  201. }
  202. }
  203. })
  204. .on('success.field.fv', function(e, data) {
  205. if (data.fv.getInvalidFields().length > 0) { // There is invalid field
  206. $('#adjust_ability_form_button').prop('disabled', true);
  207. } else {
  208. $('#adjust_ability_form_button').prop('disabled', false);
  209. }
  210. });
  211. $('#batch_adjust_ability_form').formValidation({
  212. framework: 'bootstrap4',
  213. icon: {
  214. valid: 'fa fa-check',
  215. invalid: 'fa fa-times',
  216. validating: 'fa fa-refresh'
  217. },
  218. // Since the Bootstrap Button hides the radio and checkbox
  219. // We exclude the disabled elements only
  220. excluded: ':disabled',
  221. locale: 'zh_CN',
  222. fields: {
  223. ability: {
  224. validators: {
  225. notEmpty: {
  226. }
  227. }
  228. }
  229. }
  230. })
  231. .on('success.field.fv', function(e, data) {
  232. if (data.fv.getInvalidFields().length > 0) { // There is invalid field
  233. $('#batch_adjust_ability_form_button').prop('disabled', true);
  234. } else {
  235. $('#batch_adjust_ability_form_button').prop('disabled', false);
  236. }
  237. });
  238. $('#adjust_ability_modal').on('show.bs.modal', function (me) {
  239. $('#adjust_ability_modal input:radio[name="ability"]').prop('checked',false);
  240. $('#adjust_ability_modal .btn-ability-line label').removeClass('active');
  241. $('#adjust_ability_form_button').prop('disabled', true);
  242. $('#adjust_ability_modal .form-group').removeClass('has-success');
  243. });
  244. $('#batch_adjust_ability_modal').on('show.bs.modal', function (me) {
  245. $('#batch_adjust_ability_modal input:radio[name="ability"]').prop('checked',false);
  246. $('#batch_adjust_ability_modal .btn-ability-line label').removeClass('active');
  247. $('#batch_adjust_ability_form_button').prop('disabled', true);
  248. $('#batch_adjust_ability_modal .form-group').removeClass('has-success');
  249. });
  250. });
  251. function refresh() {
  252. keyword = $('#content_search').val();
  253. page = $('#pagination li.active a').text();
  254. page_size = $('#page_size').val();
  255. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size;
  256. if (keyword.length > 0) {
  257. cur_url = resource_path + '?page=' + page + '&page_size=' + page_size + '&keyword=' + keyword;
  258. }
  259. window.location.href=cur_url;
  260. }
  261. function row_onmouseover(me) {
  262. $(me).find(".edit_remark_trigger").css('display','inline-flex');
  263. }
  264. function row_onmouseout(me) {
  265. $(me).find(".edit_remark_trigger").css('display','none');
  266. }
  267. function remark_update(me) {
  268. var uuid = $('#edit_remark_instance_uuid').val();
  269. var remark = $('#edit_remark').val();
  270. $('#edit_remark_modal').modal('hide');
  271. $.ajax({
  272. url : '/api/guest/' + uuid,
  273. type : 'PATCH',
  274. contentType: "application/json; charset=utf-8",
  275. data : JSON.stringify({
  276. remark: remark
  277. }),
  278. error : function() {
  279. alter_danger('实例备注更新失败!');
  280. },
  281. success : function() {
  282. $('#guest_list tbody').find('td:contains(' + uuid + ')').next().next().find('p').text(remark);
  283. alter_success('实例备注更新成功!');
  284. }
  285. });
  286. }
  287. function get_selected_element(checked) {
  288. if (checked === null) {
  289. checked = true;
  290. }
  291. if (checked) {
  292. return $('tbody :checked');
  293. } else {
  294. return $('tbody input:not(:checked)');
  295. }
  296. }
  297. function highlight_selected_element() {
  298. var selected_element = get_selected_element(true);
  299. var no_selected_element = get_selected_element(false);
  300. selected_element.each(function(i, e) {
  301. $(e).parent().parent().toggleClass('tr-selected', true);
  302. });
  303. no_selected_element.each(function(i, e) {
  304. $(e).parent().parent().toggleClass('tr-selected', false);
  305. });
  306. }
  307. function shortcut_bar_enable() {
  308. var selected_element = get_selected_element(true);
  309. if (selected_element.length > 0) {
  310. $('.btn-shortcut').toggleClass('disabled', false);
  311. } else {
  312. $('.btn-shortcut').toggleClass('disabled', true);
  313. }
  314. }
  315. function select_item_action() {
  316. highlight_selected_element();
  317. shortcut_bar_enable();
  318. }
  319. function boot(uuids) {
  320. $.ajax({
  321. url : '/api/guests/_boot/' + uuids.join(','),
  322. type : 'PUT',
  323. contentType: "application/json; charset=utf-8",
  324. error : function() {
  325. alter_danger('实例启动指令发送失败!');
  326. },
  327. success : function() {
  328. alter_success('实例启动指令发送成功!');
  329. }
  330. });
  331. }
  332. function reboot(uuids) {
  333. $.ajax({
  334. url : '/api/guests/_reboot/' + uuids.join(','),
  335. type : 'PUT',
  336. contentType: "application/json; charset=utf-8",
  337. error : function() {
  338. alter_danger('实例重启指令发送失败!');
  339. },
  340. success : function() {
  341. alter_success('实例重启指令发送成功!');
  342. }
  343. });
  344. }
  345. function force_reboot(uuids) {
  346. $.ajax({
  347. url : '/api/guests/_force_reboot/' + uuids.join(','),
  348. type : 'PUT',
  349. contentType: "application/json; charset=utf-8",
  350. error : function() {
  351. alter_danger('实例强制重启指令发送失败!');
  352. },
  353. success : function() {
  354. alter_success('实例强制重启指令发送成功!');
  355. }
  356. });
  357. }
  358. function shutdown(uuids) {
  359. $.ajax({
  360. url : '/api/guests/_shutdown/' + uuids.join(','),
  361. type : 'PUT',
  362. contentType: "application/json; charset=utf-8",
  363. error : function() {
  364. alter_danger('实例停止指令发送失败!');
  365. },
  366. success : function() {
  367. alter_success('实例停止指令发送成功!');
  368. }
  369. });
  370. }
  371. function force_shutdown(uuids) {
  372. $.ajax({
  373. url : '/api/guests/_force_shutdown/' + uuids.join(','),
  374. type : 'PUT',
  375. contentType: "application/json; charset=utf-8",
  376. error : function() {
  377. alter_danger('实例强制停止指令发送失败!');
  378. },
  379. success : function() {
  380. alter_success('实例强制停止指令发送成功!');
  381. }
  382. });
  383. }
  384. function create_snapshot(uuid, label) {
  385. $.ajax({
  386. url : '/api/snapshot',
  387. type : 'POST',
  388. contentType: "application/json; charset=utf-8",
  389. dataType: "json",
  390. data : JSON.stringify({guest_uuid: uuid, label: label}),
  391. error : function(data, textStatus, xhr) {
  392. alter_danger('实例创建快照指令发送失败!');
  393. },
  394. success : function(data, textStatus, xhr) {
  395. alter_success('实例创建快照指令发送成功!');
  396. setTimeout(function() {
  397. window.location.href="/snapshots";
  398. }, 1000);
  399. }
  400. });
  401. }
  402. function suspend(uuids) {
  403. $.ajax({
  404. url : '/api/guests/_suspend/' + uuids.join(','),
  405. type : 'PUT',
  406. contentType: "application/json; charset=utf-8",
  407. error : function() {
  408. alter_danger('实例暂停指令发送失败!');
  409. },
  410. success : function() {
  411. alter_success('实例暂停指令发送成功!');
  412. }
  413. });
  414. }
  415. function resume(uuids) {
  416. $.ajax({
  417. url : '/api/guests/_resume/' + uuids.join(','),
  418. type : 'PUT',
  419. contentType: "application/json; charset=utf-8",
  420. error : function() {
  421. alter_danger('实例恢复指令发送失败!');
  422. },
  423. success : function() {
  424. alter_success('实例恢复指令发送成功!');
  425. }
  426. });
  427. }
  428. function allocate_bandwidth(uuids, bandwidth, bandwidth_unit) {
  429. $.ajax({
  430. url : '/api/guests/_allocate_bandwidth/' + uuids.join(',') + '/' + bandwidth + '/' + bandwidth_unit,
  431. type : 'PUT',
  432. contentType: "application/json; charset=utf-8",
  433. error : function() {
  434. alter_danger('实例分配带宽指令发送失败!');
  435. },
  436. success : function() {
  437. alter_success('实例分配带宽指令发送成功!');
  438. }
  439. });
  440. }
  441. function adjust_ability(uuids, cpu, memory) {
  442. $.ajax({
  443. url : '/api/guests/_adjust_ability/' + uuids.join(',') + '/' + cpu + '/' + memory,
  444. type : 'PUT',
  445. contentType: "application/json; charset=utf-8",
  446. error : function() {
  447. alter_danger('实例变更配置指令发送失败!');
  448. },
  449. success : function() {
  450. alter_success('实例变更配置指令发送成功!');
  451. }
  452. });
  453. }
  454. function remove(uuids) {
  455. $.ajax({
  456. url : '/api/guests/' + uuids.join(','),
  457. type : 'DELETE',
  458. contentType: "application/json; charset=utf-8",
  459. error : function() {
  460. alter_danger('实例删除指令发送失败!');
  461. },
  462. success : function() {
  463. alter_success('实例删除指令发送成功!');
  464. }
  465. });
  466. }
  467. function migrate(uuids, host) {
  468. $.ajax({
  469. url : '/api/guests/_migrate/' + uuids.join(',') + '/' + host,
  470. type : 'PUT',
  471. contentType: "application/json; charset=utf-8",
  472. error : function() {
  473. alter_danger('实例迁移指令发送失败!');
  474. },
  475. success : function() {
  476. alter_success('实例迁移指令发送成功!');
  477. }
  478. });
  479. }
  480. function reset_password(uuids, password) {
  481. $.ajax({
  482. url : '/api/guests/_reset_password/' + uuids.join(',') + '/' + password,
  483. type : 'PUT',
  484. contentType: "application/json; charset=utf-8",
  485. error : function() {
  486. alter_danger('实例重置密码指令发送失败!');
  487. },
  488. success : function() {
  489. alter_success('实例重置密码指令发送成功!');
  490. }
  491. });
  492. }
  493. function boot_at(me) {
  494. var uuid = $('#instance_uuid').val();
  495. boot([uuid]);
  496. $('#boot_modal').modal('hide');
  497. }
  498. function reboot_at(me) {
  499. var uuid = $('#instance_uuid').val();
  500. reboot([uuid]);
  501. $('#reboot_modal').modal('hide');
  502. }
  503. function force_reboot_at(me) {
  504. var uuid = $('#instance_uuid').val();
  505. force_reboot([uuid]);
  506. $('#force_reboot_modal').modal('hide');
  507. }
  508. function shutdown_at(me) {
  509. var uuid = $('#instance_uuid').val();
  510. shutdown([uuid]);
  511. $('#shutdown_modal').modal('hide');
  512. }
  513. function force_shutdown_at(me) {
  514. var uuid = $('#instance_uuid').val();
  515. force_shutdown([uuid]);
  516. $('#force_shutdown_modal').modal('hide');
  517. }
  518. function create_snapshot_at(me) {
  519. var uuid = $('#instance_uuid').val();
  520. var label = $('#snapshot_label').val();
  521. create_snapshot(uuid, label);
  522. $('#create_snapshot_modal').modal('hide');
  523. }
  524. function suspend_at(me) {
  525. var uuid = $('#instance_uuid').val();
  526. suspend([uuid]);
  527. $('#suspend_modal').modal('hide');
  528. }
  529. function resume_at(me) {
  530. var uuid = $('#instance_uuid').val();
  531. resume([uuid]);
  532. $('#resume_modal').modal('hide');
  533. }
  534. function allocate_bandwidth_at(me) {
  535. var uuid = $('#instance_uuid').val();
  536. allocate_bandwidth([uuid], $('#bandwidth').val(), $('#bandwidth_unit').val());
  537. $('#allocate_bandwidth_modal').modal('hide');
  538. }
  539. function adjust_ability_at(me) {
  540. var uuid = $('#instance_uuid').val();
  541. var adjust_ability_value = $('#adjust_ability_modal input:radio[name="ability"]:checked').val();
  542. adjust_ability_value = adjust_ability_value.match(/^(\d+)c(\d+)g$/i);
  543. if (adjust_ability_value === null) {
  544. alter_danger('实例变更配置失败,指定的配置取值有误!');
  545. return
  546. }
  547. var cpu = adjust_ability_value[1];
  548. var memory = adjust_ability_value[2];
  549. adjust_ability([uuid], cpu, memory);
  550. $('#adjust_ability_modal').modal('hide');
  551. }
  552. function delete_at(me) {
  553. var uuid = $('#instance_uuid').val();
  554. remove([uuid]);
  555. $('#delete_modal').modal('hide');
  556. }
  557. function migrate_go() {
  558. var migrate_type = $('#migrate_type').val();
  559. var uuids = [];
  560. if (migrate_type === 'single') {
  561. uuids = [$('#migrate_instance_uuid').val()];
  562. } else {
  563. uuids = get_checked_uuids();
  564. }
  565. var host = $('#migrate_host').val();
  566. $('#migrate_modal').modal('hide');
  567. migrate([uuids], host);
  568. }
  569. function reset_password_go() {
  570. var migrate_type = $('#reset_password_type').val();
  571. var uuids = [];
  572. if (migrate_type === 'single') {
  573. uuids = [$('#reset_password_instance_uuid').val()];
  574. } else {
  575. uuids = get_checked_uuids();
  576. }
  577. var password = $('#new_password').val();
  578. $('#reset_password_modal').modal('hide');
  579. reset_password([uuids], password);
  580. }
  581. function get_selected_uuids() {
  582. var selected_element = get_selected_element(true);
  583. var uuids = [];
  584. selected_element.each(function(i, e) {
  585. var uuid = $(e).parent().prev().text();
  586. uuids.push(uuid);
  587. });
  588. return uuids;
  589. }
  590. function get_checked_uuids() {
  591. var uuids = get_selected_uuids();
  592. if (uuids.length < 1) {
  593. alter_warning('未选择任何可操作的实例!');
  594. return false;
  595. }
  596. return uuids;
  597. }
  598. function batch_boot() {
  599. var uuids = get_checked_uuids();
  600. if (uuids) {
  601. boot(uuids);
  602. }
  603. $('#batch_boot_modal').modal('hide');
  604. }
  605. function batch_reboot() {
  606. var uuids = get_checked_uuids();
  607. if (uuids) {
  608. reboot(uuids);
  609. }
  610. $('#batch_reboot_modal').modal('hide');
  611. }
  612. function batch_force_reboot() {
  613. var uuids = get_checked_uuids();
  614. if (uuids) {
  615. force_reboot(uuids);
  616. }
  617. $('#batch_force_reboot_modal').modal('hide');
  618. }
  619. function batch_shutdown() {
  620. var uuids = get_checked_uuids();
  621. if (uuids) {
  622. shutdown(uuids);
  623. }
  624. $('#batch_shutdown_modal').modal('hide');
  625. }
  626. function batch_force_shutdown() {
  627. var uuids = get_checked_uuids();
  628. if (uuids) {
  629. force_shutdown(uuids);
  630. }
  631. $('#batch_force_shutdown_modal').modal('hide');
  632. }
  633. function batch_suspend() {
  634. var uuids = get_checked_uuids();
  635. if (uuids) {
  636. suspend(uuids);
  637. }
  638. $('#batch_suspend_modal').modal('hide');
  639. }
  640. function batch_resume() {
  641. var uuids = get_checked_uuids();
  642. if (uuids) {
  643. resume(uuids);
  644. }
  645. $('#batch_resume_modal').modal('hide');
  646. }
  647. function batch_allocate_bandwidth() {
  648. var uuids = get_checked_uuids();
  649. if (uuids) {
  650. allocate_bandwidth(uuids, $('#batch_bandwidth').val(), $('#batch_bandwidth_unit').val());
  651. }
  652. $('#batch_allocate_bandwidth_modal').modal('hide');
  653. }
  654. function batch_adjust_ability() {
  655. var uuids = get_checked_uuids();
  656. var adjust_ability_value = $('#batch_adjust_ability_modal input:radio[name="ability"]:checked').val();
  657. adjust_ability_value = adjust_ability_value.match(/^(\d+)c(\d+)g$/i);
  658. if (adjust_ability_value === null) {
  659. alter_danger('实例批量变更配置失败,指定的配置取值有误!');
  660. return
  661. }
  662. var cpu = adjust_ability_value[1];
  663. var memory = adjust_ability_value[2];
  664. if (uuids) {
  665. adjust_ability(uuids, cpu, memory);
  666. }
  667. $('#batch_adjust_ability_modal').modal('hide');
  668. }
  669. function batch_delete() {
  670. var uuids = get_checked_uuids();
  671. if (uuids) {
  672. remove(uuids);
  673. }
  674. $('#batch_delete_modal').modal('hide');
  675. }
  676. var show_real_password = false;
  677. function change_display_password(me) {
  678. if (show_real_password) {
  679. show_real_password = false;
  680. $(me).removeClass("icon-elusive-eye").addClass("icon-elusive-eye-off");
  681. $('.real_password').toggle();
  682. $('.unreal_password').toggle();
  683. } else {
  684. show_real_password = true;
  685. $(me).removeClass("icon-elusive-eye-off").addClass("icon-elusive-eye");
  686. $('.unreal_password').toggle();
  687. $('.real_password').toggle();
  688. }
  689. }
  690. function change_display_password_for_renew(me) {
  691. if (show_real_password_for_renew) {
  692. show_real_password_for_renew = false;
  693. $(me).removeClass("icon-elusive-eye").addClass("icon-elusive-eye-off");
  694. $('#new_password').attr({type: "password"});
  695. } else {
  696. show_real_password_for_renew = true;
  697. $(me).removeClass("icon-elusive-eye-off").addClass("icon-elusive-eye");
  698. $('#new_password').attr({type: "text"});
  699. }
  700. }
  701. </script>
  702. <div class="panel">
  703. <div class="panel-body">
  704. <h3 class="title-hero" style="font-size: 24px;">
  705. 虚拟机实例
  706. </h3>
  707. <div>
  708. <div id="datatable-row-highlight_wrapper" class="dataTables_wrapper form-inline">
  709. <div class="row" style="padding: 10px 10px 10px 0; width: 100%;">
  710. <div class="col-sm-12" style="padding-right: 0;">
  711. <div id="datatable-row-highlight_filter" class="dataTables_filter" style="display: inline-block;">
  712. <input id="content_search" type="search" class="form-control" placeholder="模糊搜索..." value="{%- if keyword -%} {{ keyword }} {%- endif -%}" style="margin-left: 0; border-radius: 0;">
  713. </div>
  714. <div class="pull-right">
  715. <button class="btn btn-default" onclick="refresh()" style="border-radius: 0;"><span class="glyph-icon icon-elusive-arrows-cw"></span></button>
  716. <a class="btn btn-info add-page-transition" href="/guests/create" data-transition="pt-page-moveFromRight-init" style="border-radius: 0; padding-left: 40px; padding-right: 40px;">创建实例</a>
  717. </div>
  718. </div>
  719. </div>
  720. <table id="guest_list" class="table table-bordered table-hover" cellspacing="0" width="100%" role="grid"
  721. style="width: 100%; margin-bottom: 0; border-bottom-width: 0;">
  722. <thead>
  723. <tr role="row">
  724. <th style="display: none;">UUID</th>
  725. <th><input class="all_selector" title="选取所有" type="checkbox"></th>
  726. <th width="180px;">名称</th>
  727. <th></th>
  728. <th>状态</th>
  729. <th>计算节点</th>
  730. <th>配置</th>
  731. <th>IP</th>
  732. <th width="150px;">密码&nbsp;&nbsp;<a href="#" class="glyph-icon icon-elusive-eye-off" onclick="change_display_password(this);" style="color: #014c8c;"></a></th>
  733. <th>创建时间</th>
  734. <th>操作</th>
  735. </tr>
  736. </thead>
  737. <tbody>
  738. {% for item in guests_ret.data %}
  739. <tr role="row" class="odd" onmouseover="row_onmouseover(this);" onmouseout="row_onmouseout(this);">
  740. <td style="display: none;">{{ item.uuid }}</td>
  741. <td><input title="选中" type="checkbox"></td>
  742. <td>
  743. <div>
  744. <a href="/guest/detail/{{ item.uuid }}">{{ item.label }}</a>
  745. </div>
  746. <div>
  747. <p style="display: inline-block;">{{ item.remark }}</p>
  748. <a href="javascript:;" class="edit_remark_trigger" data-toggle="modal" data-target="#edit_remark_modal" style="display: none; float: right;">
  749. <span class="glyph-icon icon-elusive-pencil" style="width: 20px; height: 20px; margin-left: 10px; border-radius: 0; border: 1px solid rgb(220, 233, 255); background-color: #ffffff;"></span>
  750. </a>
  751. </div>
  752. </td>
  753. <td>
  754. {% if os_templates_image_mapping_by_id[item.os_template_image_id].logo == "" %}
  755. <span class="{{ os_templates_profile_mapping_by_id[os_templates_image_mapping_by_id[item.os_template_image_id].os_template_profile_id].icon }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id].label }}"></span>
  756. {% else %}
  757. <span class="{{ os_templates_image_mapping_by_id[item.os_template_image_id].logo }}" title="{{ os_templates_image_mapping_by_id[item.os_template_image_id].label }}"></span>
  758. {% endif %}
  759. </td>
  760. <td>{{ format_guest_status(item.status, item.progress)|safe }}</td>
  761. <td>{{ hosts_mapping_by_node_id[item.node_id].hostname }}</td>
  762. <td>
  763. CPU :&nbsp;&nbsp;{{ item.cpu }}&nbsp;核<br />
  764. 内存 :&nbsp;&nbsp;{{ item.memory }}&nbsp;GB<br />
  765. 带宽 :&nbsp;
  766. {% if item.bandwidth == 0 %}
  767. <span style="font-size: 16px;" title="无限带宽">
  768. &nbsp;∞
  769. </span>
  770. {% elif item.bandwidth > 0 and item.bandwidth < 1000**2 %}
  771. {{ item.bandwidth // 1000 }}
  772. {% elif item.bandwidth >= 1000**2 and item.bandwidth < 1000**3 %}
  773. {{ item.bandwidth // 1000**2 }}
  774. {% else %}
  775. {{ item.bandwidth // 1000**3 }}
  776. {% endif %}
  777. {% if item.bandwidth == 0 %}
  778. {% elif item.bandwidth > 0 and item.bandwidth < 1000**2 %}
  779. Kbps
  780. {% elif item.bandwidth >= 1000**2 and item.bandwidth < 1000**3 %}
  781. Mbps
  782. {% else %}
  783. Gbps
  784. {% endif %}
  785. </td>
  786. <td>{{ item.ip }}</td>
  787. <td><span class="unreal_password">*********</span><span class="real_password" style="display: none;">{{ item.password }}</span></td>
  788. <td>{{ format_datetime_by_tus(item.create_time) }}</td>
  789. <td>
  790. <div class="dropdown inline-block">
  791. <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown">
  792. 更多
  793. </a>
  794. <ul class="dropdown-menu">
  795. <li class="{% if item.status not in [5, 6, 7] %} disabled {% endif %}">
  796. <a href="javascript:;" data-toggle="modal" data-target="#boot_modal"
  797. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  798. $('#boot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  799. 启动
  800. </a>
  801. </li>
  802. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  803. <a href="javascript:;" data-toggle="modal" data-target="#reboot_modal"
  804. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  805. $('#reboot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  806. 重启
  807. </a>
  808. </li>
  809. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  810. <a href="javascript:;" data-toggle="modal" data-target="#force_reboot_modal"
  811. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  812. $('#force_reboot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  813. 强制重启
  814. </a>
  815. </li>
  816. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  817. <a href="javascript:;" data-toggle="modal" data-target="#shutdown_modal"
  818. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  819. $('#shutdown_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  820. 停止
  821. </a>
  822. </li>
  823. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  824. <a href="javascript:;" data-toggle="modal" data-target="#force_shutdown_modal"
  825. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  826. $('#force_shutdown_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  827. 强制停止
  828. </a>
  829. </li>
  830. <li class="divider"></li>
  831. <li class="{% if not item.snapshot.creatable %} disabled {% endif %}">
  832. <a href="javascript:;" data-toggle="modal" data-target="#create_snapshot_modal"
  833. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  834. $('#create_snapshot_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent);
  835. $('#snapshot_label').val($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  836. 创建快照
  837. </a>
  838. </li>
  839. <li class="divider"></li>
  840. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  841. <a href="javascript:;" data-toggle="modal" data-target="#suspend_modal"
  842. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  843. $('#suspend_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  844. 暂停
  845. </a>
  846. </li>
  847. <li class="{% if item.status not in [4] %} disabled {% endif %}">
  848. <a href="javascript:;" data-toggle="modal" data-target="#resume_modal"
  849. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  850. $('#resume_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  851. 恢复
  852. </a>
  853. </li>
  854. <li class="divider"></li>
  855. <li class="{% if item.status not in [1, 2] %} disabled {% endif %}">
  856. <a href="/guest/vnc/{{ item.uuid }}" target="_blank">远程连接</a>
  857. </li>
  858. <li class="divider"></li>
  859. <li class="">
  860. <a href="javascript:;" data-toggle="modal" data-target="#allocate_bandwidth_modal"
  861. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  862. $('#allocate_bandwidth_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  863. 分配带宽
  864. </a>
  865. </li>
  866. <li class="{% if item.status not in [6] %} disabled {% endif %}">
  867. <a href="javascript:;" data-toggle="modal" data-target="#adjust_ability_modal"
  868. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  869. $('#adjust_ability_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  870. 变更配置
  871. </a>
  872. <li class="divider"></li>
  873. <li class="{% if item.status not in [2] %} disabled {% endif %}">
  874. <a href="javascript:;" data-toggle="modal" data-target="#reset_password_modal"
  875. onclick="$('#reset_password_type').val('single')">
  876. 密码重置
  877. </a>
  878. </li>
  879. <li class="{% if item.status not in [2, 4, 5, 6, 7] %} disabled {% endif %}">
  880. <a href="javascript:;" data-toggle="modal" data-target="#migrate_modal"
  881. onclick="$('#migrate_type').val('single')">
  882. 迁移到
  883. </a>
  884. </li>
  885. <li class="divider"></li>
  886. <li class="{% if item.status not in [5, 6, 7, 255] %} disabled {% endif %}">
  887. <a href="javascript:;" data-toggle="modal" data-target="#delete_modal"
  888. onclick="$('#instance_uuid').val($($(this).parent().parent().parent().parent().parent().children()[0]).text());
  889. $('#delete_instance_desc').text($($(this).parent().parent().parent().parent().parent().children()[2]).find('div a')[0].textContent + '/' + $($(this).parent().parent().parent().parent().parent().children()[2]).find('div p')[0].textContent)">
  890. 删除
  891. </a>
  892. </li>
  893. </ul>
  894. </div>
  895. </td>
  896. </tr>
  897. {% endfor %}
  898. </tbody>
  899. </table>
  900. <table class="table table-bordered" style="border-top-width: 0; z-index: 99; position: sticky; bottom: 0;">
  901. <tfoot>
  902. <tr style="height: 70px;">
  903. <th><input type="checkbox" title="选取所有" class="all_selector"></th>
  904. <th>
  905. <div class="row">
  906. <div class="col-sm-6">
  907. <button class="btn btn-default btn-shortcut disabled" data-toggle="modal" data-target="#batch_boot_modal">启动</button>
  908. <button class="btn btn-default btn-shortcut disabled" data-toggle="modal" data-target="#batch_reboot_modal">重启</button>
  909. <button class="btn btn-default btn-shortcut disabled" data-toggle="modal" data-target="#batch_shutdown_modal">停止</button>
  910. <button class="btn btn-default btn-shortcut disabled" data-toggle="modal" data-target="#batch_suspend_modal">暂停</button>
  911. <button class="btn btn-default btn-shortcut disabled" data-toggle="modal" data-target="#batch_resume_modal">恢复</button>
  912. <div class="dropup inline-block">
  913. <button href="javascript:;" class="dropdown-toggle btn btn-default btn-shortcut disabled" data-toggle="dropdown">
  914. 更多
  915. </button>
  916. <ul class="dropdown-menu" style="width: 60px;">
  917. <li>
  918. <a href="javascript:;" data-toggle="modal" data-target="#batch_delete_modal">删除</a>
  919. </li>
  920. <li class="divider"></li>
  921. <li>
  922. <a href="javascript:;" onclick="$('#migrate_type').val('batch');"
  923. data-toggle="modal" data-target="#migrate_modal" >
  924. 迁移到
  925. </a>
  926. </li>
  927. <li>
  928. <a href="javascript:;" onclick="$('#reset_password_type').val('batch');"
  929. data-toggle="modal" data-target="#reset_password_modal">
  930. 密码重置
  931. </a>
  932. </li>
  933. <li class="divider"></li>
  934. <li>
  935. <a href="javascript:;" data-toggle="modal" data-target="#batch_allocate_bandwidth_modal">分配带宽</a>
  936. </li>
  937. <li>
  938. <a href="javascript:;" data-toggle="modal" data-target="#batch_adjust_ability_modal">变更配置</a>
  939. </li>
  940. <li class="divider"></li>
  941. <li>
  942. <a href="javascript:;" data-toggle="modal" data-target="#batch_force_shutdown_modal">强制停止</a>
  943. </li>
  944. <li>
  945. <a href="javascript:;" data-toggle="modal" data-target="#batch_force_reboot_modal">强制重启</a>
  946. </li>
  947. </ul>
  948. </div>
  949. </div>
  950. <div class="col-sm-3" style="font-size: 12px; padding-top: 5px; text-align: right;">
  951. 共有{{ guests_ret.paging.total }}条,每页显示:
  952. <select id="page_size" name="datatable-row-highlight_length" title="page_size" class="form-control" style="height: 22px; vertical-align: baseline;">
  953. <option value="10" {% if page_size == 10 %} selected {% endif %}>10</option>
  954. <option value="20" {% if page_size == 20 %} selected {% endif %}>20</option>
  955. <option value="50" {% if page_size == 50 %} selected {% endif %}>50</option>
  956. </select>&nbsp;&nbsp;条
  957. </div>
  958. <div class="col-sm-3" style="text-align: left;">
  959. <div class="dataTables_paginate paging_bootstrap" id="datatable-row-highlight_paginate">
  960. <ul id="pagination" class="pagination">
  961. <li class="{% if page == 1 %} disabled {% endif %}">
  962. <a href="{{ resource_path }}?page={{ page - 1 }}&page_size={{ page_size }}{% if keyword %}&keyword={{ keyword }}{% endif %}">«</a>
  963. </li>
  964. {% for item in pages %}
  965. <li class="{% if item == page %} active {% endif %}">
  966. <a href="{{ resource_path }}?page={{ item }}&page_size={{ page_size }}{% if keyword %}&keyword={{ keyword }}{% endif %}">{{ item }}</a>
  967. </li>
  968. {% endfor %}
  969. <li class="{% if page == last_page %} disabled {% endif %}">
  970. <a href="{{ resource_path }}?page={{ page + 1 }}&page_size={{ page_size }}{% if keyword %}&keyword={{ keyword }}{% endif %}">»</a>
  971. </li>
  972. </ul>
  973. </div>
  974. </div>
  975. </div>
  976. </th>
  977. </tr>
  978. </tfoot>
  979. </table>
  980. </div>
  981. </div>
  982. </div>
  983. </div>
  984. <div class="modal" id="edit_remark_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  985. <div class="modal-dialog modal-sm">
  986. <div class="modal-content">
  987. <div class="modal-header">
  988. <h4 class="modal-title">编辑实例名称:</h4>
  989. </div>
  990. <div class="modal-body">
  991. <input id="edit_remark_instance_uuid" title="实例 UUID" class="form-control" name="uuid" hidden>
  992. <input id="edit_remark" title="实例名称" class="form-control" name="remark">
  993. </div>
  994. <div class="modal-footer">
  995. <button type="button" class="btn btn-sm btn-primary" onclick="remark_update();">确定</button>
  996. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  997. </div>
  998. </div>
  999. </div>
  1000. </div>
  1001. <div class="modal" id="migrate_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1002. <div class="modal-dialog modal-sm">
  1003. <div class="modal-content">
  1004. <div class="modal-header">
  1005. <h4 class="modal-title">实例迁移至:</h4>
  1006. </div>
  1007. <div class="modal-body">
  1008. <input id="migrate_type" title="迁移类型" class="form-control" name="migrate_type" value="single" hidden>
  1009. <input id="migrate_instance_uuid" title="实例 UUID" class="form-control" name="uuid" hidden>
  1010. <select id="migrate_host" name="migrate_host" title="可迁移计算节点" class="chosen-select">
  1011. </select>
  1012. </div>
  1013. <div class="modal-footer">
  1014. <button type="button" class="btn btn-sm btn-primary" onclick="migrate_go();">确定</button>
  1015. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1016. </div>
  1017. </div>
  1018. </div>
  1019. </div>
  1020. <div class="modal" id="reset_password_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1021. <div class="modal-dialog modal-sm">
  1022. <div class="modal-content">
  1023. <div class="modal-header">
  1024. <h4 class="modal-title">重置密码:</h4>
  1025. </div>
  1026. <div class="modal-body">
  1027. <div class="form-group" style="height: 20px;">
  1028. <input id="reset_password_type" title="重置密码类型" class="form-control" name="reset_password_type" value="single" hidden>
  1029. <input id="reset_password_instance_uuid" title="实例 UUID" class="form-control" name="uuid" hidden>
  1030. <div class="col-sm-8">
  1031. <input id="new_password" title="新密码" class="form-control" name="new_password" type="password" placeholder="新密码">
  1032. </div>
  1033. <div class="col-sm-2">
  1034. <button id="show_new_password_button" class="form-control glyph-icon icon-elusive-eye-off" onclick="change_display_password_for_renew(this);" style="color: #014c8c; width: 35px;"></button>
  1035. </div>
  1036. <div class="col-sm-2">
  1037. <button class="form-control glyph-icon icon-elusive-key" onclick="$('#new_password').val(new RandomPassword().create(16));" style="color: #014c8c; width: 35px;"></button>
  1038. </div>
  1039. </div>
  1040. </div>
  1041. <div class="modal-footer">
  1042. <button type="button" class="btn btn-sm btn-primary" onclick="reset_password_go();">确定</button>
  1043. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1044. </div>
  1045. </div>
  1046. </div>
  1047. </div>
  1048. <input id="instance_uuid" title="实例 UUID" class="form-control" name="uuid" hidden>
  1049. <div class="modal" id="delete_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1050. <div class="modal-dialog">
  1051. <div class="modal-content">
  1052. <div class="modal-header">
  1053. <h4 class="modal-title">删除虚拟机:</h4>
  1054. </div>
  1055. <div class="modal-body">
  1056. <p>删除的虚拟机将无法找回,上面数据将永久消失。您确定要删除该虚拟机吗?</p>
  1057. <h3 style="color: orangered;" id="delete_instance_desc"></h3>
  1058. </div>
  1059. <div class="modal-footer">
  1060. <button type="button" class="btn btn-sm btn-primary" onclick="delete_at();">确定</button>
  1061. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1062. </div>
  1063. </div>
  1064. </div>
  1065. </div>
  1066. <div class="modal" id="batch_delete_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1067. <div class="modal-dialog">
  1068. <div class="modal-content">
  1069. <div class="modal-header">
  1070. <h4 class="modal-title">批量删除虚拟机:</h4>
  1071. </div>
  1072. <div class="modal-body">
  1073. <p></p>
  1074. <p>删除的虚拟机将无法找回,上面数据将永久消失。您确定要执行批量删除选定的虚拟机吗?</p>
  1075. </div>
  1076. <div class="modal-footer">
  1077. <button type="button" class="btn btn-sm btn-primary" onclick="batch_delete();">确定</button>
  1078. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1079. </div>
  1080. </div>
  1081. </div>
  1082. </div>
  1083. <div class="modal" id="reboot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1084. <div class="modal-dialog">
  1085. <div class="modal-content">
  1086. <div class="modal-header">
  1087. <h4 class="modal-title">重启虚拟机:</h4>
  1088. </div>
  1089. <div class="modal-body">
  1090. <p>您确定要重启该虚拟机吗?</p>
  1091. <h3 style="color: orangered;" id="reboot_instance_desc"></h3>
  1092. </div>
  1093. <div class="modal-footer">
  1094. <button type="button" class="btn btn-sm btn-primary" onclick="reboot_at();">确定</button>
  1095. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1096. </div>
  1097. </div>
  1098. </div>
  1099. </div>
  1100. <div class="modal" id="batch_reboot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1101. <div class="modal-dialog">
  1102. <div class="modal-content">
  1103. <div class="modal-header">
  1104. <h4 class="modal-title">批量重启虚拟机:</h4>
  1105. </div>
  1106. <div class="modal-body">
  1107. <p></p>
  1108. <p>您确定要执行批量重启选定的虚拟机吗?</p>
  1109. </div>
  1110. <div class="modal-footer">
  1111. <button type="button" class="btn btn-sm btn-primary" onclick="batch_reboot();">确定</button>
  1112. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1113. </div>
  1114. </div>
  1115. </div>
  1116. </div>
  1117. <div class="modal" id="force_reboot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1118. <div class="modal-dialog">
  1119. <div class="modal-content">
  1120. <div class="modal-header">
  1121. <h4 class="modal-title">强制重启虚拟机:</h4>
  1122. </div>
  1123. <div class="modal-body">
  1124. <p>您确定要强制重启该虚拟机吗?</p>
  1125. <h3 style="color: orangered;" id="force_reboot_instance_desc"></h3>
  1126. </div>
  1127. <div class="modal-footer">
  1128. <button type="button" class="btn btn-sm btn-primary" onclick="force_reboot_at();">确定</button>
  1129. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1130. </div>
  1131. </div>
  1132. </div>
  1133. </div>
  1134. <div class="modal" id="batch_force_reboot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1135. <div class="modal-dialog">
  1136. <div class="modal-content">
  1137. <div class="modal-header">
  1138. <h4 class="modal-title">批量强制重启虚拟机:</h4>
  1139. </div>
  1140. <div class="modal-body">
  1141. <p></p>
  1142. <p>您确定要执行批量强制重启选定的虚拟机吗?</p>
  1143. </div>
  1144. <div class="modal-footer">
  1145. <button type="button" class="btn btn-sm btn-primary" onclick="batch_force_reboot();">确定</button>
  1146. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1147. </div>
  1148. </div>
  1149. </div>
  1150. </div>
  1151. <div class="modal" id="shutdown_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1152. <div class="modal-dialog">
  1153. <div class="modal-content">
  1154. <div class="modal-header">
  1155. <h4 class="modal-title">停止虚拟机:</h4>
  1156. </div>
  1157. <div class="modal-body">
  1158. <p>您确定要停止该虚拟机吗?</p>
  1159. <h3 style="color: orangered;" id="shutdown_instance_desc"></h3>
  1160. </div>
  1161. <div class="modal-footer">
  1162. <button type="button" class="btn btn-sm btn-primary" onclick="shutdown_at();">确定</button>
  1163. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1164. </div>
  1165. </div>
  1166. </div>
  1167. </div>
  1168. <div class="modal" id="batch_shutdown_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1169. <div class="modal-dialog">
  1170. <div class="modal-content">
  1171. <div class="modal-header">
  1172. <h4 class="modal-title">批量停止虚拟机:</h4>
  1173. </div>
  1174. <div class="modal-body">
  1175. <p></p>
  1176. <p>您确定要执行批量停止选定的虚拟机吗?</p>
  1177. </div>
  1178. <div class="modal-footer">
  1179. <button type="button" class="btn btn-sm btn-primary" onclick="batch_shutdown();">确定</button>
  1180. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1181. </div>
  1182. </div>
  1183. </div>
  1184. </div>
  1185. <div class="modal" id="force_shutdown_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1186. <div class="modal-dialog">
  1187. <div class="modal-content">
  1188. <div class="modal-header">
  1189. <h4 class="modal-title">强制停止虚拟机:</h4>
  1190. </div>
  1191. <div class="modal-body">
  1192. <p>您确定要强制停止该虚拟机吗?</p>
  1193. <h3 style="color: orangered;" id="force_shutdown_instance_desc"></h3>
  1194. </div>
  1195. <div class="modal-footer">
  1196. <button type="button" class="btn btn-sm btn-primary" onclick="force_shutdown_at();">确定</button>
  1197. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1198. </div>
  1199. </div>
  1200. </div>
  1201. </div>
  1202. <div class="modal" id="batch_force_shutdown_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1203. <div class="modal-dialog">
  1204. <div class="modal-content">
  1205. <div class="modal-header">
  1206. <h4 class="modal-title">批量强制停止虚拟机:</h4>
  1207. </div>
  1208. <div class="modal-body">
  1209. <p></p>
  1210. <p>您确定要执行批量强制停止选定的虚拟机吗?</p>
  1211. </div>
  1212. <div class="modal-footer">
  1213. <button type="button" class="btn btn-sm btn-primary" onclick="batch_force_shutdown();">确定</button>
  1214. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1215. </div>
  1216. </div>
  1217. </div>
  1218. </div>
  1219. <div class="modal" id="create_snapshot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1220. <div class="modal-dialog">
  1221. <div class="modal-content">
  1222. <div class="modal-header">
  1223. <h4 class="modal-title">创建快照:</h4>
  1224. </div>
  1225. <div class="modal-body">
  1226. <p>您确定要为该虚拟机创建快照吗?</p>
  1227. <h3 style="color: orangered;" id="create_snapshot_instance_desc"></h3>
  1228. <p></p>
  1229. <input id="snapshot_label" title="快照名称" class="form-control" name="snapshot_label" placeholder="快照名称">
  1230. </div>
  1231. <div class="modal-footer">
  1232. <button type="button" class="btn btn-sm btn-primary" onclick="create_snapshot_at();">确定</button>
  1233. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1234. </div>
  1235. </div>
  1236. </div>
  1237. </div>
  1238. <div class="modal" id="suspend_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1239. <div class="modal-dialog">
  1240. <div class="modal-content">
  1241. <div class="modal-header">
  1242. <h4 class="modal-title">暂停虚拟机:</h4>
  1243. </div>
  1244. <div class="modal-body">
  1245. <p>您确定要暂停该虚拟机吗?</p>
  1246. <h3 style="color: orangered;" id="suspend_instance_desc"></h3>
  1247. </div>
  1248. <div class="modal-footer">
  1249. <button type="button" class="btn btn-sm btn-primary" onclick="suspend_at();">确定</button>
  1250. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1251. </div>
  1252. </div>
  1253. </div>
  1254. </div>
  1255. <div class="modal" id="batch_suspend_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1256. <div class="modal-dialog">
  1257. <div class="modal-content">
  1258. <div class="modal-header">
  1259. <h4 class="modal-title">批量暂停虚拟机:</h4>
  1260. </div>
  1261. <div class="modal-body">
  1262. <p></p>
  1263. <p>您确定要执行批量暂停选定的虚拟机吗?</p>
  1264. </div>
  1265. <div class="modal-footer">
  1266. <button type="button" class="btn btn-sm btn-primary" onclick="batch_suspend();">确定</button>
  1267. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1268. </div>
  1269. </div>
  1270. </div>
  1271. </div>
  1272. <div class="modal" id="resume_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1273. <div class="modal-dialog">
  1274. <div class="modal-content">
  1275. <div class="modal-header">
  1276. <h4 class="modal-title">恢复暂停的虚拟机:</h4>
  1277. </div>
  1278. <div class="modal-body">
  1279. <p>您确定要恢复暂停的该虚拟机吗?</p>
  1280. <h3 style="color: orangered;" id="resume_instance_desc"></h3>
  1281. </div>
  1282. <div class="modal-footer">
  1283. <button type="button" class="btn btn-sm btn-primary" onclick="resume_at();">确定</button>
  1284. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1285. </div>
  1286. </div>
  1287. </div>
  1288. </div>
  1289. <div class="modal" id="batch_resume_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1290. <div class="modal-dialog">
  1291. <div class="modal-content">
  1292. <div class="modal-header">
  1293. <h4 class="modal-title">批量恢复暂停的虚拟机:</h4>
  1294. </div>
  1295. <div class="modal-body">
  1296. <p></p>
  1297. <p>您确定要执行批量恢复暂停的选定的虚拟机吗?</p>
  1298. </div>
  1299. <div class="modal-footer">
  1300. <button type="button" class="btn btn-sm btn-primary" onclick="batch_resume();">确定</button>
  1301. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1302. </div>
  1303. </div>
  1304. </div>
  1305. </div>
  1306. <div class="modal" id="boot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1307. <div class="modal-dialog">
  1308. <div class="modal-content">
  1309. <div class="modal-header">
  1310. <h4 class="modal-title">启动虚拟机:</h4>
  1311. </div>
  1312. <div class="modal-body">
  1313. <p>您确定要启动该虚拟机吗?</p>
  1314. <h3 style="color: orangered;" id="boot_instance_desc"></h3>
  1315. </div>
  1316. <div class="modal-footer">
  1317. <button type="button" class="btn btn-sm btn-primary" onclick="boot_at();">确定</button>
  1318. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1319. </div>
  1320. </div>
  1321. </div>
  1322. </div>
  1323. <div class="modal" id="batch_boot_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1324. <div class="modal-dialog">
  1325. <div class="modal-content">
  1326. <div class="modal-header">
  1327. <h4 class="modal-title">批量启动虚拟机:</h4>
  1328. </div>
  1329. <div class="modal-body">
  1330. <p></p>
  1331. <p>您确定要执行批量启动选定的虚拟机吗?</p>
  1332. </div>
  1333. <div class="modal-footer">
  1334. <button type="button" class="btn btn-sm btn-primary" onclick="batch_boot();">确定</button>
  1335. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1336. </div>
  1337. </div>
  1338. </div>
  1339. </div>
  1340. <div class="modal" id="allocate_bandwidth_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1341. <div class="modal-dialog modal-lg">
  1342. <div class="modal-content">
  1343. <div class="modal-header">
  1344. <h4 class="modal-title">给虚拟机重新分配带宽:</h4>
  1345. </div>
  1346. <div class="modal-body" style="padding-top: 0;">
  1347. <div class="example-box-wrapper">
  1348. <form class="form-horizontal bordered-row">
  1349. <div class="form-group">
  1350. <div class="col-sm-1"></div>
  1351. <label class="col-sm-2 control-label"><span class="glyph-icon icon-elusive-compass-circled"></span>&nbsp;&nbsp;实例名称</label>
  1352. <div class="col-sm-9">
  1353. <h3 style="color: orangered;" id="allocate_bandwidth_instance_desc"></h3>
  1354. </div>
  1355. </div>
  1356. <div class="form-group">
  1357. <div class="col-sm-1"></div>
  1358. <label class="col-sm-2 control-label"><span class="glyph-icon icon-signal"></span>&nbsp;&nbsp;带宽</label>
  1359. <div class="col-sm-7">
  1360. <input id="bandwidth" title="带宽" type="text" name="bandwidth">
  1361. </div>
  1362. <div class="col-sm-2" style="bottom: -10px;">
  1363. <select id="bandwidth_unit" name="bandwidth_unit" title="单位..." class="selectpicker" data-width="80%">
  1364. <option value="k">&nbsp;&nbsp;Kbps</option>
  1365. <option value="m" selected>&nbsp;&nbsp;Mbps</option>
  1366. <option value="g">&nbsp;&nbsp;Gbps</option>
  1367. </select>
  1368. </div>
  1369. </div>
  1370. </form>
  1371. </div>
  1372. </div>
  1373. <div class="modal-footer">
  1374. <button type="button" class="btn btn-sm btn-primary" onclick="allocate_bandwidth_at();">确定</button>
  1375. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1376. </div>
  1377. </div>
  1378. </div>
  1379. </div>
  1380. <div class="modal" id="batch_allocate_bandwidth_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1381. <div class="modal-dialog modal-lg">
  1382. <div class="modal-content">
  1383. <div class="modal-header">
  1384. <h4 class="modal-title">批量分配带宽给虚拟机:</h4>
  1385. </div>
  1386. <div class="modal-body">
  1387. <p></p>
  1388. <p>您确定要给选定的虚拟机重新分配带宽吗?</p>
  1389. <p></p>
  1390. <div class="example-box-wrapper">
  1391. <form class="form-horizontal bordered-row">
  1392. <div class="form-group">
  1393. <div class="col-sm-1"></div>
  1394. <label class="col-sm-2 control-label"><span class="glyph-icon icon-signal"></span>&nbsp;&nbsp;带宽</label>
  1395. <div class="col-sm-7">
  1396. <input id="batch_bandwidth" title="带宽" type="text" name="batch_bandwidth">
  1397. </div>
  1398. <div class="col-sm-2" style="bottom: -10px;">
  1399. <select id="batch_bandwidth_unit" name="batch_bandwidth_unit" title="单位..." class="selectpicker" data-width="80%">
  1400. <option value="k">&nbsp;&nbsp;Kbps</option>
  1401. <option value="m" selected>&nbsp;&nbsp;Mbps</option>
  1402. <option value="g">&nbsp;&nbsp;Gbps</option>
  1403. </select>
  1404. </div>
  1405. </div>
  1406. </form>
  1407. </div>
  1408. </div>
  1409. <div class="modal-footer">
  1410. <button type="button" class="btn btn-sm btn-primary" onclick="batch_allocate_bandwidth();">确定</button>
  1411. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1412. </div>
  1413. </div>
  1414. </div>
  1415. </div>
  1416. <div class="modal" id="adjust_ability_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1417. <div class="modal-dialog modal-lg">
  1418. <div class="modal-content">
  1419. <div class="modal-header">
  1420. <h4 class="modal-title">给虚拟机变更配置:</h4>
  1421. </div>
  1422. <div class="modal-body" style="padding-top: 0;">
  1423. <div class="example-box-wrapper">
  1424. <form id="adjust_ability_form" class="form-horizontal bordered-row">
  1425. <div class="form-group">
  1426. <div class="col-sm-1"></div>
  1427. <label class="col-sm-2 control-label"><span class="glyph-icon icon-elusive-compass-circled"></span>&nbsp;&nbsp;实例名称</label>
  1428. <div class="col-sm-9">
  1429. <h3 style="color: orangered;" id="adjust_ability_instance_desc"></h3>
  1430. </div>
  1431. </div>
  1432. <div class="form-group">
  1433. <div class="col-sm-1"></div>
  1434. <label class="col-sm-2 control-label"><span class="glyph-icon icon-elusive-gauge"></span>&nbsp;&nbsp;运算能力</label>
  1435. <div class="col-sm-9">
  1436. <div class="btn-ability-line" data-toggle="buttons">
  1437. <label class="btn btn-default btn-ability">
  1438. <input title="1 CPU 1GB Memory" name="ability" type="radio" value="1c1g">1&nbsp;&nbsp;核&nbsp;&nbsp;1&nbsp;&nbsp;GB
  1439. </label>
  1440. <label class="btn btn-default btn-ability">
  1441. <input title="1 CPU 2GB Memory" name="ability" type="radio" value="1c2g">1&nbsp;&nbsp;核&nbsp;&nbsp;2&nbsp;&nbsp;GB
  1442. </label>
  1443. <label class="btn btn-default btn-ability">
  1444. <input title="2 CPU 2GB Memory" name="ability" type="radio" value="2c2g">2&nbsp;&nbsp;核&nbsp;&nbsp;2&nbsp;&nbsp;GB
  1445. </label>
  1446. <label class="btn btn-default btn-ability">
  1447. <input title="2 CPU 4GB Memory" name="ability" type="radio" value="2c4g">2&nbsp;&nbsp;核&nbsp;&nbsp;4&nbsp;&nbsp;GB
  1448. </label>
  1449. <label class="btn btn-default btn-ability">
  1450. <input title="4 CPU 4GB Memory" name="ability" type="radio" value="4c4g">4&nbsp;&nbsp;核&nbsp;&nbsp;4&nbsp;&nbsp;GB
  1451. </label>
  1452. <label class="btn btn-default btn-ability">
  1453. <input title="4 CPU 8GB Memory" name="ability" type="radio" value="4c8g">4&nbsp;&nbsp;核&nbsp;&nbsp;8&nbsp;&nbsp;GB
  1454. </label>
  1455. <label class="btn btn-default btn-ability">
  1456. <input title="8 CPU 8GB Memory" name="ability" type="radio" value="8c8g">8&nbsp;&nbsp;核&nbsp;&nbsp;8&nbsp;&nbsp;GB
  1457. </label>
  1458. <label class="btn btn-default btn-ability">
  1459. <input title="8 CPU 16GB Memory" name="ability" type="radio" value="8c16g">8&nbsp;&nbsp;核&nbsp;&nbsp;16GB
  1460. </label>
  1461. <label class="btn btn-default btn-ability">
  1462. <input title="1 CPU 16GB Memory" name="ability" type="radio" value="1c16g">1&nbsp;&nbsp;核&nbsp;&nbsp;16GB
  1463. </label>
  1464. <label class="btn btn-default btn-ability">
  1465. <input title="4 CPU 32GB Memory" name="ability" type="radio" value="4c32g">4&nbsp;&nbsp;核&nbsp;&nbsp;32GB
  1466. </label>
  1467. <label class="btn btn-default btn-ability">
  1468. <input title="4 CPU 64GB Memory" name="ability" type="radio" value="4c64g">4&nbsp;&nbsp;核&nbsp;&nbsp;64GB
  1469. </label>
  1470. <label class="btn btn-default btn-ability">
  1471. <input title="8 CPU 64GB Memory" name="ability" type="radio" value="8c64g">8&nbsp;&nbsp;核&nbsp;&nbsp;64GB
  1472. </label>
  1473. <label class="btn btn-default btn-ability">
  1474. <input title="16 CPU 16GB Memory" name="ability" type="radio" value="16c16g">16核&nbsp;&nbsp;16GB
  1475. </label>
  1476. <label class="btn btn-default btn-ability">
  1477. <input title="24 CPU 24GB Memory" name="ability" type="radio" value="24c24g">24核&nbsp;&nbsp;24GB
  1478. </label>
  1479. <label class="btn btn-default btn-ability">
  1480. <input title="32 CPU 32GB Memory" name="ability" type="radio" value="32c32g">32核&nbsp;&nbsp;32GB
  1481. </label>
  1482. <label class="btn btn-default btn-ability">
  1483. <input title="64 CPU 64GB Memory" name="ability" type="radio" value="64c64g">64核&nbsp;&nbsp;64GB
  1484. </label>
  1485. </div>
  1486. </div>
  1487. </div>
  1488. </form>
  1489. </div>
  1490. </div>
  1491. <div class="modal-footer">
  1492. <button id="adjust_ability_form_button" disabled type="button" class="btn btn-sm btn-primary" onclick="adjust_ability_at();">确定</button>
  1493. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1494. </div>
  1495. </div>
  1496. </div>
  1497. </div>
  1498. <div class="modal" id="batch_adjust_ability_modal" tabindex="-1" role="dialog" style="margin-top: 100px;">
  1499. <div class="modal-dialog modal-lg">
  1500. <div class="modal-content">
  1501. <div class="modal-header">
  1502. <h4 class="modal-title">批量变更虚拟机配置:</h4>
  1503. </div>
  1504. <div class="modal-body">
  1505. <p></p>
  1506. <p>您确定要给选定的虚拟机变更配置吗?</p>
  1507. <p></p>
  1508. <div class="example-box-wrapper">
  1509. <form id="batch_adjust_ability_form" class="form-horizontal bordered-row">
  1510. <div class="form-group">
  1511. <div class="col-sm-1"></div>
  1512. <label class="col-sm-2 control-label"><span class="glyph-icon icon-elusive-gauge"></span>&nbsp;&nbsp;运算能力</label>
  1513. <div class="col-sm-9">
  1514. <div class="btn-ability-line" data-toggle="buttons">
  1515. <label class="btn btn-default btn-ability">
  1516. <input title="1 CPU 1GB Memory" name="ability" type="radio" value="1c1g">1&nbsp;&nbsp;核&nbsp;&nbsp;1&nbsp;&nbsp;GB
  1517. </label>
  1518. <label class="btn btn-default btn-ability">
  1519. <input title="1 CPU 2GB Memory" name="ability" type="radio" value="1c2g">1&nbsp;&nbsp;核&nbsp;&nbsp;2&nbsp;&nbsp;GB
  1520. </label>
  1521. <label class="btn btn-default btn-ability">
  1522. <input title="2 CPU 2GB Memory" name="ability" type="radio" value="2c2g">2&nbsp;&nbsp;核&nbsp;&nbsp;2&nbsp;&nbsp;GB
  1523. </label>
  1524. <label class="btn btn-default btn-ability">
  1525. <input title="2 CPU 4GB Memory" name="ability" type="radio" value="2c4g">2&nbsp;&nbsp;核&nbsp;&nbsp;4&nbsp;&nbsp;GB
  1526. </label>
  1527. <label class="btn btn-default btn-ability">
  1528. <input title="4 CPU 4GB Memory" name="ability" type="radio" value="4c4g">4&nbsp;&nbsp;核&nbsp;&nbsp;4&nbsp;&nbsp;GB
  1529. </label>
  1530. <label class="btn btn-default btn-ability">
  1531. <input title="4 CPU 8GB Memory" name="ability" type="radio" value="4c8g">4&nbsp;&nbsp;核&nbsp;&nbsp;8&nbsp;&nbsp;GB
  1532. </label>
  1533. <label class="btn btn-default btn-ability">
  1534. <input title="8 CPU 8GB Memory" name="ability" type="radio" value="8c8g">8&nbsp;&nbsp;核&nbsp;&nbsp;8&nbsp;&nbsp;GB
  1535. </label>
  1536. <label class="btn btn-default btn-ability">
  1537. <input title="8 CPU 16GB Memory" name="ability" type="radio" value="8c16g">8&nbsp;&nbsp;核&nbsp;&nbsp;16GB
  1538. </label>
  1539. <label class="btn btn-default btn-ability">
  1540. <input title="1 CPU 16GB Memory" name="ability" type="radio" value="1c16g">1&nbsp;&nbsp;核&nbsp;&nbsp;16GB
  1541. </label>
  1542. <label class="btn btn-default btn-ability">
  1543. <input title="4 CPU 32GB Memory" name="ability" type="radio" value="4c32g">4&nbsp;&nbsp;核&nbsp;&nbsp;32GB
  1544. </label>
  1545. <label class="btn btn-default btn-ability">
  1546. <input title="4 CPU 64GB Memory" name="ability" type="radio" value="4c64g">4&nbsp;&nbsp;核&nbsp;&nbsp;64GB
  1547. </label>
  1548. <label class="btn btn-default btn-ability">
  1549. <input title="8 CPU 64GB Memory" name="ability" type="radio" value="8c64g">8&nbsp;&nbsp;核&nbsp;&nbsp;64GB
  1550. </label>
  1551. <label class="btn btn-default btn-ability">
  1552. <input title="16 CPU 16GB Memory" name="ability" type="radio" value="16c16g">16核&nbsp;&nbsp;16GB
  1553. </label>
  1554. <label class="btn btn-default btn-ability">
  1555. <input title="24 CPU 24GB Memory" name="ability" type="radio" value="24c24g">24核&nbsp;&nbsp;24GB
  1556. </label>
  1557. <label class="btn btn-default btn-ability">
  1558. <input title="32 CPU 32GB Memory" name="ability" type="radio" value="32c32g">32核&nbsp;&nbsp;32GB
  1559. </label>
  1560. <label class="btn btn-default btn-ability">
  1561. <input title="64 CPU 64GB Memory" name="ability" type="radio" value="64c64g">64核&nbsp;&nbsp;64GB
  1562. </label>
  1563. </div>
  1564. </div>
  1565. </div>
  1566. </form>
  1567. </div>
  1568. </div>
  1569. <div class="modal-footer">
  1570. <button id="batch_adjust_ability_form_button" type="button" class="btn btn-sm btn-primary" onclick="batch_adjust_ability();">确定</button>
  1571. <button type="button" class="btn btn-sm btn-default" data-dismiss="modal">取消</button>
  1572. </div>
  1573. </div>
  1574. </div>
  1575. </div>
  1576. {% endblock content %}