diff --git a/xCAT-UI/css/style.css b/xCAT-UI/css/style.css index 8286748ff..ae084294f 100644 --- a/xCAT-UI/css/style.css +++ b/xCAT-UI/css/style.css @@ -1,868 +1,873 @@ -/*--- Dialogs ---*/ -.ui-dialog input { - border: solid 1px #BDBDBD; - font: 12px sans-serif; -} - -.ui-dialog label,.ui-dialog input,.ui-dialog p,.ui-dialog button,.ui-dialog td { - font: 12px sans-serif; -} - -.ui-widget { - font: 12px sans-serif; -} - -.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button { - font: 12px sans-serif; -} - -/*--- Tooltip ---*/ -.tooltip { - background-color: #000; - border: 1px solid #fff; - padding: 10px 15px; - display: none; - color: #fff; - text-align: left; - max-width: 300px; - font-size: 10px; - /* Outline radius for firefox only */ - -moz-box-shadow: 0 0 10px #000; - -webkit-box-shadow: 0 0 10px #000; -} - -.tooltip h3 { - margin: 0px; -} - -/*--- Header ---*/ -#header { - height: 39px; - width: 1000px; - margin: 0px auto; - -moz-border-radius: .3em; - -webkit-border-radius: .3em; - border-radius: .3em; -} - -#header ul { - float: left; - list-style: none; - padding: 0 0 0 30px; - margin: 0; - height: 39px; - position: relative; -} - -#header ul li { - display: block; - float: left; - position: relative; -} - -#header ul li a { - text-decoration: none; - cursor: pointer; - float: left; - font: 14px sans-serif; - font-weight: bold; - padding: 11px 30px; - cursor: pointer; -} - -/* User name and log out */ -#header div { - float: right; - margin: 12px; -} - -#header div a { - padding: 0px 6px; - color: #0000FF; - text-decoration: none; - cursor: pointer; - font-weight: normal; -} - -#header div a:hover { - color: #FF0000; -} - -/*--- Body and content ---*/ -body { - background: #1C1C1C; - font: 12px sans-serif; -} - -.content { - -moz-border-radius: .3em; - -webkit-border-radius: .3em; - border-radius: .3em; - width: 1000px; - min-height: 600px; - margin: 10px auto; - background-color: white; - overflow: auto; -} - -.ui-widget-content { - background: white; - color: inherit; -} - -pre { - font-size: 10px; -} - -/*--- Groups ---*/ -#groups { - width: 150px; - vertical-align: top; - float: left; - position: relative; - margin-top: 10px; -} - -#groups ul h3 { - text-transform: uppercase; - color: #424242; - display: inline-table; -} - -#groups a { - color: #0000FF; - display: inline-table; - padding: 5px 0px 5px 20px; /* Top right bottom left */ - text-decoration: none; - cursor: pointer; -} - -#groups .grouplabel { - padding: 5px 0px 5px 10px; - font-weight: bold; - font-size: 15px; -} - -#groups .groupdiv { - padding-left: 10px; -} - -#groups .groupdiv div { - color: blue; - padding: 5px 0px 5px 20px; -} - -#groups .groupdiv div:hover { - background: #E7EBFF; - cursor: pointer; -} - -#groups .selectgroup { - background: #E5E5E5; - font-weight: bold; -} - -#groups .actionDiv { - text-align: right; - padding-right: 5px; - border-top: thin solid #E7EBFF; -} - -/*--- Nodes section ---*/ -#nodes { - width: 790px; - min-height: 570px; - margin: 10px 0px 0px 0px; - padding: 0px 0px 0px 5px; - display: inline-block; - border-left: medium solid #E5E5E5; -} - -.summarypie { - width: 260px; - height: 220px; -} - -.summarypie td { - min-width: 0px; -} - -#summaryTab td { - border: 0px; - padding: 0px; - text-align: left; - line-height: 1; -} - -/*--- Info and warning bar ---*/ -span.ui-icon-info { - float: left; - margin-right: 0.3em; -} - -.ui-icon { - float: left; -} - -.ui-button { - display: inline-block; - position: relative; - padding: 0; - margin: 5px; - text-decoration: none !important; - cursor: pointer; - text-align: center; - zoom: 1; - overflow: visible; - text-align: center -} - -/*--- jQuery tabs ---*/ -.tab { - font: 12px sans-serif; - border-style: none; - overflow: visible; -} - -.tab p { - word-wrap: break-word; -} - -.tab a { - cursor: pointer; -} - -.tab .ui-icon-close { - float: left; - cursor: pointer; -} - -/*--- Inventory and user entry ---*/ -.tab table { - border-width: 1px; - border-spacing: 0px; - border-style: solid; - border-color: #BDBDBD; - border-collapse: collapse; -} - -.tab th { - font: bold 12px sans-serif; - padding: 10px; - border-width: 1px; - border-style: solid; - vertical-align: middle; - text-align: center; -} - -.tab td { - font: 12px sans-serif; - padding: 5px 15px; - border-width: 1px; - border-style: solid; - border-color: #BDBDBD; - vertical-align: middle; -} - -.tab table a { - color: blue; -} - -.tab span a,.tab li a { - text-decoration: none; - cursor: pointer; -} - -fieldset { - margin-bottom: 5px; - border-width: 1px 0 0 0; - border-style: solid none none none; - border-color: gray; -} - -.tab label { - color: #424242; - display: inline-block; - line-height: 1.5; - vertical-align: top; - width: 140px; -} - -legend { - font: 12px sans-serif; - color: #424242; - font-weight: bold; - padding: 10px 5px; -} - -.tab ol { - margin: 0; - padding: 0; -} - -.tab li { - list-style: none; - padding: 5px; - margin: 1; -} - -.tab textarea { - font: 12px sans-serif; - border: solid 0px #BDBDBD; - padding: 5px; - display: inline-table; - width: 400px; - height: 300px; -} - -/*--- menu Div Actions bar ---*/ -.menuDiv { - padding: 0.5em; - height: 30px; -} - -.sf-menu { - border-radius: 0.3em 0.3em 0.3em 0.3em; - margin-bottom: 0; - background: none; - border: 0px solid; -} - -.sf-menu ul li { - width: 99%; -} - -.sf-menu .sf-menu { - border: 0px solid; -} - -.sf-menu li:hover,.sf-menu li.sfHover { - background: none; -} - -.sf-sub-indicator { - right: 0; -} - -.actionBar { - display: inline-table; -} - -.actionBar div { - padding: 10px 0px; -} - -.actionBar a { - font-weight: bold; -} - -.actionBar li { - list-style: none; - margin: 0; -} - -/*--- jQuery datatable ---*/ -.dataTables_wrapper { - width: auto; - margin: 10px auto; - -moz-border-radius: 3px; - -webkit-border-radius: 3px; - border-radius: 3px; - background-color: #f5f5f5; -} - -/*** Show X entries ***/ -.dataTables_length { - width: 40%; - float: left; - padding: 10px 20px; - text-align: left; -} - -/*** Search ***/ -.dataTables_filter { - width: 40%; - display: block; - float: right; - text-align: right; - margin: 5px 0px; -} - -.tab input,select { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - padding: 4px; -} - -/*** Showing X to X of X entries ***/ -.dataTables_info { - padding: 10px 20px; - width: 40%; - float: left; -} - -/*** < > buttons ***/ -.paginate_disabled_previous,.paginate_enabled_previous,.paginate_disabled_next,.paginate_enabled_next { - height: 19px; - width: 19px; - margin-left: 2px; - float: left; -} - -/*** Table ***/ -.datatable { - width: 100%; - border-spacing: 0px; - border-collapse: collapse; - display: inline-table; -} - -.dataTables_filter label { - display: inline; - vertical-align: middle; -} - -.datatable th,td { - font: 12px sans-serif; - padding: 5px 0px; - white-space: nowrap; /* Do not use word wrap */ - vertical-align: middle; - text-align: center; - min-width: 30px; -} - -.datatable th { - font: bold 12px sans-serif; - border-width: 0px; -} - -.form .datatable th,td { - font: 12px sans-serif; - padding: 5px 0px; - white-space: nowrap; /* Do not use word wrap */ - vertical-align: middle; - text-align: center; - min-width: 30px; -} - -.form .datatable th { - font: bold 12px sans-serif; - border-width: 0px; -} - -/*** Row color (odd) ***/ -.datatable tr.odd { - background-color: #E0ECF8; -} - -.datatable tr.odd td.sorting_1 { - background-color: #A9D0F5; -} - -/*** Row color (even) ***/ -.datatable tr.even { - background-color: #EFF5FB; -} - -.datatable tr.even td.sorting_1 { - background-color: #CEE3F6; -} - -.datatable a { - text-decoration: none; - color: blue; - cursor: pointer; -} - -.datatable a:hover { - color: #FF0000; -} - -/*--- Editable column ---*/ -.tab .datatable textarea { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - overflow: hidden; -} - -.tab .datatable button { - border: solid 1px #BDBDBD; - -moz-border-radius: .3em; - -webkit-border-radius: .3em; - padding: 5px 10px; - margin: 0 10px; - background-color: #D8D8D8; - color: #424242; - font-size: 12px; -} - -.tab .datatable button:hover { - background-color: #E6E6E6; -} - -.sorting_asc,.sorting_desc,.sorting { - background: none; -} - -/*--- jQuery context menu ---*/ -.context-menu-theme-vista { - background: #FAFAFA url(../images/contextmenu/context-menu-bg.gif) - repeat-y left top; - border: 1px solid #868686; -} - -.context-menu-theme-vista .context-menu-item { - text-align: left; - cursor: pointer; - color: black; - font-size: 12px; -} - -.context-menu-theme-vista .context-menu-separator { - margin: 0px 0px 0px 32px; - font-size: 0px; - border-top: 1px solid #C5C5C5; - border-bottom: 1px solid #F5F5F5; -} - -.context-menu-theme-vista .context-menu-item-hover { - background: transparent - url(../images/contextmenu/context-menu-item-hover.gif) repeat-x left - center; - border: 1px solid #D7D0B3; -} - -.context-menu-theme-vista .context-menu-item .context-menu-item-inner { - padding: 4px 16px 4px 35px; - margin-left: 1px; - background-color: none; - background-repeat: no-repeat; - background-position: 3px center; - background-image: none; -} - -.context-menu-theme-vista .context-menu-item-hover .context-menu-item-inner { - padding: 3px 15px 3px 35px; - margin-left: 0px; -} - -.context-menu-theme-vista .context-menu-item-disabled { - color: #A7A7A7; -} - -/*--- Forms ---*/ -.form label { - color: #424242; - line-height: 1.5; - vertical-align: middle; - width: 140px; - padding: 0px 0px 0px 20px; - display: inline-block; -} - -.form div { - margin: 5px 0; - display: block; -} - -.form ol { - margin: 0; - padding: 0; -} - -.form li { - list-style: none; - padding: 5px 5px 5px 20px; - margin: 0; -} - -.form .indent { - display: inline-table; -} - -.form input,.form textarea,.form select { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - padding: 5px; - display: inline-block; -} - -.form textarea { - width: 350px; - height: 150px; -} - -.form table { - border-width: 1px; - border-spacing: 0px; - border-style: solid; - border-color: #BDBDBD; - border-collapse: collapse; -} - -.form th { - font: bold 12px sans-serif; - padding: 10px; - border-width: 1px; - border-style: solid; - vertical-align: middle; - text-align: center; -} - -.form td { - font: 12px sans-serif; - padding: 5px 15px; - border-width: 1px; - border-style: solid; - border-color: #BDBDBD; - vertical-align: middle; -} - -.form table a { - color: blue; -} - -/*--- Datatable header and body ---*/ -.form .dataTables_wrapper div { - margin: 0px; -} - -table a { - font: 12px sans-serif; - text-decoration: none; - color: #0000FF; - cursor: pointer; -} - -table a:hover { - color: #FF0000; -} - -.button { - padding: 3px 10px; - margin: 0 10px; - background-color: #314e90; - border: solid 1px #f4f4f4; - color: #ffffff; - font-weight: bold; - font-size: 12px; -} - -.button:hover { - border: solid 1px #d4d4d4; -} - -/*--- Provision disk table ---*/ -.provision table { - border-width: 1px; - border-spacing: 0px; - border-style: solid; - border-color: #BDBDBD; - border-collapse: collapse; - display: inline-table; -} - -.provision input { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - padding: 3px; - width: 60px; -} - -/*--- Provision and clone table ---*/ -.special table { - border-width: 1px; - border-spacing: 0px; - border-style: solid; - border-color: #BDBDBD; - border-collapse: collapse; - display: inline-table; -} - -.special input { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - padding: 3px; -} - -/*--- Provision and monitor forms ---*/ -.monitor-normal { - background: #66CD00; - cursor: pointer; -} - -.mornitor-warning { - background: #FFD700; - cursor: pointer; -} - -.monitor-error { - background: #FF3030; -} - -.monitor-unknown { - background: #8B8B7A; -} - -.monitor-node-li { - width: 10px; - height: 10px; - float: left; - border: 1px solid white; -} - -.monitor-sum-div { - width: 300px; - height: 180px; - float: left; - margin: 0px 0px 10px 10px; -} - -.monitor-sum-div td { - padding: 0; - border-style: none; - font-size: 10px; -} - -.monitor-node-div { - width: 240px; - height: 120px; - margin: 0px 0px 15px 0px; -} - -.monitor-zoom-link { - cursor: pointer; - color: blue; -} - -.provision div,.monitor div { - margin: 10px 0; - display: block; -} - -.provision textarea,.monitor textarea { - font: 12px sans-serif; - border: solid 1px #BDBDBD; - padding: 5px; - display: inline-table; - width: 350px; - height: 150px; -} - -/*--- Physical layout section ---*/ -.frameDiv { - width: 179px; - height: 500px; - font-size: 10px; - background: url(../images/nodes/bpa.jpg); - border-width: 2px; - text-align: left; - white-space: normal; -} - -.fspDiv2 { - font-size: 12px; - height: 21px; - line-height: 21px; - width: 140px; - text-align: center; - background: url(../images/nodes/2ufsp.jpg); - border-style: solid; - border-width: 1px; - cursor: pointer; - display: inline-block; -} - -.fspDiv4 { - font-size: 12px; - height: 44px; - line-height: 44px; - width: 140px; - text-align: center; - background: url(../images/nodes/4ufsp.jpg); - border-style: solid; - border-width: 1px; - cursor: pointer; - display: inline-block; -} - -.fspDiv42 { - width: 179px; - height: 500px; - font-size: 15px; - background: url(../images/nodes/42ufsp.jpg); - border-width: 2px; - cursor: pointer; -} - -.lparDiv { - margin: 1px 0px 0px 1px; - width: 80px; - height: 10px; - opacity: 1; -} - -.lparStatus { - min-width: 10px; - height: 11px; -} - -.fspCheckbox { - padding: 0px; - margin: 3px 3px 1px 3px; -} - -.chasisDiv { - width: 172px; - height: 108px; - font-size: 10px; - background: url(../images/nodes/chasis.jpg); - border-width: 2px; - text-align: left; - white-space: normal; - padding: 11px 0px 0px 11px; -} - -.bladeDiv { - float: left; - width: 11px; - height: 89px; - text-align: left; - white-space: normal; -} - -.bladeInsertDiv { - background: url(../images/nodes/blade.jpg); -} - -.xNodeDiv { - font-size: 12px; - height: 21px; - line-height: 21px; - width: 140px; - text-align: center; - background: url(../images/nodes/2ufsp.jpg); - border-style: solid; - border-width: 1px; - cursor: pointer; - display: inline-block; -} - -/*--- jqPlot Pie legend ---*/ -td.jqplot-table-legend { - border-width: 0px; -} - -td.jqplot-table-legend>div { - border-width: 0px; -} - -/*--- setup wizard section ---*/ -#discoverTab table{ - border-style: none; -} - -#discoverTab td{ - border-style: none; - text-align: left; +/*--- Dialogs ---*/ +.ui-dialog input { + border: solid 1px #BDBDBD; + font: 12px sans-serif; +} + +.ui-dialog label,.ui-dialog input,.ui-dialog p,.ui-dialog button,.ui-dialog td { + font: 12px sans-serif; +} + +.ui-widget { + font: 12px sans-serif; +} + +.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button { + font: 12px sans-serif; +} + +/*--- Tooltip ---*/ +.tooltip { + background-color: #000; + border: 1px solid #fff; + padding: 10px 15px; + display: none; + color: #fff; + text-align: left; + max-width: 300px; + font-size: 10px; + /* Outline radius for firefox only */ + -moz-box-shadow: 0 0 10px #000; + -webkit-box-shadow: 0 0 10px #000; +} + +.tooltip h3 { + margin: 0px; +} + +/*--- Header ---*/ +#header { + height: 39px; + width: 1000px; + margin: 0px auto; + -moz-border-radius: .3em; + -webkit-border-radius: .3em; + border-radius: .3em; +} + +#header ul { + float: left; + list-style: none; + padding: 0 0 0 30px; + margin: 0; + height: 39px; + position: relative; +} + +#header ul li { + display: block; + float: left; + position: relative; +} + +#header ul li a { + text-decoration: none; + cursor: pointer; + float: left; + font: 14px sans-serif; + font-weight: bold; + padding: 11px 30px; + cursor: pointer; +} + +/* User name and log out */ +#header div { + float: right; + margin: 12px; +} + +#header div a { + padding: 0px 6px; + color: #0000FF; + text-decoration: none; + cursor: pointer; + font-weight: normal; +} + +#header div a:hover { + color: #FF0000; +} + +/*--- Body and content ---*/ +body { + background: #1C1C1C; + font: 12px sans-serif; +} + +.content { + -moz-border-radius: .3em; + -webkit-border-radius: .3em; + border-radius: .3em; + width: 1000px; + min-height: 600px; + margin: 10px auto; + background-color: white; + overflow: auto; +} + +.ui-widget-content { + background: white; + color: inherit; +} + +pre { + font-size: 10px; +} + +/*--- Groups ---*/ +#groups { + width: 150px; + vertical-align: top; + float: left; + position: relative; + margin-top: 10px; +} + +#groups ul h3 { + text-transform: uppercase; + color: #424242; + display: inline-table; +} + +#groups a { + color: #0000FF; + display: inline-table; + padding: 5px 0px 5px 20px; /* Top right bottom left */ + text-decoration: none; + cursor: pointer; +} + +#groups .grouplabel { + padding: 5px 0px 5px 10px; + font-weight: bold; + font-size: 15px; +} + +#groups .groupdiv { + padding-left: 10px; +} + +#groups .groupdiv div { + color: blue; + padding: 5px 0px 5px 20px; +} + +#groups .groupdiv div:hover { + background: #E7EBFF; + cursor: pointer; +} + +#groups .selectgroup { + background: #E5E5E5; + font-weight: bold; +} + +#groups .actionDiv { + text-align: right; + padding-right: 5px; + border-top: thin solid #E7EBFF; +} + +/*--- Nodes section ---*/ +#nodes { + width: 790px; + min-height: 570px; + margin: 10px 0px 0px 0px; + padding: 0px 0px 0px 5px; + display: inline-block; + border-left: medium solid #E5E5E5; +} + +.summarypie { + width: 260px; + height: 220px; +} + +.summarypie td { + min-width: 0px; +} + +#summaryTab td { + border: 0px; + padding: 0px; + text-align: left; + line-height: 1; +} + +/*--- Info and warning bar ---*/ +span.ui-icon-info { + float: left; + margin-right: 0.3em; +} + +.ui-icon { + float: left; +} + +.ui-button { + display: inline-block; + position: relative; + padding: 0; + margin: 5px; + text-decoration: none !important; + cursor: pointer; + text-align: center; + zoom: 1; + overflow: visible; + text-align: center +} + +/*--- jQuery tabs ---*/ +.tab { + font: 12px sans-serif; + border-style: none; + overflow: visible; +} + +.tab p { + word-wrap: break-word; +} + +.tab a { + cursor: pointer; +} + +.tab .ui-icon-close { + float: left; + cursor: pointer; +} + +/*--- Inventory and user entry ---*/ +.tab table { + border-width: 1px; + border-spacing: 0px; + border-style: solid; + border-color: #BDBDBD; + border-collapse: collapse; +} + +.tab th { + font: bold 12px sans-serif; + padding: 10px; + border-width: 1px; + border-style: solid; + vertical-align: middle; + text-align: center; +} + +.tab td { + font: 12px sans-serif; + padding: 5px 15px; + border-width: 1px; + border-style: solid; + border-color: #BDBDBD; + vertical-align: middle; +} + +.tab table a { + color: blue; +} + +.tab span a,.tab li a { + text-decoration: none; + cursor: pointer; +} + +fieldset { + margin-bottom: 5px; + border-width: 1px 0 0 0; + border-style: solid none none none; + border-color: gray; +} + +.tab label { + color: #424242; + display: inline-block; + line-height: 1.5; + vertical-align: top; + width: 140px; +} + +legend { + font: 12px sans-serif; + color: #424242; + font-weight: bold; + padding: 10px 5px; +} + +.tab ol { + margin: 0; + padding: 0; +} + +.tab li { + list-style: none; + padding: 5px; + margin: 1; +} + +.tab textarea { + font: 12px sans-serif; + border: solid 0px #BDBDBD; + padding: 5px; + display: inline-table; + width: 400px; + height: 300px; +} + +/*--- menu Div Actions bar ---*/ +.menuDiv { + padding: 0.5em; + height: 30px; +} + +.sf-menu { + border-radius: 0.3em 0.3em 0.3em 0.3em; + margin-bottom: 0; + background: none; + border: 0px solid; +} + +.sf-menu ul li { + width: 99%; +} + +.sf-menu .sf-menu { + border: 0px solid; +} + +.sf-menu li:hover,.sf-menu li.sfHover { + background: none; +} + +.sf-sub-indicator { + right: 0; +} + +.actionBar { + display: inline-table; +} + +.actionBar div { + padding: 10px 0px; +} + +.actionBar a { + font-weight: bold; +} + +.actionBar li { + list-style: none; + margin: 0; +} + +/*--- jQuery datatable ---*/ +.dataTables_wrapper { + width: auto; + margin: 10px auto; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + background-color: #f5f5f5; +} + +/*** Show X entries ***/ +.dataTables_length { + width: 40%; + float: left; + padding: 10px 20px; + text-align: left; +} + +/*** Search ***/ +.dataTables_filter { + width: 40%; + display: block; + float: right; + text-align: right; + margin: 5px 0px; +} + +.tab input,select { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + padding: 4px; +} + +/*** Showing X to X of X entries ***/ +.dataTables_info { + padding: 10px 20px; + width: 40%; + float: left; +} + +/*** < > buttons ***/ +.paginate_disabled_previous,.paginate_enabled_previous,.paginate_disabled_next,.paginate_enabled_next { + height: 19px; + width: 19px; + margin-left: 2px; + float: left; +} + +/*** Table ***/ +.datatable { + width: 100%; + border-spacing: 0px; + border-collapse: collapse; + display: inline-table; +} + +.dataTables_filter label { + display: inline; + vertical-align: middle; +} + +.datatable th,td { + font: 12px sans-serif; + padding: 5px 0px; + white-space: nowrap; /* Do not use word wrap */ + vertical-align: middle; + text-align: center; + min-width: 30px; +} + +.datatable th { + font: bold 12px sans-serif; + border-width: 0px; +} + +.form .datatable th,td { + font: 12px sans-serif; + padding: 5px 0px; + white-space: nowrap; /* Do not use word wrap */ + vertical-align: middle; + text-align: center; + min-width: 30px; +} + +.form .datatable th { + font: bold 12px sans-serif; + border-width: 0px; +} + +/*** Row color (odd) ***/ +.datatable tr.odd { + background-color: #E0ECF8; +} + +.datatable tr.odd td.sorting_1 { + background-color: #A9D0F5; +} + +/*** Row color (even) ***/ +.datatable tr.even { + background-color: #EFF5FB; +} + +.datatable tr.even td.sorting_1 { + background-color: #CEE3F6; +} + +.datatable a { + text-decoration: none; + color: blue; + cursor: pointer; +} + +.datatable a:hover { + color: #FF0000; +} + +#zNetworkDataTable.datatable td { + vertical-align: top; + text-align: top; +} + +/*--- Editable column ---*/ +.tab .datatable textarea { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + overflow: hidden; +} + +.tab .datatable button { + border: solid 1px #BDBDBD; + -moz-border-radius: .3em; + -webkit-border-radius: .3em; + padding: 5px 10px; + margin: 0 10px; + background-color: #D8D8D8; + color: #424242; + font-size: 12px; +} + +.tab .datatable button:hover { + background-color: #E6E6E6; +} + +.sorting_asc,.sorting_desc,.sorting { + background: none; +} + +/*--- jQuery context menu ---*/ +.context-menu-theme-vista { + background: #FAFAFA url(../images/contextmenu/context-menu-bg.gif) + repeat-y left top; + border: 1px solid #868686; +} + +.context-menu-theme-vista .context-menu-item { + text-align: left; + cursor: pointer; + color: black; + font-size: 12px; +} + +.context-menu-theme-vista .context-menu-separator { + margin: 0px 0px 0px 32px; + font-size: 0px; + border-top: 1px solid #C5C5C5; + border-bottom: 1px solid #F5F5F5; +} + +.context-menu-theme-vista .context-menu-item-hover { + background: transparent + url(../images/contextmenu/context-menu-item-hover.gif) repeat-x left + center; + border: 1px solid #D7D0B3; +} + +.context-menu-theme-vista .context-menu-item .context-menu-item-inner { + padding: 4px 16px 4px 35px; + margin-left: 1px; + background-color: none; + background-repeat: no-repeat; + background-position: 3px center; + background-image: none; +} + +.context-menu-theme-vista .context-menu-item-hover .context-menu-item-inner { + padding: 3px 15px 3px 35px; + margin-left: 0px; +} + +.context-menu-theme-vista .context-menu-item-disabled { + color: #A7A7A7; +} + +/*--- Forms ---*/ +.form label { + color: #424242; + line-height: 1.5; + vertical-align: middle; + width: 140px; + padding: 0px 0px 0px 20px; + display: inline-block; +} + +.form div { + margin: 5px 0; + display: block; +} + +.form ol { + margin: 0; + padding: 0; +} + +.form li { + list-style: none; + padding: 5px 5px 5px 20px; + margin: 0; +} + +.form .indent { + display: inline-table; +} + +.form input,.form textarea,.form select { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + padding: 5px; + display: inline-block; +} + +.form textarea { + width: 350px; + height: 150px; +} + +.form table { + border-width: 1px; + border-spacing: 0px; + border-style: solid; + border-color: #BDBDBD; + border-collapse: collapse; +} + +.form th { + font: bold 12px sans-serif; + padding: 10px; + border-width: 1px; + border-style: solid; + vertical-align: middle; + text-align: center; +} + +.form td { + font: 12px sans-serif; + padding: 5px 15px; + border-width: 1px; + border-style: solid; + border-color: #BDBDBD; + vertical-align: middle; +} + +.form table a { + color: blue; +} + +/*--- Datatable header and body ---*/ +.form .dataTables_wrapper div { + margin: 0px; +} + +table a { + font: 12px sans-serif; + text-decoration: none; + color: #0000FF; + cursor: pointer; +} + +table a:hover { + color: #FF0000; +} + +.button { + padding: 3px 10px; + margin: 0 10px; + background-color: #314e90; + border: solid 1px #f4f4f4; + color: #ffffff; + font-weight: bold; + font-size: 12px; +} + +.button:hover { + border: solid 1px #d4d4d4; +} + +/*--- Provision disk table ---*/ +.provision table { + border-width: 1px; + border-spacing: 0px; + border-style: solid; + border-color: #BDBDBD; + border-collapse: collapse; + display: inline-table; +} + +.provision input { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + padding: 3px; + width: 60px; +} + +/*--- Provision and clone table ---*/ +.special table { + border-width: 1px; + border-spacing: 0px; + border-style: solid; + border-color: #BDBDBD; + border-collapse: collapse; + display: inline-table; +} + +.special input { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + padding: 3px; +} + +/*--- Provision and monitor forms ---*/ +.monitor-normal { + background: #66CD00; + cursor: pointer; +} + +.mornitor-warning { + background: #FFD700; + cursor: pointer; +} + +.monitor-error { + background: #FF3030; +} + +.monitor-unknown { + background: #8B8B7A; +} + +.monitor-node-li { + width: 10px; + height: 10px; + float: left; + border: 1px solid white; +} + +.monitor-sum-div { + width: 300px; + height: 180px; + float: left; + margin: 0px 0px 10px 10px; +} + +.monitor-sum-div td { + padding: 0; + border-style: none; + font-size: 10px; +} + +.monitor-node-div { + width: 240px; + height: 120px; + margin: 0px 0px 15px 0px; +} + +.monitor-zoom-link { + cursor: pointer; + color: blue; +} + +.provision div,.monitor div { + margin: 10px 0; + display: block; +} + +.provision textarea,.monitor textarea { + font: 12px sans-serif; + border: solid 1px #BDBDBD; + padding: 5px; + display: inline-table; + width: 350px; + height: 150px; +} + +/*--- Physical layout section ---*/ +.frameDiv { + width: 179px; + height: 500px; + font-size: 10px; + background: url(../images/nodes/bpa.jpg); + border-width: 2px; + text-align: left; + white-space: normal; +} + +.fspDiv2 { + font-size: 12px; + height: 21px; + line-height: 21px; + width: 140px; + text-align: center; + background: url(../images/nodes/2ufsp.jpg); + border-style: solid; + border-width: 1px; + cursor: pointer; + display: inline-block; +} + +.fspDiv4 { + font-size: 12px; + height: 44px; + line-height: 44px; + width: 140px; + text-align: center; + background: url(../images/nodes/4ufsp.jpg); + border-style: solid; + border-width: 1px; + cursor: pointer; + display: inline-block; +} + +.fspDiv42 { + width: 179px; + height: 500px; + font-size: 15px; + background: url(../images/nodes/42ufsp.jpg); + border-width: 2px; + cursor: pointer; +} + +.lparDiv { + margin: 1px 0px 0px 1px; + width: 80px; + height: 10px; + opacity: 1; +} + +.lparStatus { + min-width: 10px; + height: 11px; +} + +.fspCheckbox { + padding: 0px; + margin: 3px 3px 1px 3px; +} + +.chasisDiv { + width: 172px; + height: 108px; + font-size: 10px; + background: url(../images/nodes/chasis.jpg); + border-width: 2px; + text-align: left; + white-space: normal; + padding: 11px 0px 0px 11px; +} + +.bladeDiv { + float: left; + width: 11px; + height: 89px; + text-align: left; + white-space: normal; +} + +.bladeInsertDiv { + background: url(../images/nodes/blade.jpg); +} + +.xNodeDiv { + font-size: 12px; + height: 21px; + line-height: 21px; + width: 140px; + text-align: center; + background: url(../images/nodes/2ufsp.jpg); + border-style: solid; + border-width: 1px; + cursor: pointer; + display: inline-block; +} + +/*--- jqPlot Pie legend ---*/ +td.jqplot-table-legend { + border-width: 0px; +} + +td.jqplot-table-legend>div { + border-width: 0px; +} + +/*--- setup wizard section ---*/ +#discoverTab table{ + border-style: none; +} + +#discoverTab td{ + border-style: none; + text-align: left; } \ No newline at end of file diff --git a/xCAT-UI/js/configure/configure.js b/xCAT-UI/js/configure/configure.js index 01a67b3ed..33cac8c41 100644 --- a/xCAT-UI/js/configure/configure.js +++ b/xCAT-UI/js/configure/configure.js @@ -1,556 +1,560 @@ -/** - * Global variables - */ -var configTabs; // Config tabs -var configDatatables = new Object(); // Datatables on the config page - -/** - * Set the datatable - * - * @param id The ID of the datatable - * @param obj Datatable object - */ -function setConfigDatatable(id, obj) { - configDatatables[id] = obj; -} - -/** - * Get the datatable with the given ID - * - * @param id The ID of the datatable - * @return Datatable object - */ -function getConfigDatatable(id) { - return configDatatables[id]; -} - -/** - * Set the configure tab - * - * @param obj Tab object - */ -function setConfigTab(obj) { - configTabs = obj; -} - -/** - * Get the configure tab - * - * @param Nothing - * @return Tab object - */ -function getConfigTab() { - return configTabs; -} - -/** - * Load configure page - */ -function loadConfigPage() { - // If the configure page has already been loaded - if ($('#content').children().length) { - // Do not reload configure page - return; - } - - // Create configure tab - var tab = new Tab(); - setConfigTab(tab); - tab.init(); - $('#content').append(tab.object()); - - // Create loader - var loader = $('
').append(createLoader()); - - // Add tab to configure xCAT tables - tab.add('configTablesTab', 'Tables', loader, false); - - // Add the update tab - tab.add('updateTab', 'Update', '', false); - - // Add the self-service tab - tab.add('usersTab', 'Users', '', false); - - // Add the discover tab - tab.add('discoverTab', 'Discover', '', false); - - // Add the self-service tab - tab.add('serviceTab', 'Service', '', false); - - // Get list of tables and their descriptions - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : '-d', - msg : '' - }, - - success : loadTableNames - }); - - // Do not load everything at once - // Load when tab is shown - tab.object().bind('tabsshow', function(event, ui) { - if ($(ui.panel).children().length) { - return; - } - - if (ui.index == 1) { - loadUpdatePage(); - } else if (ui.index == 2) { - loadUserPage(); - } else if (ui.index == 3) { - loadDiscoverPage(); - } else if (ui.index == 4) { - loadServicePage(); - } - }); -} - -/** - * Load xCAT database table names and their descriptions - * - * @param data Data returned from HTTP request - */ -function loadTableNames(data) { - // Get output - var tables = data.rsp; - - // Remove loader - var tabId = 'configTablesTab'; - $('#' + tabId).find('img').hide(); - - // Create a groups division - var tablesDIV = $('
'); - $('#' + tabId).append(tablesDIV); - - // Create info bar - var infoBar = createInfoBar('Select a table to view or edit.'); - tablesDIV.append(infoBar); - - // Create a list for the tables - var list = $(''); - // Loop through each table - for ( var i = 0; i < tables.length; i++) { - // Create a link for each table - var args = tables[i].split(':'); - var link = $('' + args[0] + ''); - - // Open table on click - link.bind('click', function(e) { - // Get table ID that was clicked - var id = (e.target) ? e.target.id : e.srcElement.id; - - // Create loader - var loader = $('
').append(createLoader()); - - // Add a new tab for this table - var configTab = getConfigTab(); - if (!$('#' + id + 'Tab').length) { - configTab.add(id + 'Tab', id, loader, true); - - // Get contents of selected table - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : id, - msg : id - }, - - success : loadTable - }); - } - - // Select new tab - configTab.select(id + 'Tab'); - }); - - var item = $('
  • '); - item.append(link); - - // Append the table description - item.append(': ' + args[1]); - - // Append item to list - list.append(item); - } - - tablesDIV.append(list); -} - -/** - * Load a given database table - * - * @param data Data returned from HTTP request - */ -function loadTable(data) { - // Get response - var rsp = data.rsp; - // Get table ID - var id = data.msg; - - // Remove loader - var tabId = id + 'Tab'; - $('#' + tabId).find('img').remove(); - - // Create info bar - var infoBar = createInfoBar('Click on a cell to edit. Click outside the table to write to the cell. Once you are satisfied with how the table looks, click on Save.'); - $('#' + tabId).append(infoBar); - - // Create action bar - var actionBar = $('
    '); - $('#' + tabId).append(actionBar); - - // Get table headers - var args = rsp[0].replace('#', ''); - var headers = args.split(','); - - // Create container for original table contents - var origCont = new Array(); // Original table content - origCont[0] = rsp[0].split(','); // Headers - - // Create container for new table contents - var newCont = new Object(); - var tmp = new Object(); - tmp[0] = '#' + headers[0]; // Put a # in front of the header - for ( var i = 1; i < headers.length; i++) { - tmp[i] = headers[i]; - } - newCont[0] = tmp; - - // Create a new datatable - var tableId = id + 'Datatable'; - var table = new DataTable(tableId); - - // Add column for the remove row button - headers.unshift(''); - table.init(headers); - headers.shift(); - - // Append datatable to tab - $('#' + tabId).append(table.object()); - - // Add table rows - // Start with the 2nd row (1st row is the headers) - for ( var i = 1; i < rsp.length; i++) { - // Split into columns - var cols = rsp[i].split(','); - - // Go through each column - for ( var j = 0; j < cols.length; j++) { - - // If the column is not complete - if (cols[j].count('"') == 1) { - while (cols[j].count('"') != 2) { - // Merge this column with the adjacent one - cols[j] = cols[j] + "," + cols[j + 1]; - - // Remove merged row - cols.splice(j + 1, 1); - } - } - - // Replace quote - cols[j] = cols[j].replace(new RegExp('"', 'g'), ''); - } - - // Add remove button - cols.unshift(''); - - // Add row - table.add(cols); - - // Save original table content - origCont[i] = cols; - } - - // Turn table into datatable - var dTable = $('#' + id + 'Datatable').dataTable({ - 'iDisplayLength': 50, - 'bLengthChange': false, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - - /** - * Enable editable columns - */ - // Do not make 1st column editable - $('#' + tableId + ' td:not(td:nth-child(1))').editable( - function(value, settings) { - // Get column index - var colPos = this.cellIndex; - // Get row index - var rowPos = dTable.fnGetPosition(this.parentNode); - - // Update datatable - dTable.fnUpdate(value, rowPos, colPos); - - return (value); - }, { - onblur : 'submit', // Clicking outside editable area submits changes - type : 'textarea', - placeholder: ' ', - height : '30px' // The height of the text area - }); - - // Create action bar - var actionBar = $('
    '); - - var saveLnk = $('Save'); - saveLnk.click(function() { - // Get table ID and name - var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); - var tableName = tableId.replace('Datatable', ''); - - // Get datatable - var dTable = $('#' + tableId).dataTable(); - // Get the nodes from the table - var dRows = dTable.fnGetNodes(); - - // Go through each row - for ( var i = 0; i < dRows.length; i++) { - // If there is row with values - if (dRows[i]) { - // Go through each column - // Ignore the 1st column because it is a button - var cols = dRows[i].childNodes; - var vals = new Object(); - for ( var j = 1; j < cols.length; j++) { - var val = cols.item(j).firstChild.nodeValue; - - // Insert quotes - if (val == ' ') { - vals[j - 1] = ''; - } else { - vals[j - 1] = val; - } - } - - // Save row - newCont[i + 1] = vals; - } - } - - // Update xCAT table - $.ajax({ - type : 'POST', - url : 'lib/tabRestore.php', - dataType : 'json', - data : { - table : tableName, - cont : newCont - }, - success : function(data) { - // Create info message - var dialog = $('
    ').append(createInfoBar('Changes saved!')); - - // Open dialog - dialog.dialog({ - modal: true, - title: 'Info', - width: 400, - buttons: { - "Ok": function(){ - $(this).dialog("close"); - } - } - }); - } - }); - }); - - var undoLnk = $('Undo'); - undoLnk.click(function() { - // Get table ID - var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); - - // Get datatable - var dTable = $('#' + tableId).dataTable(); - - // Clear entire datatable - dTable.fnClearTable(); - - // Add original content back into datatable - for ( var i = 1; i < origCont.length; i++) { - dTable.fnAddData(origCont[i], true); - } - - // Enable editable columns (again) - // Do not make 1st column editable - $('#' + tableId + ' td:not(td:nth-child(1))').editable( - function(value, settings) { - // Get column index - var colPos = this.cellIndex; - // Get row index - var rowPos = dTable.fnGetPosition(this.parentNode); - - // Update datatable - dTable.fnUpdate(value, rowPos, colPos); - - return (value); - }, { - onblur : 'submit', // Clicking outside editable area submits changes - type : 'textarea', - placeholder: ' ', - height : '30px' // The height of the text area - }); - }); - - var addLnk = $('Add row'); - addLnk.click(function() { - // Create an empty row - var row = new Array(); - - /** - * Remove button - */ - row.push(''); - for ( var i = 0; i < headers.length; i++) { - row.push(''); - } - - // Get table ID and name - var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); - - // Get datatable - var dTable = $('#' + tableId).dataTable(); - - // Add the row to the data table - dTable.fnAddData(row); - - // Enable editable columns (again) - // Do not make 1st column editable - $('#' + tableId + ' td:not(td:nth-child(1))').editable( - function(value, settings) { - // Get column index - var colPos = this.cellIndex; - // Get row index - var rowPos = dTable.fnGetPosition(this.parentNode); - - // Update datatable - dTable.fnUpdate(value, rowPos, colPos); - - return (value); - }, { - onblur : 'submit', // Clicking outside editable area submits changes - type : 'textarea', - placeholder: ' ', - height : '30px' // The height of the text area - }); - }); - - // Create an action menu - var actionsMenu = createMenu([saveLnk, undoLnk, addLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + id + 'Datatable_wrapper').prepend(menuDiv); - menuDiv.append(actionBar); - $('#' + id + 'Datatable_filter').appendTo(menuDiv); -} - -/** - * Delete a row in the data table - * - * @param obj The object that was clicked - */ -function deleteRow(obj) { - // Get table ID - var tableId = $(obj).parents('table').attr('id'); - - // Get datatable - var dTable = $('#' + tableId).dataTable(); - - // Get all nodes within the datatable - var rows = dTable.fnGetNodes(); - // Get target row - var tgtRow = $(obj).parent().parent().get(0); - - // Find the target row in the datatable - for ( var i in rows) { - // If the row matches the target row - if (rows[i] == tgtRow) { - // Remove row - dTable.fnDeleteRow(i, null, true); - break; - } - } -} - -/** - * Count the number of occurrences of a specific character in a string - * - * @param c Character to count - * @return The number of occurrences - */ -String.prototype.count = function(c) { - return (this.length - this.replace(new RegExp(c, 'g'), '').length)/c.length; -}; - -/** - * Update dialog - * - * @param data HTTP request data - */ -function updatePanel(data) { - var dialogId = data.msg; - var infoMsg; - - // Create info message - if (jQuery.isArray(data.rsp)) { - infoMsg = ''; - for (var i in data.rsp) { - infoMsg += data.rsp[i] + '
    '; - } - } else { - infoMsg = data.rsp; - } - - // Create info bar with close button - var infoBar = $('
    ').css('margin', '5px 0px'); - var icon = $('').css({ - 'display': 'inline-block', - 'margin': '10px 5px' - }); - - // Create close button to close info bar - var close = $('').css({ - 'display': 'inline-block', - 'float': 'right' - }).click(function() { - $(this).parent().remove(); - }); - - var msg = $('
    ' + infoMsg + '
    ').css({ - 'display': 'inline-block', - 'width': '85%' - }); - - infoBar.append(icon, msg, close); - infoBar.prependTo($('#' + dialogId)); +/** + * Global variables + */ +var configTabs; // Config tabs +var configDatatables = new Object(); // Datatables on the config page + +/** + * Set the datatable + * + * @param id The ID of the datatable + * @param obj Datatable object + */ +function setConfigDatatable(id, obj) { + configDatatables[id] = obj; +} + +/** + * Get the datatable with the given ID + * + * @param id The ID of the datatable + * @return Datatable object + */ +function getConfigDatatable(id) { + return configDatatables[id]; +} + +/** + * Set the configure tab + * + * @param obj Tab object + */ +function setConfigTab(obj) { + configTabs = obj; +} + +/** + * Get the configure tab + * + * @param Nothing + * @return Tab object + */ +function getConfigTab() { + return configTabs; +} + +/** + * Load configure page + */ +function loadConfigPage() { + // If the configure page has already been loaded + if ($('#content').children().length) { + // Do not reload configure page + return; + } + + // Create configure tab + var tab = new Tab(); + setConfigTab(tab); + tab.init(); + $('#content').append(tab.object()); + + // Create loader + var loader = $('
    ').append(createLoader()); + + // Add tab to configure xCAT tables + tab.add('configTablesTab', 'Tables', loader, false); + + // Add the update tab +// tab.add('updateTab', 'Update', '', false); + + // Add the Users tab + tab.add('usersTab', 'Users', '', false); + + // Add the discover tab +// tab.add('discoverTab', 'Discover', '', false); + + // Add the self-service tab +// tab.add('serviceTab', 'Service', '', false); + + // Add the files tab + tab.add('filesTab', 'Files', '', false); + + // Get list of tables and their descriptions + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'tabdump', + tgt : '', + args : '-d', + msg : '' + }, + + success : loadTableNames + }); + + // Do not load everything at once + // Load when tab is shown + tab.object().bind('tabsshow', function(event, ui) { + if ($(ui.panel).children().length) { + return; + } + + if (ui.index == 1) { + loadUserPage(); + } else if (ui.index == 2) { + loadServicePage(); + } else if (ui.index == 3) { + loadFilesPage(); +// loadDiscoverPage(); +// } else if (ui.index == 4) { +// loadServicePage(); + } + }); +} + +/** + * Load xCAT database table names and their descriptions + * + * @param data Data returned from HTTP request + */ +function loadTableNames(data) { + // Get output + var tables = data.rsp; + + // Remove loader + var tabId = 'configTablesTab'; + $('#' + tabId).find('img').hide(); + + // Create a groups division + var tablesDIV = $('
    '); + $('#' + tabId).append(tablesDIV); + + // Create info bar + var infoBar = createInfoBar('Select a table to view or edit.'); + tablesDIV.append(infoBar); + + // Create a list for the tables + var list = $(''); + // Loop through each table + for ( var i = 0; i < tables.length; i++) { + // Create a link for each table + var args = tables[i].split(':'); + var link = $('' + args[0] + ''); + + // Open table on click + link.bind('click', function(e) { + // Get table ID that was clicked + var id = (e.target) ? e.target.id : e.srcElement.id; + + // Create loader + var loader = $('
    ').append(createLoader()); + + // Add a new tab for this table + var configTab = getConfigTab(); + if (!$('#' + id + 'Tab').length) { + configTab.add(id + 'Tab', id, loader, true); + + // Get contents of selected table + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'tabdump', + tgt : '', + args : id, + msg : id + }, + + success : loadTable + }); + } + + // Select new tab + configTab.select(id + 'Tab'); + }); + + var item = $('
  • '); + item.append(link); + + // Append the table description + item.append(': ' + args[1]); + + // Append item to list + list.append(item); + } + + tablesDIV.append(list); +} + +/** + * Load a given database table + * + * @param data Data returned from HTTP request + */ +function loadTable(data) { + // Get response + var rsp = data.rsp; + // Get table ID + var id = data.msg; + + // Remove loader + var tabId = id + 'Tab'; + $('#' + tabId).find('img').remove(); + + // Create info bar + var infoBar = createInfoBar('Click on a cell to edit. Click outside the table to write to the cell. Once you are satisfied with how the table looks, click on Save.'); + $('#' + tabId).append(infoBar); + + // Create action bar + var actionBar = $('
    '); + $('#' + tabId).append(actionBar); + + // Get table headers + var args = rsp[0].replace('#', ''); + var headers = args.split(','); + + // Create container for original table contents + var origCont = new Array(); // Original table content + origCont[0] = rsp[0].split(','); // Headers + + // Create container for new table contents + var newCont = new Object(); + var tmp = new Object(); + tmp[0] = '#' + headers[0]; // Put a # in front of the header + for ( var i = 1; i < headers.length; i++) { + tmp[i] = headers[i]; + } + newCont[0] = tmp; + + // Create a new datatable + var tableId = id + 'Datatable'; + var table = new DataTable(tableId); + + // Add column for the remove row button + headers.unshift(''); + table.init(headers); + headers.shift(); + + // Append datatable to tab + $('#' + tabId).append(table.object()); + + // Add table rows + // Start with the 2nd row (1st row is the headers) + for ( var i = 1; i < rsp.length; i++) { + // Split into columns + var cols = rsp[i].split(','); + + // Go through each column + for ( var j = 0; j < cols.length; j++) { + + // If the column is not complete + if (cols[j].count('"') == 1) { + while (cols[j].count('"') != 2) { + // Merge this column with the adjacent one + cols[j] = cols[j] + "," + cols[j + 1]; + + // Remove merged row + cols.splice(j + 1, 1); + } + } + + // Replace quote + cols[j] = cols[j].replace(new RegExp('"', 'g'), ''); + } + + // Add remove button + cols.unshift(''); + + // Add row + table.add(cols); + + // Save original table content + origCont[i] = cols; + } + + // Turn table into datatable + var dTable = $('#' + id + 'Datatable').dataTable({ + 'iDisplayLength': 50, + 'bLengthChange': false, + "bScrollCollapse": true, + "sScrollY": "400px", + "sScrollX": "110%", + "bAutoWidth": true, + "oLanguage": { + "oPaginate": { + "sNext": "", + "sPrevious": "" + } + } + }); + + /** + * Enable editable columns + */ + // Do not make 1st column editable + $('#' + tableId + ' td:not(td:nth-child(1))').editable( + function(value, settings) { + // Get column index + var colPos = this.cellIndex; + // Get row index + var rowPos = dTable.fnGetPosition(this.parentNode); + + // Update datatable + dTable.fnUpdate(value, rowPos, colPos); + + return (value); + }, { + onblur : 'submit', // Clicking outside editable area submits changes + type : 'textarea', + placeholder: ' ', + height : '30px' // The height of the text area + }); + + // Create action bar + var actionBar = $('
    '); + + var saveLnk = $('Save'); + saveLnk.click(function() { + // Get table ID and name + var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); + var tableName = tableId.replace('Datatable', ''); + + // Get datatable + var dTable = $('#' + tableId).dataTable(); + // Get the nodes from the table + var dRows = dTable.fnGetNodes(); + + // Go through each row + for ( var i = 0; i < dRows.length; i++) { + // If there is row with values + if (dRows[i]) { + // Go through each column + // Ignore the 1st column because it is a button + var cols = dRows[i].childNodes; + var vals = new Object(); + for ( var j = 1; j < cols.length; j++) { + var val = cols.item(j).firstChild.nodeValue; + + // Insert quotes + if (val == ' ') { + vals[j - 1] = ''; + } else { + vals[j - 1] = val; + } + } + + // Save row + newCont[i + 1] = vals; + } + } + + // Update xCAT table + $.ajax({ + type : 'POST', + url : 'lib/tabRestore.php', + dataType : 'json', + data : { + table : tableName, + cont : newCont + }, + success : function(data) { + // Create info message + var dialog = $('
    ').append(createInfoBar('Changes saved!')); + + // Open dialog + dialog.dialog({ + modal: true, + title: 'Info', + width: 400, + buttons: { + "Ok": function(){ + $(this).dialog("close"); + } + } + }); + } + }); + }); + + var undoLnk = $('Undo'); + undoLnk.click(function() { + // Get table ID + var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); + + // Get datatable + var dTable = $('#' + tableId).dataTable(); + + // Clear entire datatable + dTable.fnClearTable(); + + // Add original content back into datatable + for ( var i = 1; i < origCont.length; i++) { + dTable.fnAddData(origCont[i], true); + } + + // Enable editable columns (again) + // Do not make 1st column editable + $('#' + tableId + ' td:not(td:nth-child(1))').editable( + function(value, settings) { + // Get column index + var colPos = this.cellIndex; + // Get row index + var rowPos = dTable.fnGetPosition(this.parentNode); + + // Update datatable + dTable.fnUpdate(value, rowPos, colPos); + + return (value); + }, { + onblur : 'submit', // Clicking outside editable area submits changes + type : 'textarea', + placeholder: ' ', + height : '30px' // The height of the text area + }); + }); + + var addLnk = $('Add row'); + addLnk.click(function() { + // Create an empty row + var row = new Array(); + + /** + * Remove button + */ + row.push(''); + for ( var i = 0; i < headers.length; i++) { + row.push(''); + } + + // Get table ID and name + var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', ''); + + // Get datatable + var dTable = $('#' + tableId).dataTable(); + + // Add the row to the data table + dTable.fnAddData(row); + + // Enable editable columns (again) + // Do not make 1st column editable + $('#' + tableId + ' td:not(td:nth-child(1))').editable( + function(value, settings) { + // Get column index + var colPos = this.cellIndex; + // Get row index + var rowPos = dTable.fnGetPosition(this.parentNode); + + // Update datatable + dTable.fnUpdate(value, rowPos, colPos); + + return (value); + }, { + onblur : 'submit', // Clicking outside editable area submits changes + type : 'textarea', + placeholder: ' ', + height : '30px' // The height of the text area + }); + }); + + // Create an action menu + var actionsMenu = createMenu([saveLnk, undoLnk, addLnk]); + actionsMenu.superfish(); + actionsMenu.css('display', 'inline-block'); + actionBar.append(actionsMenu); + + // Set correct theme for action menu + actionsMenu.find('li').hover(function() { + setMenu2Theme($(this)); + }, function() { + setMenu2Normal($(this)); + }); + + // Create a division to hold actions menu + var menuDiv = $(''); + $('#' + id + 'Datatable_wrapper').prepend(menuDiv); + menuDiv.append(actionBar); + $('#' + id + 'Datatable_filter').appendTo(menuDiv); +} + +/** + * Delete a row in the data table + * + * @param obj The object that was clicked + */ +function deleteRow(obj) { + // Get table ID + var tableId = $(obj).parents('table').attr('id'); + + // Get datatable + var dTable = $('#' + tableId).dataTable(); + + // Get all nodes within the datatable + var rows = dTable.fnGetNodes(); + // Get target row + var tgtRow = $(obj).parent().parent().get(0); + + // Find the target row in the datatable + for ( var i in rows) { + // If the row matches the target row + if (rows[i] == tgtRow) { + // Remove row + dTable.fnDeleteRow(i, null, true); + break; + } + } +} + +/** + * Count the number of occurrences of a specific character in a string + * + * @param c Character to count + * @return The number of occurrences + */ +String.prototype.count = function(c) { + return (this.length - this.replace(new RegExp(c, 'g'), '').length)/c.length; +}; + +/** + * Update dialog + * + * @param data HTTP request data + */ +function updatePanel(data) { + var dialogId = data.msg; + var infoMsg; + + // Create info message + if (jQuery.isArray(data.rsp)) { + infoMsg = ''; + for (var i in data.rsp) { + infoMsg += data.rsp[i] + '
    '; + } + } else { + infoMsg = data.rsp; + } + + // Create info bar with close button + var infoBar = $('
    ').css('margin', '5px 0px'); + var icon = $('').css({ + 'display': 'inline-block', + 'margin': '10px 5px' + }); + + // Create close button to close info bar + var close = $('').css({ + 'display': 'inline-block', + 'float': 'right' + }).click(function() { + $(this).parent().remove(); + }); + + var msg = $('
    ' + infoMsg + '
    ').css({ + 'display': 'inline-block', + 'width': '85%' + }); + + infoBar.append(icon, msg, close); + infoBar.prependTo($('#' + dialogId)); } \ No newline at end of file diff --git a/xCAT-UI/js/configure/service.js b/xCAT-UI/js/configure/service.js index ab9e47743..352c01d14 100644 --- a/xCAT-UI/js/configure/service.js +++ b/xCAT-UI/js/configure/service.js @@ -1,1280 +1,1280 @@ -/** - * Global variables - */ -var topPriority = 0; - -/** - * Load the service portal's provision page - * - * @param tabId Tab ID where page will reside - */ -function loadServicePage(tabId) { - // Create info bar - var infoBar = createInfoBar('Select a platform to configure, then click Ok.'); - - // Create self-service portal page - var tabId = 'serviceTab'; - var servicePg = $('
    '); - $('#' + tabId).append(infoBar, servicePg); - - // Create radio buttons for platforms - var hwList = $('
      Platforms available:
    '); - var esx = $('
  • ESX
  • '); - var kvm = $('
  • KVM
  • '); - var zvm = $('
  • z\/VM
  • '); - - hwList.append(esx); - hwList.append(kvm); - hwList.append(zvm); - servicePg.append(hwList); - - /** - * Ok - */ - var okBtn = createButton('Ok'); - okBtn.bind('click', function(event) { - var configTabs = getConfigTab(); - - // Get hardware that was selected - var hw = $(this).parent().find('input[name="hw"]:checked').val(); - var newTabId = hw + 'ProvisionTab'; - - if ($('#' + newTabId).size() > 0){ - configTabs.select(newTabId); - } else { - var title = ''; - - // Create an instance of the plugin - var plugin = null; - switch (hw) { - case "kvm": - plugin = new kvmPlugin(); - title = 'KVM'; - break; - case "esx": - plugin = new esxPlugin(); - title = 'ESX'; - break; - case "zvm": - plugin = new zvmPlugin(); - title = 'z/VM'; - - // Get zVM host names - if (!$.cookie('zvms')){ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webportal', - tgt : '', - args : 'lszvm', - msg : '' - }, - - success : function(data) { - setzVMCookies(data); - } - }); - } - - break; - } - - // Select tab - configTabs.add(newTabId, title, '', true); - configTabs.select(newTabId); - plugin.loadConfigPage(newTabId); - } - }); - - servicePg.append(okBtn); -} - -/** - * Round a floating point to a given precision - * - * @param value Floating point - * @param precision Decimal precision - * @returns Floating point number - */ -function toFixed(value, precision) { - var power = Math.pow(10, precision || 0); - return String(Math.round(value * power) / power); -} - -/** - * Query the images that exists - * - * @param panelId Panel ID - */ -function queryImages(panelId) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : 'osimage', - msg : panelId - }, - - success : configImagePanel - }); -} - -/** - * Panel to configure OS images - * - * @param data Data from HTTP request - */ -function configImagePanel(data) { - var panelId = data.msg; - var rsp = data.rsp; - - // Wipe panel clean - $('#' + panelId).empty(); - - // Add info bar - $('#' + panelId).append(createInfoBar('Create, edit, and delete operating system images for the self-service portal.')); - - // Create table - var tableId = panelId + 'Datatable'; - var table = new DataTable(tableId); - table.init(['', 'Name', 'Selectable', 'OS Version', 'OS Arch', 'OS Name', 'Type', 'Profile', 'Method', 'Description']); - - // Insert images into table - var imagePos = 0; - var profilePos = 0; - var osversPos = 0; - var osarchPos = 0; - var osnamePos = 0; - var imagetypePos = 0; - var provMethodPos = 0; - var comments = 0; - var desc, selectable, tmp; - // Get column index for each attribute - var colNameArray = rsp[0].substr(1).split(','); - for (var i in colNameArray){ - switch (colNameArray[i]){ - case 'imagename': { - imagePos = i; - } - break; - - case 'profile':{ - profilePos = i; - } - break; - - case 'osvers':{ - osversPos = i; - } - break; - - case 'osarch':{ - osarchPos = i; - } - break; - - case 'osname':{ - osnamePos = i; - } - break; - - case 'imagetype':{ - imagetypePos = i; - } - break; - - case 'comments':{ - comments = i; - } - break; - - case 'provmethod':{ - provMethodPos = i; - } - break; - - default : - break; - } - } - - // Go through each index - for (var i = 1; i < rsp.length; i++) { - // Get image name - var cols = rsp[i].split(','); - var name = cols[imagePos].replace(new RegExp('"', 'g'), ''); - var profile = cols[profilePos].replace(new RegExp('"', 'g'), ''); - var provMethod = cols[provMethodPos].replace(new RegExp('"', 'g'), ''); - var osVer = cols[osversPos].replace(new RegExp('"', 'g'), ''); - var osArch = cols[osarchPos].replace(new RegExp('"', 'g'), ''); - var osName = cols[osnamePos].replace(new RegExp('"', 'g'), ''); - var imageType = cols[imagetypePos].replace(new RegExp('"', 'g'), ''); - var osComments = cols[comments].replace(new RegExp('"', 'g'), ''); - - // Only save install boot and s390x architectures - if (osArch == "s390x") { - // Set default description and selectable - selectable = "no"; - desc = "No description"; - - if (osComments) { - tmp = osComments.split('|'); - for (var j = 0; j < tmp.length; j++) { - // Save description - if (tmp[j].indexOf('description:') > -1) { - desc = tmp[j].replace('description:', ''); - desc = jQuery.trim(desc); - } - - // Is the image selectable? - if (tmp[j].indexOf('selectable:') > -1) { - selectable = tmp[j].replace('selectable:', ''); - selectable = jQuery.trim(selectable); - } - } - } - - // Columns are: name, selectable, OS version, OS arch, OS name, type, profile, method, and description - var cols = new Array(name, selectable, osVer, osArch, osName, imageType, profile, provMethod, desc); - - // Add remove button where id = user name - cols.unshift(''); - - // Add row - table.add(cols); - } - } - - // Append datatable to tab - $('#' + panelId).append(table.object()); - - // Turn into datatable - $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - 'bLengthChange': false, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - - // Create action bar - var actionBar = $('
    ').css("width", "400px"); - - // Create a profile - var createLnk = $('Create'); - createLnk.click(function() { - imageDialog(); - }); - - // Edit a profile - var editLnk = $('Edit'); - editLnk.click(function() { - var images = $('#' + tableId + ' input[type=checkbox]:checked'); - for (var i in images) { - var image = images.eq(i).attr('name'); - if (image) { - // Columns are: name, selectable, OS version, OS arch, OS name, type, profile, method, and description - var cols = images.eq(i).parents('tr').find('td'); - var selectable = cols.eq(2).text(); - var osVersion = cols.eq(3).text(); - var osArch = cols.eq(4).text(); - var osName = cols.eq(5).text(); - var type = cols.eq(6).text(); - var profile = cols.eq(7).text(); - var method = cols.eq(8).text(); - var description = cols.eq(9).text(); - - editImageDialog(image, selectable, osVersion, osArch, osName, type, profile, method, description); - } - } - }); - - // Delete a profile - var deleteLnk = $('Delete'); - deleteLnk.click(function() { - var images = getNodesChecked(tableId); - if (images) { - deleteImageDialog(images); - } - }); - - // Refresh profiles table - var refreshLnk = $('Refresh'); - refreshLnk.click(function() { - queryImages(panelId); - }); - - // Create an action menu - var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_wrapper').prepend(menuDiv); - menuDiv.append(actionBar); - $('#' + tableId + '_filter').appendTo(menuDiv); - - // Resize accordion - $('#' + tableId).parents('.ui-accordion').accordion('resize'); -} - -/** - * Open image dialog - */ -function imageDialog() { - // Create form to add profile - var dialogId = 'createImage'; - var imageForm = $('
    '); - - // Create info bar - var info = createInfoBar('Provide the following attributes for the image. The image name will be generated based on the attributes you will give.'); - imageForm.append(info); - - var imageName = $('
    '); - var selectable = $('
    '); - var imageType = $('
    '); - var architecture = $('
    '); - var osName = $('
    '); - var osVersion = $('
    '); - var profile = $('
    '); - var provisionMethod = $('
    '); - var provisionSelect = $(''); - provisionMethod.append(provisionSelect); - var comments = $('
    '); - imageForm.append(imageName, selectable, imageType, architecture, osName, osVersion, profile, provisionMethod, comments); - - // Generate tooltips - imageForm.find('div input[title],textarea[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add image - imageForm.dialog({ - title:'Create image', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function() { - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get image attributes - var imageType = $(this).find('input[name="imagetype"]'); - var selectable = $(this).find('input[name="selectable"]'); - var architecture = $(this).find('input[name="osarch"]'); - var osName = $(this).find('input[name="osname"]'); - var osVersion = $(this).find('input[name="osvers"]'); - var profile = $(this).find('input[name="profile"]'); - var provisionMethod = $(this).find('select[name="provmethod"]'); - var comments = $(this).find('input[name="comments"]'); - - // Check that image attributes are provided before continuing - var ready = 1; - var inputs = new Array(imageType, architecture, osName, osVersion, profile, provisionMethod); - for (var i in inputs) { - if (!inputs[i].val()) { - inputs[i].css('border-color', 'red'); - ready = 0; - } else - inputs[i].css('border-color', ''); - } - - // If inputs are not complete, show warning message - if (!ready) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - // Override image name - $(this).find('input[name="imagename"]').val(osVersion.val() + '-' + architecture.val() + '-' + provisionMethod.val() + '-' + profile.val()); - var imageName = $(this).find('input[name="imagename"]'); - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - // Set default description - if (!comments.val()) - comments.val('No description'); - - // Create arguments to send via AJAX - var args = 'updateosimage;' + imageName.val() + ';' + - imageType.val() + ';' + - architecture.val() + ';' + - osName.val() + ';' + - osVersion.val() + ';' + - profile.val() + ';' + - provisionMethod.val() + ';'; - - if (selectable.attr('checked')) - args += '"description:' + comments.val() + '|selectable:yes"'; - else - args += '"description:' + comments.val() + '|selectable:no"'; - - // Add image to xCAT - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : args, - msg : dialogId - }, - - success : updatePanel - }); - } - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Edit image dialog - * - * @param iName Image name - * @param iSelectable Is image selectable from service page - * @param iOsVersion OS version - * @param iProfile Profile name - * @param iMethod Provisioning method - * @param iComments Image description - */ -function editImageDialog(iName, iSelectable, iOsVersion, iOsArch, iOsName, iType, iProfile, iMethod, iComments) { - var inst = 0; - var dialogId = 'editImage' + inst; - while ($('#' + dialogId).length) { - // If one already exists, generate another one - inst = inst + 1; - dialogId = 'editImage' + inst; - } - - // Create form to add profile - var imageForm = $('
    '); - - // Create info bar - var info = createInfoBar('Provide the following attributes for the image. The image name will be generated based on the attributes you will give.'); - imageForm.append(info); - - var imageName = $('
    '); - var selectable = $('
    '); - var imageType = $('
    '); - var architecture = $('
    '); - var osName = $('
    '); - var osVersion = $('
    '); - var profile = $('
    '); - var provisionMethod = $('
    '); - var provisionSelect = $(''); - provisionMethod.append(provisionSelect); - var comments = $('
    '); - imageForm.append(imageName, selectable, imageType, architecture, osName, osVersion, profile, provisionMethod, comments); - - // Fill in image attributes - imageForm.find('input[name="imagename"]').val(iName); - imageForm.find('input[name="osvers"]').val(iOsVersion); - imageForm.find('input[name="osarch"]').val(iOsArch); - imageForm.find('input[name="osname"]').val(iOsName); - imageForm.find('input[name="imagetype"]').val(iType); - imageForm.find('input[name="profile"]').val(iProfile); - imageForm.find('select[name="provmethod"]').val(iMethod); - imageForm.find('input[name="comments"]').val(iComments); - if (iSelectable == "yes") - imageForm.find('input[name="selectable"]').attr('checked', 'checked'); - - // Generate tooltips - imageForm.find('div input[title],textarea[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "toggle", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add image - imageForm.dialog({ - title:'Edit image', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function() { - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get image attributes - var imageType = $(this).find('input[name="imagetype"]'); - var selectable = $(this).find('input[name="selectable"]'); - var architecture = $(this).find('input[name="osarch"]'); - var osName = $(this).find('input[name="osname"]'); - var osVersion = $(this).find('input[name="osvers"]'); - var profile = $(this).find('input[name="profile"]'); - var provisionMethod = $(this).find('select[name="provmethod"]'); - var comments = $(this).find('input[name="comments"]'); - - // Check that image attributes are provided before continuing - var ready = 1; - var inputs = new Array(imageType, architecture, osName, osVersion, profile, provisionMethod); - for (var i in inputs) { - if (!inputs[i].val()) { - inputs[i].css('border-color', 'red'); - ready = 0; - } else - inputs[i].css('border-color', ''); - } - - // If inputs are not complete, show warning message - if (!ready) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - // Override image name - $(this).find('input[name="imagename"]').val(osVersion.val() + '-' + architecture.val() + '-' + provisionMethod.val() + '-' + profile.val()); - var imageName = $(this).find('input[name="imagename"]'); - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - // Set default description - if (!comments.val()) - comments.val('No description'); - - // Create arguments to send via AJAX - var args = 'updateosimage;' + imageName.val() + ';' + - imageType.val() + ';' + - architecture.val() + ';' + - osName.val() + ';' + - osVersion.val() + ';' + - profile.val() + ';' + - provisionMethod.val() + ';'; - - if (selectable.attr('checked')) - args += '"description:' + comments.val() + '|selectable:yes"'; - else - args += '"description:' + comments.val() + '|selectable:no"'; - - // Add image to xCAT - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : args, - msg : dialogId - }, - - success : updatePanel - }); - } - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to confirm image delete - * - * @param images Images to delete - */ -function deleteImageDialog(images) { - // Create form to delete disk to pool - var dialogId = 'deleteImage'; - var deleteForm = $('
    '); - - // Create info bar - var info = createInfoBar('Are you sure you want to delete ' + images.replace(new RegExp(',', 'g'), ', ') + '?'); - deleteForm.append(info); - - // Open dialog to delete user - deleteForm.dialog({ - title:'Delete image', - modal: true, - width: 400, - close: function(){ - $(this).remove(); - }, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - // Delete user - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : 'rmosimage;' + images, - msg : dialogId - }, - success : updatePanel - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Query the groups that exists - * - * @param panelId Panel ID - */ -function queryGroups(panelId) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : 'hosts', - msg : panelId - }, - - success : configGroupPanel - }); -} - -/** - * Panel to configure groups - * - * @param data Data from HTTP request - */ -function configGroupPanel(data) { - var panelId = data.msg; - var rsp = data.rsp; - - // Wipe panel clean - $('#' + panelId).empty(); - - // Add info bar - $('#' + panelId).append(createInfoBar('Create, edit, and delete groups for the self-service portal.')); - - // Create table - var tableId = panelId + 'Datatable'; - var table = new DataTable(tableId); - table.init(['', 'Name', 'Selectable', 'IP', 'Hostname', 'Description']); - - // Insert groups into table - var nodePos = 0; - var ipPos = 0; - var hostnamePos = 0; - var commentsPos = 0; - var desc, selectable, tmp; - // Get column index for each attribute - var colNameArray = rsp[0].substr(1).split(','); - for (var i in colNameArray){ - switch (colNameArray[i]){ - case 'node': - nodePos = i; - break; - - case 'ip': - ipPos = i; - break; - - case 'hostnames': - hostnamePos = i; - break; - - case 'comments': - commentsPos = i; - break; - - default : - break; - } - } - - // Go through each index - for (var i = 1; i < rsp.length; i++) { - // Get image name - var cols = rsp[i].split(','); - var name = cols[nodePos].replace(new RegExp('"', 'g'), ''); - var ip = cols[ipPos].replace(new RegExp('"', 'g'), ''); - var hostname = cols[hostnamePos].replace(new RegExp('"', 'g'), ''); - var comments = cols[commentsPos].replace(new RegExp('"', 'g'), ''); - - // Set default description and selectable - selectable = "no"; - network = ""; - desc = "No description"; - - if (comments) { - tmp = comments.split('|'); - for (var j = 0; j < tmp.length; j++) { - // Save description - if (tmp[j].indexOf('description:') > -1) { - desc = tmp[j].replace('description:', ''); - desc = jQuery.trim(desc); - } - - // Is the group selectable? - if (tmp[j].indexOf('selectable:') > -1) { - selectable = tmp[j].replace('selectable:', ''); - selectable = jQuery.trim(selectable); - } - } - } - - // Columns are: name, selectable, network, and description - var cols = new Array(name, selectable, ip, hostname, desc); - - // Add remove button where id = user name - cols.unshift(''); - - // Add row - table.add(cols); - } - - // Append datatable to tab - $('#' + panelId).append(table.object()); - - // Turn into datatable - $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - 'bLengthChange': false, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - - // Create action bar - var actionBar = $('
    ').css("width", "400px"); - - // Create a group - var createLnk = $('Create'); - createLnk.click(function() { - groupDialog(); - }); - - // Edit a group - var editLnk = $('Edit'); - editLnk.click(function() { - var groups = $('#' + tableId + ' input[type=checkbox]:checked'); - for (var i in groups) { - var group = groups.eq(i).attr('name'); - if (group) { - // Column order is: name, selectable, network, and description - var cols = groups.eq(i).parents('tr').find('td'); - var selectable = cols.eq(2).text(); - var ip = cols.eq(3).text(); - var hostnames = cols.eq(4).text(); - var description = cols.eq(5).text(); - - editGroupDialog(group, selectable, ip, hostnames, description); - } - } - }); - - // Delete a profile - var deleteLnk = $('Delete'); - deleteLnk.click(function() { - var groups = getNodesChecked(tableId); - if (groups) { - deleteGroupDialog(groups); - } - }); - - // Refresh profiles table - var refreshLnk = $('Refresh'); - refreshLnk.click(function() { - queryGroups(panelId); - }); - - // Create an action menu - var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_wrapper').prepend(menuDiv); - menuDiv.append(actionBar); - $('#' + tableId + '_filter').appendTo(menuDiv); - - // Resize accordion - $('#' + tableId).parents('.ui-accordion').accordion('resize'); -} - -/** - * Open group dialog - */ -function groupDialog() { - // Create form to add profile - var dialogId = 'createGroup'; - var groupForm = $('
    '); - - // Create info bar - var info = createInfoBar('Provide the following attributes for the group.'); - groupForm.append(info); - - var group = $('
    '); - var selectable = $('
    '); - var ip = $('
    '); - var hostnames = $('
    '); - var comments = $('
    '); - var ipPool = $('
    '); logOpt.hide(); optsList.append(logOpt); - + // Create clear log checkbox var clearChkBox = $('
  • '); optsList.append(clearChkBox); clearChkBox.append('Clear log'); - + retrieveChkBox.bind('click', function(event) { - tgtLog.toggle(); + tgtLog.toggle(); }); - + setChkBox.find('input').bind('click', function(event) { - logOpt.toggle(); + logOpt.toggle(); }); // Generate tooltips @@ -2604,7 +2683,7 @@ zvmPlugin.prototype.loadLogPage = function(node) { tooltip : "mouseover,mouseout" } }); - + /** * Run node */ @@ -2612,7 +2691,7 @@ zvmPlugin.prototype.loadLogPage = function(node) { runBtn.bind('click', function(event) { // Remove any warning messages $(this).parent().parent().find('.ui-state-error').remove(); - + var ready = true; var errMsg = ''; @@ -2636,26 +2715,26 @@ zvmPlugin.prototype.loadLogPage = function(node) { var tgts = $('#' + newTabId + ' input[name=tgtNode]').val(); var srcLog = $('#' + newTabId + ' input[name=srcLog]').val(); - + var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked"); var optStr = '-s;' + srcLog + ';'; var opt; for ( var i = 0; i < chkBoxes.length; i++) { opt = chkBoxes.eq(i).attr('name'); optStr += '-' + opt; - + // If it is the retrieve log if (opt == 't') { // Append log destination optStr += ';' + $('#' + newTabId + ' input[name=tgtLog]').val(); } - + // If it is set options if (opt == 'o') { // Append options optStr += ';' + $('#' + newTabId + ' textarea[name=logOpt]').val(); } - + // Append ; to end of string if (i < (chkBoxes.length - 1)) { optStr += ';'; @@ -2664,10 +2743,10 @@ zvmPlugin.prototype.loadLogPage = function(node) { // If a value is given for every input if (ready) { - // Disable all inputs - var inputs = $('#' + newTabId + ' input'); - inputs.attr('disabled', 'disabled'); - + // Do not disable all inputs + //var inputs = $('#' + newTabId + ' input'); + //inputs.attr('disabled', 'disabled'); + /** * (1) Retrieve, clear, or set options for event logs */ @@ -2688,8 +2767,8 @@ zvmPlugin.prototype.loadLogPage = function(node) { $('#' + statBarId).find('div').append(createLoader()); $('#' + statBarId).show(); - // Disable run button - $(this).attr('disabled', 'true'); + // Do not disable run button + //$(this).attr('disabled', 'true'); } else { // Show warning message var warn = createWarnBar(errMsg); @@ -2703,4 +2782,4 @@ zvmPlugin.prototype.loadLogPage = function(node) { } tab.select(newTabId); -}; \ No newline at end of file +}; diff --git a/xCAT-UI/js/custom/zvmUtils.js b/xCAT-UI/js/custom/zvmUtils.js index 184dc05bc..33926ad27 100644 --- a/xCAT-UI/js/custom/zvmUtils.js +++ b/xCAT-UI/js/custom/zvmUtils.js @@ -1,6893 +1,8017 @@ -/** - * Global variables - */ -var networkDatatable; // zVM datatable containing networks -var diskSpace; // Hash containing the disk pool space -var zfcpSpace; // Hash containing the zFcp pool space - -/** - * Get the network datatable - * - * @return Data table object - */ -function getNetworkDataTable() { - return networkDatatable; -} - -/** - * Set the network datatable - * - * @param table Data table object - */ -function setNetworkDataTable(table) { - networkDatatable = table; -} - -/** - * Load HCP specific info - * - * @param data Data from HTTP request - */ -function loadHcpInfo(data) { - var args = data.msg.split(';'); - - // Get group - var group = args[0].replace('group=', ''); - // Get hardware control point - var hcp = args[1].replace('hcp=', ''); - - // Get user directory entry - var userEntry = data.rsp; - if (!userEntry.length) - return; - - if (userEntry[0].indexOf('Failed') < 0) { - if (hcp) { - // If there is no cookie for the disk pool names - if (!$.cookie(hcp + 'diskpools') || $.cookie(hcp + 'diskpools') === null) { - // Get disk pools - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--diskpoolnames', - msg : hcp - }, - - success : setDiskPoolCookies - }); - } - - // If there is no cookie for the zFCP pool names - if (!$.cookie(hcp + 'zfcppools') || $.cookie(hcp + 'zfcppools') === null) { - // Get disk pools - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--zfcppoolnames', - msg : hcp - }, - - success : setZfcpPoolCookies - }); - } - - // If there is no cookie for the network names - if (!$.cookie(hcp + 'networks') || $.cookie(hcp + 'networks') === null) { - // Get network names - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--getnetworknames', - msg : hcp - }, - - success : setNetworkCookies - }); - } - } // End of if (hcp) - } else { - // Create warning dialog - var warning = createWarnBar('z/VM SMAPI is not responding to ' + hcp + '. It needs to be reset.'); - var warnDialog = $('
    ').append(warning); - - // Open dialog - warnDialog.dialog({ - title:'Warning', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function() { - $(this).dialog("close"); - } - } - }); - } -} - -/** - * Load user entry of a given node - * - * @param data Data from HTTP request - */ -function loadUserEntry(data) { - var args = data.msg.split(';'); - - // Get tab ID - var ueDivId = args[0].replace('out=', ''); - // Get node - var node = args[1].replace('node=', ''); - // Get user directory entry - var userEntry = data.rsp[0].split(node + ':'); - - // Remove loader - $('#' + node + 'TabLoader').remove(); - - var toggleLinkId = node + 'ToggleLink'; - $('#' + toggleLinkId).click(function() { - // Get text within this link - var lnkText = $(this).text(); - - // Toggle user entry division - $('#' + node + 'UserEntry').toggle(); - // Toggle inventory division - $('#' + node + 'Inventory').toggle(); - - // Change text - if (lnkText == 'Show directory entry') { - $(this).text('Show inventory'); - } else { - $(this).text('Show directory entry'); - } - }); - - // Put user entry into a list - var fieldSet = $('
    '); - var legend = $('Directory Entry'); - fieldSet.append(legend); - - var txtArea = $(''); - for ( var i = 1; i < userEntry.length; i++) { - userEntry[i] = jQuery.trim(userEntry[i]); - txtArea.append(userEntry[i]); - - if (i < userEntry.length) { - txtArea.append('\n'); - } - } - txtArea.attr('readonly', 'readonly'); - fieldSet.append(txtArea); - - /** - * Edit user entry - */ - txtArea.bind('dblclick', function(event) { - txtArea.attr('readonly', ''); - txtArea.css( { - 'border-width' : '1px' - }); - - saveBtn.show(); - cancelBtn.show(); - saveBtn.css('display', 'inline-table'); - cancelBtn.css('display', 'inline-table'); - }); - - /** - * Save - */ - var saveBtn = createButton('Save').hide(); - saveBtn.bind('click', function(event) { - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); - - // Replace user entry - var newUserEntry = jQuery.trim(txtArea.val()) + '\n'; - - // Replace user entry - $.ajax( { - url : 'lib/zCmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--replacevs', - att : newUserEntry, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process and save it in a cookie - incrementNodeProcess(node); - - txtArea.attr('readonly', 'readonly'); - txtArea.css( { - 'border-width' : '0px' - }); - - // Disable save button - $(this).hide(); - cancelBtn.hide(); - }); - - /** - * Cancel - */ - var cancelBtn = createButton('Cancel').hide(); - cancelBtn.bind('click', function(event) { - txtArea.attr('readonly', 'readonly'); - txtArea.css( { - 'border-width' : '0px' - }); - - cancelBtn.hide(); - saveBtn.hide(); - }); - - // Create info bar - var infoBar = createInfoBar('Double click on the directory entry to edit it.'); - - // Append user entry into division - $('#' + ueDivId).append(infoBar); - $('#' + ueDivId).append(fieldSet); - $('#' + ueDivId).append(saveBtn); - $('#' + ueDivId).append(cancelBtn); -} - -/** - * Increment number of processes running against a node - * - * @param node Node to increment running processes - */ -function incrementNodeProcess(node) { - // Get current processes - var procs = $.cookie(node + 'processes'); - if (procs) { - // One more process - procs = parseInt(procs) + 1; - $.cookie(node + 'processes', procs); - } else { - $.cookie(node + 'processes', 1); - } -} - -/** - * Update provision new node status - * - * @param data Data returned from HTTP request - */ -function updateZProvisionNewStatus(data) { - // Parse ajax response - var rsp = data.rsp; - var args = data.msg.split(';'); - var lastCmd = args[0].replace('cmd=', ''); - var out2Id = args[1].replace('out=', ''); - - // IDs for status bar, tab, and loader - var statBarId = 'zProvisionStatBar' + out2Id; - var tabId = 'zvmProvisionTab' + out2Id; - var loaderId = 'zProvisionLoader' + out2Id; - - var node = $('#' + tabId + ' input[name=nodeName]').val(); - - /** - * (2) Create user entry - */ - if (lastCmd == 'nodeadd') { - if (rsp.length) { - $('#' + loaderId).hide(); - $('#' + statBarId).find('div').append('
    (Error) Failed to create node definition
    '); - } else { - $('#' + statBarId).find('div').append('
    Node definition created for ' + node + '
    '); - - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // Create user entry - var userEntry = $('#' + tabId + ' textarea').val(); - $.ajax( { - url : 'lib/zCmd.php', - dataType : 'json', - data : { - cmd : 'mkvm', - tgt : node, - args : '', - att : userEntry, - msg : 'cmd=mkvm;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - /** - * (3) Update /etc/hosts - */ - else if (lastCmd == 'mkvm') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, quit - if (containErrors(prg.html())) { - $('#' + loaderId).hide(); - } else { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makehosts', - tgt : '', - args : '', - msg : 'cmd=makehosts;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - /** - * (4) Update DNS - */ - else if (lastCmd == 'makehosts') { - // If there was an error, quit - if (rsp.length) { - $('#' + loaderId).hide(); - $('#' + statBarId).find('div').append('
    (Error) Failed to update /etc/hosts
    '); - } else { - $('#' + statBarId).find('div').append('
    /etc/hosts updated
    '); - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedns', - tgt : '', - args : '', - msg : 'cmd=makedns;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - /** - * (5) Add disk - */ - else if (lastCmd == 'makedns') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, quit - if (containErrors(prg.html())) { - $('#' + loaderId).hide(); - } else { - // Set cookie for number of disks - var diskRows = $('#' + tabId + ' table:eq(0):visible tbody tr'); - $.cookie('disks2add' + out2Id, diskRows.length); - if (diskRows.length > 0) { - for (var i = 0; i < diskRows.length; i++) { - var diskArgs = diskRows.eq(i).find('td'); - var type = diskArgs.eq(1).find('select').val(); - var address = diskArgs.eq(2).find('input').val(); - var size = diskArgs.eq(3).find('input').val(); - var mode = diskArgs.eq(4).find('select').val(); - var pool = diskArgs.eq(5).find('select').val(); - var password = diskArgs.eq(6).find('input').val(); - - // Create ajax arguments - var args = ''; - if (type == '3390') { - args = '--add' + type + ';' + pool + ';' + address - + ';' + size + ';' + mode + ';' + password + ';' - + password + ';' + password; - } else if (type == '9336') { - var blkSize = '512'; - args = '--add' + type + ';' + pool + ';' + address + ';' - + blkSize + ';' + size + ';' + mode + ';' + password + ';' - + password + ';' + password; - } - - // Attach disk to node - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : args, - msg : 'cmd=chvm-disk;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - // Set cookie for number of zFCP devices - var zfcpRows = $('#' + tabId + ' table:eq(1):visible tbody tr'); - $.cookie('zfcp2add' + out2Id, zfcpRows.length); - if (zfcpRows.length > 0) { - for ( var i = 0; i < zfcpRows.length; i++) { - var diskArgs = zfcpRows.eq(i).find('td'); - var address = diskArgs.eq(1).find('input').val(); - var size = diskArgs.eq(2).find('input').val(); - var pool = diskArgs.eq(3).find('select').val(); - var tag = diskArgs.eq(4).find('input').val(); - var portName = diskArgs.eq(5).find('input').val(); - var unitNo = diskArgs.eq(6).find('input').val(); - - // This is either true or false - var loaddev = diskArgs.eq(7).find('input').attr('checked'); - if (loaddev) { - loaddev = "1"; - } else { - loaddev = "0"; - } - - // Create ajax arguments - var args = '--addzfcp;' + pool + ';' + address + ';' + loaddev + ';' + size; - if (tag && tag != "null") { - args += ';' + tag; - } if (portName && tag != "null") { - args += ';' + portName; - } if (unitNo && tag != "null") { - args += ';' + unitNo; - } - - // Attach zFCP device to node - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : args, - msg : 'cmd=chvm-zfcp;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - // Done if no disks to add - if (diskRows.length < 1 && zfcpRows.length < 1) { - $('#' + loaderId).hide(); - } - } - } - - /** - * (6) Set operating system for given node - */ - else if (lastCmd == 'chvm-disk' || lastCmd == 'chvm-zfcp') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, quit - if (containErrors(prg.html())) { - $('#' + loaderId).hide(); - } else { - // Set cookie for number of disks - // One less disk to add - var disks2add = $.cookie('disks2add' + out2Id); - if (lastCmd == 'chvm-disk') { - if (disks2add > 0) { - disks2add--; - $.cookie('disks2add' + out2Id, disks2add); - } - } - - var zfcp2add = $.cookie('zfcp2add' + out2Id); - if (lastCmd == 'chvm-zfcp') { - if (zfcp2add > 0) { - zfcp2add--; - $.cookie('zfcp2add' + out2Id, zfcp2add); - } - } - - // Only set operating system if there are no more disks to add - if (zfcp2add < 1 && disks2add < 1) { - // If an operating system image is given - var osImage = $('#' + tabId + ' select[name=os]:visible').val(); - if (osImage) { - // Get operating system, architecture, provision method, and profile - var tmp = osImage.split('-'); - var os = tmp[0]; - var arch = tmp[1]; - var profile = tmp[3]; - - // If the last disk is added - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeadd', - tgt : '', - args : node + ';noderes.netboot=zvm;nodetype.os=' - + os + ';nodetype.arch=' + arch - + ';nodetype.profile=' + profile, - msg : 'cmd=noderes;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } else { - $('#' + loaderId).hide(); - } - } - } - } - - /** - * (7) Update DHCP - */ - else if (lastCmd == 'noderes') { - // If there was an error, do not continue - if (rsp.length) { - $('#' + loaderId).hide(); - $('#' + statBarId).find('div').append('
    (Error) Failed to set operating system
    '); - } else { - $('#' + statBarId).find('div').append('
    Operating system for ' + node + ' set
    '); - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedhcp', - tgt : '', - args : '-a', - msg : 'cmd=makedhcp;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - /** - * (8) Prepare node for boot - */ - else if (lastCmd == 'makedhcp') { - // Prepare node for boot - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeset', - tgt : node, - args : 'install', - msg : 'cmd=nodeset;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - - /** - * (9) Boot node to network - */ - else if (lastCmd == 'nodeset') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error - // Do not continue - if (containErrors(prg.html())) { - $('#' + loaderId).hide(); - } else { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'rnetboot', - tgt : node, - args : 'ipl=000C', - msg : 'cmd=rnetboot;out=' + out2Id - }, - - success : updateZProvisionNewStatus - }); - } - } - - /** - * (10) Done - */ - else if (lastCmd == 'rnetboot') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - if (prg.html().indexOf('Error') < 0) { - $('#' + statBarId).find('div').append('
    Open a VNC viewer to see the installation progress.  It might take a couple of minutes before you can connect.
    '); - } - - // Hide loader - $('#' + loaderId).hide(); - } -} - -/** - * Update the provision existing node status - * - * @param data Data returned from HTTP request - */ -function updateZProvisionExistingStatus(data) { - // Get ajax response - var rsp = data.rsp; - var args = data.msg.split(';'); - - // Get command invoked - var cmd = args[0].replace('cmd=', ''); - // Get provision tab instance - var inst = args[1].replace('out=', ''); - - // Get provision tab and status bar ID - var statBarId = 'zProvisionStatBar' + inst; - var tabId = 'zvmProvisionTab' + inst; - - /** - * (2) Prepare node for boot - */ - if (cmd == 'nodeadd') { - // Get operating system - var bootMethod = $('#' + tabId + ' select[name=bootMethod]').val(); - - // Get nodes that were checked - var dTableId = 'zNodesDatatable' + inst; - var tgts = getNodesChecked(dTableId); - - // Prepare node for boot - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeset', - tgt : tgts, - args : bootMethod, - msg : 'cmd=nodeset;out=' + inst - }, - - success : updateZProvisionExistingStatus - }); - } - - /** - * (3) Boot node from network - */ - else if (cmd == 'nodeset') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - // If there was an error, do not continue - if (containErrors(prg.html())) { - var loaderId = 'zProvisionLoader' + inst; - $('#' + loaderId).remove(); - return; - } - - // Get nodes that were checked - var dTableId = 'zNodesDatatable' + inst; - var tgts = getNodesChecked(dTableId); - - // Boot node from network - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'rnetboot', - tgt : tgts, - args : 'ipl=000C', - msg : 'cmd=rnetboot;out=' + inst - }, - - success : updateZProvisionExistingStatus - }); - } - - /** - * (4) Done - */ - else if (cmd == 'rnetboot') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).find('div').append(prg); - - var loaderId = 'zProvisionLoader' + inst; - $('#' + loaderId).remove(); - } -} - -/** - * Update zVM node status - * - * @param data Data returned from HTTP request - */ -function updateZNodeStatus(data) { - var node = data.msg; - var rsp = data.rsp; - - // Get cookie for number processes performed against this node - var actions = $.cookie(node + 'processes'); - // One less process - actions = actions - 1; - $.cookie(node + 'processes', actions); - - if (actions < 1) { - // Hide loader when there are no more processes - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).hide(); - } - - var statBarId = node + 'StatusBar'; - - // Write ajax response to status bar - var prg = writeRsp(rsp, node + ': '); - $('#' + statBarId).find('div').append(prg); -} - -/** - * Update clone status - * - * @param data Data returned from HTTP request - */ -function updateZCloneStatus(data) { - // Get ajax response - var rsp = data.rsp; - var args = data.msg.split(';'); - var cmd = args[0].replace('cmd=', ''); - - // Get provision instance - var inst = args[1].replace('inst=', ''); - // Get output division ID - var out2Id = args[2].replace('out=', ''); - - /** - * (2) Update /etc/hosts - */ - if (cmd == 'nodeadd') { - var node = args[3].replace('node=', ''); - - // If there was an error, do not continue - if (rsp.length) { - $('#' + out2Id).find('img').hide(); - $('#' + out2Id).find('div').append('
    (Error) Failed to create node definition
    '); - } else { - $('#' + out2Id).find('div').append('
    Node definition created for ' + node + '
    '); - - // If last node definition was created - var tmp = inst.split('/'); - if (tmp[0] == tmp[1]) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makehosts', - tgt : '', - args : '', - msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id - }, - - success : updateZCloneStatus - }); - } - } - } - - /** - * (3) Update DNS - */ - else if (cmd == 'makehosts') { - // If there was an error, do not continue - if (rsp.length) { - $('#' + out2Id).find('img').hide(); - $('#' + out2Id).find('div').append('
    (Error) Failed to update /etc/hosts
    '); - } else { - $('#' + out2Id).find('div').append('
    /etc/hosts updated
    '); - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedns', - tgt : '', - args : '', - msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id - }, - - success : updateZCloneStatus - }); - } - } - - /** - * (4) Clone - */ - else if (cmd == 'makedns') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + out2Id).find('div').append(prg); - - // Get clone tab - var tabId = out2Id.replace('CloneStatusBar', 'CloneTab'); - - // If a node range is given - var tgtNodeRange = $('#' + tabId + ' input[name=tgtNode]').val(); - var tgtNodes = ''; - if (tgtNodeRange.indexOf('-') > -1) { - var tmp = tgtNodeRange.split('-'); - - // Get node base name - var nodeBase = tmp[0].match(/[a-zA-Z]+/); - // Get the starting index - var nodeStart = parseInt(tmp[0].match(/\d+/)); - // Get the ending index - var nodeEnd = parseInt(tmp[1].match(/\d+/)); - for ( var i = nodeStart; i <= nodeEnd; i++) { - // Do not append comma for last node - if (i == nodeEnd) { - tgtNodes += nodeBase + i.toString(); - } else { - tgtNodes += nodeBase + i.toString() + ','; - } - } - } else { - tgtNodes = tgtNodeRange; - } - - // Get other inputs - var srcNode = $('#' + tabId + ' input[name=srcNode]').val(); - hcp = $('#' + tabId + ' input[name=newHcp]').val(); - var group = $('#' + tabId + ' input[name=newGroup]').val(); - var diskPool = $('#' + tabId + ' input[name=diskPool]').val(); - var diskPw = $('#' + tabId + ' input[name=diskPw]').val(); - if (!diskPw) { - diskPw = ''; - } - - // Clone - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'mkvm', - tgt : tgtNodes, - args : srcNode + ';pool=' + diskPool + ';pw=' + diskPw, - msg : 'cmd=mkvm;inst=' + inst + ';out=' + out2Id - }, - - success : updateZCloneStatus - }); - } - - /** - * (5) Done - */ - else if (cmd == 'mkvm') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + out2Id).find('div').append(prg); - - // Hide loader - $('#' + out2Id).find('img').hide(); - } -} - -/** - * Get zVM resources - * - * @param data Data from HTTP request - */ -function getZResources(data) { - var tabId = 'zvmResourceTab'; - var info = createInfoBar('Manage storage and networks'); - $('#' + tabId).append(info); - - // Do not continue if there is no output - if (data.rsp.length) { - // Push hardware control points into an array - var node, hcp; - var hcpHash = new Object(); - for (var i in data.rsp) { - node = data.rsp[i][0]; - hcp = data.rsp[i][1]; - hcpHash[hcp] = 1; - } - - // Create an array for hardware control points - var hcps = new Array(); - for (var key in hcpHash) { - // Get the short host name - hcp = key.split('.')[0]; - if (jQuery.inArray(hcp, hcps) == -1) - hcps.push(hcp); - } - - // Set hardware control point cookie - $.cookie('hcp', hcps); - - // Delete loader - $('#' + tabId).find('img[src="images/loader.gif"]').remove(); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - // Create accordion panel for disk - diskSpace = new Object(); - var resourcesAccordion = $('
    '); - var diskSection = $('
    '); - var diskLnk = $('

    Disks

    ').click(function () { - // Do not load panel again if it is already loaded - if ($('#zvmDiskResource').children().length) { - return; - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); - - // Create a array for hardware control points - var hcps = new Array(); - if ($.cookie('hcp').indexOf(',') > -1) { - hcps = $.cookie('hcp').split(','); - } else { - hcps.push($.cookie('hcp')); - } - - // Create info bar - var info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.'); - $('#zvmDiskResource').append(info); - - // Create a tab for each zVM LPAR - var zvmDiskTab = new Tab(); - zvmDiskTab.init(); - $('#zvmDiskResource').append(zvmDiskTab.object()); - for (var i in hcps) { - var tabId = hcps[i] + 'Disks'; - var diskPanel = $('
    ').append(createLoader('')); - zvmDiskTab.add(tabId, hcp2zvm[hcps[i]], diskPanel, false); - - diskSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool - } - - // Query disk pool on-select - $('#zvmDiskResource').bind('tabsselect', function(event, ui) { - var hcp = $(ui.panel).attr('id').replace('Disks', ''); - - // If disk pool is already loaded, do not load again - if ($('#' + hcp2zvm[hcp] + 'DiskDataTable').length) { - return; - } - - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--diskpoolnames', - msg : hcp - }, - - success : getDiskPool - }); - }); - - // Select the 1st tab - if (!$('#' + hcp2zvm[hcps[0]] + 'DiskDataTable').length) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcps[0], - args : '--diskpoolnames', - msg : hcps[0] - }, - - success : getDiskPool - }); - } - }); - - // Create accordion panel for zFCP devices - zfcpSpace = new Object(); - var zfcpSection = $('
    '); - var zfcpLnk = $('

    zFCP

    ').click(function () { - // Do not load panel again if it is already loaded - if ($('#zFcpResource').children().length) { - return; - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); - - // Create a array for hardware control points - var hcps = new Array(); - if ($.cookie('hcp').indexOf(',') > -1) { - hcps = $.cookie('hcp').split(','); - } else { - hcps.push($.cookie('hcp')); - } - - // Resource tab ID - var info = createInfoBar('Below are devices that are defined internally in the zFCP pools.'); - $('#zFcpResource').append(info); - - // Create a tab for each zVM LPAR - var zFcpTab = new Tab(); - zFcpTab.init(); - $('#zFcpResource').append(zFcpTab.object()); - for (var i in hcps) { - var tabId = hcps[i] + 'Zfcps'; - var zfcpPanel = $('
    ').append(createLoader('')); - zFcpTab.add(tabId, hcp2zvm[hcps[i]], zfcpPanel, false); - - zfcpSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool - } - - // Query zFcp pool on-select - $('#zFcpResource').bind('tabsselect', function(event, ui) { - var hcp = $(ui.panel).attr('id').replace('Zfcps', ''); - - // If zFcp pool is already loaded, do not load again - if ($('#' + hcp2zvm[hcp] + 'ZfcpDataTable').length) { - return; - } - - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--zfcppoolnames', - msg : hcp - }, - - success : getZfcpPool - }); - }); - - // Select the 1st tab - if (!$('#' + hcp2zvm[hcps[0]] + 'ZfcpDataTable').length) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcps[0], - args : '--zfcppoolnames', - msg : hcps[0] - }, - - success : getZfcpPool - }); - } - }); - - // Create accordion panel for network - var networkSection = $('
    '); - var networkLnk = $('

    Networks

    ').click(function () { - // Do not load panel again if it is already loaded - if ($('#zvmNetworkResource').children().length) { - return; - } else { - $('#zvmNetworkResource').append(createLoader('')); - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); - - // Create a array for hardware control points - var hcps = new Array(); - if ($.cookie('hcp').indexOf(',') > -1) { - hcps = $.cookie('hcp').split(','); - } else { - hcps.push($.cookie('hcp')); - } - - for (var i in hcps) { - // Gather networks from hardware control points - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcps[i], - args : '--getnetworknames', - msg : hcps[i] - }, - - success : getNetwork - }); - } - }); - - resourcesAccordion.append(diskLnk, diskSection, zfcpLnk, zfcpSection, networkLnk, networkSection); - - // Append accordion to tab - $('#' + tabId).append(resourcesAccordion); - resourcesAccordion.accordion(); - networkLnk.trigger('click'); - } -} - -/** - * Get node attributes from HTTP request data - * - * @param propNames Hash table of property names - * @param keys Property keys - * @param data Data from HTTP request - * @return Hash table of property values - */ -function getAttrs(keys, propNames, data) { - // Create hash table for property values - var attrs = new Object(); - - // Go through inventory and separate each property out - var curKey = null; // Current property key - var addLine; // Add a line to the current property? - for ( var i = 1; i < data.length; i++) { - addLine = true; - - // Loop through property keys - // Does this line contains one of the properties? - for ( var j = 0; j < keys.length; j++) { - // Find property name - if (data[i].indexOf(propNames[keys[j]]) > -1) { - attrs[keys[j]] = new Array(); - - // Get rid of property name in the line - data[i] = data[i].replace(propNames[keys[j]], ''); - // Trim the line - data[i] = jQuery.trim(data[i]); - - // Do not insert empty line - if (data[i].length > 0) { - attrs[keys[j]].push(data[i]); - } - - curKey = keys[j]; - addLine = false; // This line belongs to a property - } - } - - // Line does not contain a property - // Must belong to previous property - if (addLine && data[i].length > 1) { - data[i] = jQuery.trim(data[i]); - attrs[curKey].push(data[i]); - } - } - - return attrs; -} - -/** - * Create add processor dialog - * - * @param node Node to add processor to - */ -function openAddProcDialog(node) { - // Create form to add processor - var addProcForm = $('
    '); - // Create info bar - var info = createInfoBar('Add a temporary processor to this virtual server.'); - addProcForm.append(info); - addProcForm.append('
    '); - addProcForm.append('
    '); - - // Create drop down for processor type - var procType = $('
    '); - procType.append(''); - var typeSelect = $(''); - typeSelect.append('' - + '' - + '' - + '' - ); - procType.append(typeSelect); - addProcForm.append(procType); - - // Generate tooltips - addProcForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add processor - addProcForm.dialog({ - title:'Add processor', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var node = $(this).find('input[name=procNode]').val(); - var address = $(this).find('input[name=procAddress]').val(); - var type = $(this).find('select[name=procType]').val(); - - // If inputs are not complete, show warning message - if (!node || !address || !type) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - // Add processor - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--addprocessoractive;' + address + ';' + type, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - var statusId = node + 'StatusBar'; - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).show(); - $('#' + statusId).show(); - - // Close dialog - $(this).dialog( "close" ); - } - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add disk dialog - * - * @param node Node to add disk to - * @param hcp Hardware control point of node - */ -function openAddDiskDialog(node, hcp) { - // Get list of disk pools - var cookie = $.cookie(hcp + 'diskpools'); - var pools = new Array(); - if (cookie) { - pools = cookie.split(','); - } - - // Create form to add disk - var addDiskForm = $('
    '); - // Create info bar - var info = createInfoBar('Add a ECKD|3390 or FBA|9336 disk to this virtual server.'); - addDiskForm.append(info); - addDiskForm.append('
    '); - addDiskForm.append('
    '); - addDiskForm.append('
    '); - addDiskForm.append('
    '); - - // Create drop down for disk pool - var diskPool = $('
    '); - diskPool.append(''); - var poolSelect = $(''); - for ( var i = 0; i < pools.length; i++) { - poolSelect.append(''); - } - diskPool.append(poolSelect); - addDiskForm.append(diskPool); - - // Create drop down for disk mode - var diskMode = $('
    '); - diskMode.append(''); - var modeSelect = $(''); - modeSelect.append('' - + '' - + '' - + '' - + '' - + '' - + '' - ); - diskMode.append(modeSelect); - addDiskForm.append(diskMode); - - addDiskForm.append('
    '); - - // Generate tooltips - addDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addDiskForm.dialog({ - title:'Add disk', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var node = $(this).find('input[name=diskNode]').val(); - var type = $(this).find('select[name=diskType]').val(); - var address = $(this).find('input[name=diskAddress]').val(); - var size = $(this).find('input[name=diskSize]').val(); - var pool = $(this).find('select[name=diskPool]').val(); - var mode = $(this).find('select[name=diskMode]').val(); - var password = $(this).find('input[name=diskPassword]').val(); - - // If inputs are not complete, show warning message - if (!node || !type || !address || !size || !pool || !mode) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - // Add disk - if (type == '3390') { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--add3390;' + pool + ';' + address + ';' + size - + ';' + mode + ';' + password + ';' + password + ';' + password, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - var statusId = node + 'StatusBar'; - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).show(); - $('#' + statusId).show(); - } else if (type == '9336') { - // Default block size for FBA volumes = 512 - var blkSize = '512'; - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--add9336;' + pool + ';' + address + ';' + blkSize + ';' + size - + ';' + mode + ';' + password + ';' + password + ';' + password, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - var statusId = node + 'StatusBar'; - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).show(); - $('#' + statusId).show(); - } - - // Close dialog - $(this).dialog( "close" ); - } // End of else - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add zFCP device dialog - * - * @param node Node to add disk to - * @param hcp Hardware control point of node - * @param zvm The z/VM system of node - */ -function openAddZfcpDialog(node, hcp, zvm) { - // Get list of disk pools - var cookie = $.cookie(hcp + 'zfcppools'); - var pools = new Array(); - if (cookie) { - pools = cookie.split(','); - } - - // Create form to add disk - var addZfcpForm = $('
    '); - // Create info bar - var info = createInfoBar('Add a SCSI|FCP disk to this virtual server.'); - addZfcpForm.append(info); - addZfcpForm.append('
    '); - addZfcpForm.append('
    '); - addZfcpForm.append('
    '); - addZfcpForm.append('
    '); - - // Create drop down for disk pool - var diskPool = $('
    '); - diskPool.append(''); - var poolSelect = $(''); - for ( var i = 0; i < pools.length; i++) { - poolSelect.append(''); - } - diskPool.append(poolSelect); - addZfcpForm.append(diskPool); - - // Tag to identify where device will be used - addZfcpForm.append('
    '); - - // Create advanced link to set advanced zFCP properties - var advancedLnk = $('
    '); - addZfcpForm.append(advancedLnk); - var advanced = $('
    ').hide(); - addZfcpForm.append(advanced); - - var portName = $('
    '); - var unitNo = $('
    '); - advanced.append(portName, unitNo); - - // Toggle port name and unit number when clicking on advanced link - advancedLnk.click(function() { - advanced.toggle(); - }); - - // Generate tooltips - addZfcpForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addZfcpForm.dialog({ - title:'Add zFCP device', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var node = $(this).find('input[name=diskNode]').val(); - var address = $(this).find('input[name=diskAddress]').val(); - var loaddev = $(this).find('input[name=diskLoaddev]'); - var size = $(this).find('input[name=diskSize]').val(); - var pool = $(this).find('select[name=diskPool]').val(); - var tag = $(this).find('input[name=diskTag]').val(); - var portName = $(this).find('input[name=diskPortName]').val(); - var unitNo = $(this).find('input[name=diskUnitNo]').val(); - - // If inputs are not complete, show warning message - if (!node || !address || !size || !pool) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - if (loaddev.attr('checked')) { - loaddev = 1; - } else { - loaddev = 0; - } - - var args = '--addzfcp||' + pool + '||' + address + '||' + loaddev + '||' + size; - - if (tag && tag != "null") { - args += '||' + tag; - } else { - args += '|| ""'; - } - - if ((portName && portName != "null") && (unitNo && unitNo != "null")) { - args += '||' + portName + '||' + unitNo; - } - - // Add zFCP device - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : args, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - var statusId = node + 'StatusBar'; - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).show(); - $('#' + statusId).show(); - - // Close dialog - $(this).dialog( "close" ); - } - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create dedicate device dialog - * - * @param node Node to dedicate device to - * @param hcp Hardware control point of node - */ -function openDedicateDeviceDialog(node, hcp) { - // Create form to add disk - var dedicateForm = $('
    '); - // Create info bar - var info = createInfoBar('Add a dedicated device to the configuration'); - dedicateForm.append(info); - - dedicateForm.append('
    '); - dedicateForm.append('
    '); - dedicateForm.append('
    '); - dedicateForm.append('
    '); - - // Generate tooltips - dedicateForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add dedicated device - dedicateForm.dialog({ - title:'Add dedicated device', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var node = $(this).find('input[name=diskNode]').val(); - var vAddress = $(this).find('input[name=virtualAddress]').val(); - var rAddress = $(this).find('input[name=realAddress]').val() - var mode = $(this).find('select[name=mode]').val(); - - // If inputs are not complete, show warning message - if (!node || !vAddress || !rAddress || !mode) { - var warn = createWarnBar('Please provide a value for each missing field.'); - warn.prependTo($(this)); - } else { - var args = '--dedicatedevice;' + vAddress + ';' + rAddress + ';' + mode; - - // Add zFCP device - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : args, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - var statusId = node + 'StatusBar'; - var statusBarLoaderId = node + 'StatusBarLoader'; - $('#' + statusBarLoaderId).show(); - $('#' + statusId).show(); - - // Close dialog - $(this).dialog( "close" ); - } - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add ECKD to system dialog - * - * @param hcp Hardware control point of node - */ -function openAddEckd2SystemDialog(hcp) { - var dialogId = 'zvmAddEckd2System'; - - // Create form to add disk - var addE2SForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - // Create info bar - var info = createInfoBar('Dynamically add an ECKD disk to a running z/VM system.'); - addE2SForm.append(info); - - addE2SForm.append(system); - addE2SForm.append('
    '); - - // Generate tooltips - addE2SForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addE2SForm.dialog({ - title:'Add ECKD to system', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 420, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var system = $(this).find('select[name=system]').val(); - var devnum = $(this).find('input[name=devNum]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=devNum]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : "--addeckd;" + devnum, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add page or spool dialog - * - * @param hcp Hardware control point of node - */ -function openAddPageSpoolDialog(hcp) { - var dialogId = 'zvmAddPageSpool'; - - // Create form to add disk - var addPageSpoolForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - // Create info bar - var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.'); - addPageSpoolForm.append(info); - - var diskFS = $('
    Disk
    '); - addPageSpoolForm.append(diskFS); - var diskAttr = $('
    '); - diskFS.append($('
    ')); - diskFS.append(diskAttr); - - diskAttr.append(system); - diskAttr.append('
    '); - diskAttr.append('
    '); - diskAttr.append('
    '); - - // Generate tooltips - addPageSpoolForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addPageSpoolForm.dialog({ - title:'Add page or spool', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var system = $(this).find('select[name=system]').val(); - var volAddr = $(this).find('input[name=volAddr]').val(); - var volLabel = $(this).find('input[name=volLabel]').val(); - var volUse = $(this).find('select[name=volUse]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=volAddr]', 'input[name=volLabel]', 'select[name=volUse]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - var pageSpoolArgs = volAddr + ";" + volLabel + ";" + volUse; - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : system, - args : '--addpagespool;' + pageSpoolArgs, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to share disk - * - * @param disks2share Disks selected in table - */ -function openShareDiskDialog(disks2share) { - // Create form to share disk - var dialogId = 'zvmShareDisk'; - var shareDiskForm = $('
    '); - - var args = disks2share.split(';'); - var tgtHcp = args[0]; - var tgtVol = args[1]; - - if (!tgtVol || tgtVol == "undefined") - tgtVol = ""; - - // Create info bar - var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.'); - shareDiskForm.append(info); - - // Set region input based on those selected on table (if any) - var node = $('
    '); - var volAddr = $('
    '); - var shareEnable = $('
    '); - shareDiskForm.append(node, volAddr, shareEnable); - - // Generate tooltips - shareDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to delete disk - shareDiskForm.dialog({ - title:'Share disk', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var node = $(this).find('input[name=node]').val(); - var volAddr = $(this).find('input[name=volAddr]').val(); - var shareEnable = $(this).find('select[name=shareEnable]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('input[name=node]', 'input[name=volAddr]', 'select[name=shareEnable]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - // Remove disk from pool - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : "--sharevolume;" + volAddr + ";" + shareEnable, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add SCSI 2 system dialog - * - * @param hcp Hardware control point of node - */ -function openAddScsi2SystemDialog(hcp) { - var dialogId = 'zvmAddScsi2System'; - - // Create form to add disk - var addS2SForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - // Create info bar - var info = createInfoBar('Dynamically add an SCSI disk to a running z/VM system as an EDEV.'); - addS2SForm.append(info); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - var devNo = $('
    '); - var devPathLabel = $(''); - var devPathCount = 1; - var pathDiv = $('
    '); - - var devPathDiv = $('
    '); - var devPathTable = $('
    '); - var devPathHeader = $(' FCP Device WWPN LUN'); - // Adjust header width - devPathHeader.find('th').css({ - 'width' : '120px' - }); - devPathHeader.find('th').eq(0).css({ - 'width' : '20px' - }); - var devPathBody = $(''); - var devPathFooter = $(''); - - // Create a row - var devPathRow = $(''); - - // Add blank column (remove button replacement) - devPathRow.append(''); - - // Create FCP device number input - var fcpDevNum = $(''); - devPathRow.append(fcpDevNum); - - // Create FCP WWPN input - var fcpWwpn = $(''); - devPathRow.append(fcpWwpn); - - if ($.cookie('zvms')) { - zvms = $.cookie('zvms').split(','); - var zvm; - for (var i in zvms) { - var args = zvms[i].split(':'); - var zvm = args[0].toLowerCase(); - var iHcp = args[1]; - } - } - - // Create FCP LUN input - var fcpLun = $(''); - devPathRow.append(fcpLun); - - devPathBody.append(devPathRow); - - var addDevPathLink = $('+ Add path'); - addDevPathLink.bind('click', function(event){ - devPathCount = devPathCount + 1; - // Create a row - var devPathRow = $(''); - - // Add remove button - var removeBtn = $('').css({ - "float": "left", - "cursor": "pointer" - }); - var col = $('').append(removeBtn); - removeBtn.bind('click', function(event) { - $(this).parent().parent().remove(); - }); - devPathRow.append(col); - - // Create FCP device number input - var fcpDevNum = $(''); - devPathRow.append(fcpDevNum); - - // Create FCP WWPN input - var fcpWwpn = $(''); - devPathRow.append(fcpWwpn); - - // Create FCP LUN input - var fcpLun = $(''); - devPathRow.append(fcpLun); - - devPathBody.append(devPathRow); - - // Generate tooltips - addS2SForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - }); - devPathFooter.append(addDevPathLink); - devPathTable.append(devPathHeader); - devPathTable.append(devPathBody); - devPathTable.append(devPathFooter); - devPathDiv.append(devPathLabel); - devPathDiv.append(devPathTable); - - var option = $('
    '); - var persist = $('
    '); - addS2SForm.append(system, devNo, devPathDiv, option, persist); - - // Generate tooltips - addS2SForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - addS2SForm.find('div input[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.7, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - } - }); - - // Open dialog to add disk - addS2SForm.dialog({ - title:'Add SCSI to running system', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 675, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var system = $(this).find('select[name=system]').val(); - var devNo = $(this).find('input[name=devNo]').val(); - var pathArray = ""; - $('.devPath').each(function(index) { - pathArray += $(this).find('input[name=fcpDevNum]').val() + ','; - pathArray += $(this).find('input[name=fcpWwpn]').val() + ','; - pathArray += $(this).find('input[name=fcpLun]').val() + ';'; - }); - var option = $(this).find('select[name=option]').val(); - var persist = $(this).find('select[name=persist]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=devNum]', 'select[name=option]', 'select[name=persist]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - // Show warning message - if (!ready || !pathArray) { - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : "--addscsi||" + devNo + "||'" + pathArray + "'||" + option + "||" + persist, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Delete a real SCSI disk - * - * @param hcp Hardware control point of node - */ -function openRemoveScsiDialog(hcp) { - var dialogId = 'zvmRemoveScsiDialog'; - // Create form to add disk - var removeScsiForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - // Create info bar - var info = createInfoBar('Delete a real SCSI disk'); - removeScsiForm.append(info, system); - removeScsiForm.append('
    '); - removeScsiForm.append('
    '); - addNicForm.append('
    '); - - // Create drop down for NIC types - var nicType = $('
    '); - nicType.append(''); - var nicTypeSelect = $(''); - nicTypeSelect.append('' - + '' - + '' - ); - nicType.append(nicTypeSelect); - addNicForm.append(nicType); - - // Create drop down for network types - var networkType = $('
    '); - networkType.append(''); - var networkTypeSelect = $(''); - networkTypeSelect.append('' - + '' - + '' - ); - networkType.append(networkTypeSelect); - addNicForm.append(networkType); - - // Create drop down for network names - var gLansQdioSelect = $(''); - var gLansHipersSelect = $(''); - var vswitchSelect = $(''); - for ( var i = 0; i < networks.length; i++) { - var network = networks[i].split(' '); - var networkOption = $(''); - if (network[0] == 'VSWITCH') { - vswitchSelect.append(networkOption); - } else if (network[0] == 'LAN:QDIO') { - gLansQdioSelect.append(networkOption); - } else if (network[0] == 'LAN:HIPERS') { - gLansHipersSelect.append(networkOption); - } - } - - // Hide network name drop downs until the NIC type and network type is selected - // QDIO Guest LAN drop down - var guestLanQdio = $('
    ').hide(); - guestLanQdio.append(''); - guestLanQdio.append(gLansQdioSelect); - addNicForm.append(guestLanQdio); - - // HIPERS Guest LAN drop down - var guestLanHipers = $('
    ').hide(); - guestLanHipers.append(''); - guestLanHipers.append(gLansHipersSelect); - addNicForm.append(guestLanHipers); - - // VSWITCH drop down - var vswitch = $('
    ').hide(); - vswitch.append(''); - vswitch.append(vswitchSelect); - addNicForm.append(vswitch); - - // Show network names on change - networkTypeSelect.change(function(){ - // Remove any warning messages - $(this).parent().parent().find('.ui-state-error').remove(); - - // Get NIC type and network type - var nicType = $(this).parent().parent().find('select[name=nicType]').val(); - var networkType = $(this).val(); - - // Hide network name drop downs - var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); - var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); - var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); - guestLanQdio.hide(); - guestLanHipers.hide(); - vswitch.hide(); - - // Show correct network name - if (networkType == 'Guest LAN' && nicType == 'QDIO') { - guestLanQdio.show(); - } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { - guestLanHipers.show(); - } else if (networkType == 'Virtual Switch') { - if (nicType == 'QDIO') { - vswitch.show(); - } else { - // No such thing as HIPERS VSWITCH - var warn = createWarnBar('The selected choices are not valid.'); - warn.prependTo($(this).parent().parent()); - } - } - }); - - // Show network names on change - nicTypeSelect.change(function(){ - // Remove any warning messages - $(this).parent().parent().find('.ui-state-error').remove(); - - // Get NIC type and network type - var nicType = $(this).val(); - var networkType = $(this).parent().parent().find('select[name=nicNetworkType]').val(); - - // Hide network name drop downs - var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); - var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); - var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); - guestLanQdio.hide(); - guestLanHipers.hide(); - vswitch.hide(); - - // Show correct network name - if (networkType == 'Guest LAN' && nicType == 'QDIO') { - guestLanQdio.show(); - } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { - guestLanHipers.show(); - } else if (networkType == 'Virtual Switch') { - if (nicType == 'QDIO') { - vswitch.show(); - } else { - // No such thing as HIPERS VSWITCH - var warn = createWarnBar('The selected choices are not valid.'); - warn.prependTo($(this).parent().parent()); - } - } - }); - - // Generate tooltips - addNicForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add NIC - addNicForm.dialog({ - title:'Add NIC', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var ready = true; - var errMsg = ''; - - // Get inputs - var node = $(this).find('input[name=nicNode]').val(); - var nicType = $(this).find('select[name=nicType]').val(); - var networkType = $(this).find('select[name=nicNetworkType]').val(); - var address = $(this).find('input[name=nicAddress]').val(); - - // If inputs are not complete, show warning message - if (!node || !nicType || !networkType || !address) { - errMsg = 'Please provide a value for each missing field.
    '; - ready = false; - } - - // If a HIPERS VSWITCH is selected, show warning message - if (nicType == 'HiperSockets' && networkType == 'Virtual Switch') { - errMsg += 'The selected choices are not valid.'; - ready = false; - } - - // If there are errors - if (!ready) { - // Show warning message - var warn = createWarnBar(errMsg); - warn.prependTo($(this)); - } else { - // Add guest LAN - if (networkType == 'Guest LAN') { - var temp; - if (nicType == 'QDIO') { - temp = $(this).find('select[name=nicLanQdioName]').val().split(' '); - } else { - temp = $(this).find('select[name=nicLanHipersName]').val().split(' '); - } - - var lanOwner = temp[0]; - var lanName = temp[1]; - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--addnic;' + address + ';' + nicType + ';3', - msg : 'node=' + node + ';addr=' + address + ';lan=' - + lanName + ';owner=' + lanOwner - }, - success : connect2GuestLan - }); - } - - // Add virtual switch - else if (networkType == 'Virtual Switch' && nicType == 'QDIO') { - var temp = $(this).find('select[name=nicVSwitchName]').val().split(' '); - var vswitchName = temp[1]; - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--addnic;' + address + ';' + nicType + ';3', - msg : 'node=' + node + ';addr=' + address + ';vsw=' - + vswitchName - }, - - success : connect2VSwitch - }); - } - - // Increment node process - incrementNodeProcess(node); - - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); - - // Close dialog - $(this).dialog( "close" ); - } // End of else - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Create add vSwitch/VLAN dialog - * - * @param hcp Hardware control point of node - */ -function openAddVswitchVlanDialog(hcp) { - var dialogId = 'zvmAddVswitchVlan'; - - // Create form to add disk - var addVswitchForm = $('
    '); - - // Create info bar - var info = createInfoBar('Create a virtual switch or virtual network LAN.'); - - var netFS = $('
    '); - var netLegend = $('Network'); - netFS.append(netLegend); - - var typeFS = $('
    ').hide(); - var typeLegend = $('Network'); - typeFS.append(typeLegend); - addVswitchForm.append(info, netFS, typeFS); - - var netAttr = $('
    '); - netFS.append($('
    ')); - netFS.append(netAttr); - - var networkTypeDiv = $('
    '); - var networkType = $('
    '); - networkTypeDiv.append(networkType) - netAttr.append(networkTypeDiv); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - netAttr.append(system); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - var typeAttr = $('
    '); - typeFS.append($('
    ')); - typeFS.append(typeAttr); - - // Create vSwitch parameters - var vswitchOptions = $('
    ').hide(); - vswitchOptions.append($('
    ')); - vswitchOptions.append($('
    ')); - vswitchOptions.append($('
    ')); - - // Create an advanced link to configure optional network settings - var advancedLnk = $('
    '); - vswitchOptions.append(advancedLnk); - var advanced = $('
    ').hide(); - vswitchOptions.append(advanced); - - // Show IP address and hostname inputs on-click - advancedLnk.click(function() { - advanced.toggle(); - }); - - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - advanced.append($('
    ')); - - // Create VLAN parameters - var vlanOptions = $('
    ').hide(); - vlanOptions.append($('
    ')); - vlanOptions.append($('
    ')); - vlanOptions.append($('
    ')); - vlanOptions.append($('
    ')); - - typeAttr.append(vswitchOptions, vlanOptions); - - networkType.change(function() { - typeFS.show(); - if ($(this).val() == "vswitch") { - typeFS.find("legend").text("vSwitch"); - vswitchOptions.show(); - vlanOptions.hide(); - } else if ($(this).val() == "vlan") { - typeFS.find("legend").text("VLAN"); - vswitchOptions.hide(); - vlanOptions.show(); - } else { - typeFS.find("legend").text(""); - vswitchOptions.hide(); - vlanOptions.hide(); - typeFS.hide(); - } - }); - - // Generate tooltips - addVswitchForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add vSwitch or VLAN - addVswitchForm.dialog({ - title:'Add vSwitch or VLAN', - modal: true, - close: function() { - $(this).remove(); - }, - width: 750, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var networkType = $(this).find('select[name=networkType]').val(); - if (networkType == "vswitch") { - var networkArgs = "--addvswitch;"; - var system = $(this).find('select[name=system]').val(); - var switchName = $(this).find('input[name=switchName]').val(); - var deviceAddress = $(this).find('input[name=deviceAddress]').val(); - var portName = switchName; - var controllerName = $(this).find('input[name=controllerName]').val(); - var connection = $(this).find('select[name=connection]').val(); - var queueMemoryLimit = $(this).find('input[name=queueMemoryLimit]').val(); - var routingValue = $(this).find('select[name=routingValue]').val(); - var transportType = $(this).find('select[name=transportType]').val(); - var vlanId = $(this).find('input[name=vlanId]').val(); - var portType = $(this).find('select[name=portType]').val(); - var updateSysConfig = $(this).find('select[name=updateSysConfig]').val(); - var gvrp = $(this).find('select[name=gvrp]').val(); - var nativeVlanId = $(this).find('input[name=nativeVlanId]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=switchName]', 'input[name=deviceAddress]', 'input[name=controllerName]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - // Show warning message - if (!ready) { - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - if (switchName) - networkArgs += switchName + ";"; - if (deviceAddress) - networkArgs += deviceAddress + ";"; - if (portName) - networkArgs += portName + ";"; - if (controllerName) - networkArgs += controllerName + ";"; - - // Optional parameters - if (connection) - networkArgs += connection + ";"; - if (queueMemoryLimit) - networkArgs += queueMemoryLimit + ";"; - if (routingValue) - networkArgs += routingValue + ";"; - if (transportType) - networkArgs += transportType + ";"; - if (vlanId) - networkArgs += vlanId + ";"; - if (portType) - networkArgs += portType + ";"; - if (updateSysConfig) - networkArgs += updateSysConfig + ";"; - if (gvrp) - networkArgs += gvrp + ";"; - if (nativeVlanId) - networkArgs += nativeVlanId + ";"; - networkArgs = networkArgs.substring(0, networkArgs.length - 1); - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : networkArgs, - msg : dialogId - }, - - success : updateResourceDialog - }); - } else if (networkType == "vlan") { - var networkArgs = "--addvlan;"; - var system = $(this).find('select[name=system]').val(); - var vlanName = $(this).find('input[name=vlanName]').val(); - var vlanOwner = $(this).find('input[name=vlanOwner]').val(); - var vlanType = $(this).find('select[name=vlanType]').val(); - var vlanTransport = $(this).find('select[name=vlanTransport]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=vlanName]', 'input[name=vlanOwner]', 'select[name=vlanType]', 'select[name=vlanTransport]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - // Show warning message - if (!ready) { - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Ethernet Hipersockets are not supported - if (vlanTransport == "2") { - var warn = createWarnBar('Ethernet Hipersockets are not supported'); - warn.prependTo($(this)); - return; - } - - networkArgs += vlanName + ";"; - networkArgs += vlanOwner + ";"; - networkArgs += vlanType + ";"; - networkArgs += vlanTransport; - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : networkArgs, - msg : dialogId - }, - - success : updateResourceDialog - }); - } // End of else if - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to delete network - * - * @param node type name for removing network - */ -function openRemoveVswitchVlanDialog(networkList) { - var names = ''; - for (var i in networkList) { - var networkArgs = networkList[i].split(';'); - networkArgs[2] = jQuery.trim(networkArgs[2]); - names += networkArgs[2] + ', '; - } - names = names.substring(0, names.length - 2); // Delete last two characters - - var confirmDialog = $('

    Are you sure you want to remove ' + names + '?

    '); - confirmDialog.dialog({ - title: "Confirm", - modal: true, - width: 400, - buttons: { - "Ok": function() { - for (var i in networkList) { - var networkArgs = networkList[i].split(';'); - var node = networkArgs[0]; - var type = networkArgs[1]; - var name = jQuery.trim(networkArgs[2]); - var owner = networkArgs[3]; - - if (type.indexOf("VSWITCH") != -1) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : node, - args : '--removevswitch;' + name, - msg : '' - }, - - success: function(data) { - var infoMsg; - - // Create info message - if (jQuery.isArray(data.rsp)) { - infoMsg = ''; - for (var i in data.rsp) { - infoMsg += data.rsp[i] + '
    '; - } - } else { - infoMsg = data.rsp; - } - - openDialog("info", infoMsg); - } - }); - } else if (type.indexOf("LAN") != -1) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : node, - args : '--removevlan;' + name + ';' + owner, - msg : '' - }, - - success: function(data) { - var infoMsg; - - // Create info message - if (jQuery.isArray(data.rsp)) { - infoMsg = ''; - for (var i in data.rsp) { - infoMsg += data.rsp[i] + '
    '; - } - } else { - infoMsg = data.rsp; - } - - openDialog("info", infoMsg); - } - }); - } - } - $(this).dialog("close"); - }, - "Cancel": function() { - $(this).dialog("close"); - } - } - }); -} - -/** - * Remove processor - * - * @param node Node where processor is attached - * @param address Virtual address of processor - */ -function removeProcessor(node, address) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--removeprocessor;' + address, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); -} - -/** - * Remove disk - * - * @param node Node where disk is attached - * @param address Virtual address of disk - */ -function removeDisk(node, address) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--removedisk;' + address, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); -} - -/** - * Remove zFCP device - * - * @param node Node where disk is attached - * @param address Virtual address of zFCP device - * @param wwpn World wide port name of zFCP device - * @param lun Logical unit number of zFCP device - */ -function removeZfcp(node, address, wwpn, lun) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--removezfcp||' + address + '||' + wwpn + '||' + lun, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); -} - -/** - * Remove NIC - * - * @param node Node where NIC is attached - * @param address Virtual address of NIC - */ -function removeNic(node, nic) { - var args = nic.split('.'); - var address = args[0]; - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--removenic;' + address, - msg : node - }, - - success : updateZNodeStatus - }); - - // Increment node process - incrementNodeProcess(node); - - // Show loader - $('#' + node + 'StatusBarLoader').show(); - $('#' + node + 'StatusBar').show(); -} - -/** - * Set a cookie for the network names of a given node - * - * @param data Data from HTTP request - */ -function setNetworkCookies(data) { - if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { - var node = data.msg; - var networks = data.rsp[0].split(node + ': '); - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); - $.cookie(node + 'networks', networks, { expires: exDate }); - } -} - -/** - * Get contents of each disk pool - * - * @param data HTTP request data - */ -function getDiskPool(data) { - if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { - var hcp = data.msg; - var pools = data.rsp[0].split(hcp + ': '); - - // Get contents of each disk pool - for (var i in pools) { - pools[i] = jQuery.trim(pools[i]); - if (pools[i]) { - diskSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space - - // Get used space - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--diskpool;' + pools[i] + ';used', - msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=used' - }, - - success : loadDiskPoolTable - }); - - // Get free space - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--diskpool;' + pools[i] + ';free', - msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=free' - }, - - success : loadDiskPoolTable - }); - } // End of if - } // End of for - } else { - // Load empty table - var data = { - msg : 'hcp=' + data.msg + ';', - rsp : [] - }; - loadDiskPoolTable(data); - } -} - -/** - * Get contents of each zFCP pool - * - * @param data HTTP request data - */ -function getZfcpPool(data) { - if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { - var hcp = data.msg; - var pools = data.rsp[0].split(hcp + ': '); - - // Get contents of each disk pool - for (var i in pools) { - pools[i] = jQuery.trim(pools[i]); - if (pools[i]) { - zfcpSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space - - // Query used and free space - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--zfcppool;' + pools[i] + ';all', - msg : 'hcp=' + hcp + ';pool=' + pools[i] - }, - - success : loadZfcpPoolTable - }); - } // End of if - } // End of for - } else { - // Load empty table - var data = { - msg : 'hcp=' + data.msg + ';', - rsp : [] - }; - loadZfcpPoolTable(data); - } -} - -/** - * Get details of each network - * - * @param data HTTP request data - */ -function getNetwork(data) { - if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { - var hcp = data.msg; - var networks = data.rsp[0].split(hcp + ': '); - - // Loop through each network - for ( var i = 1; i < networks.length; i++) { - var args = networks[i].split(' '); - var type = args[0]; - var name = args[2]; - - // Get network details - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--getnetwork;' + name, - msg : 'hcp=' + hcp + ';type=' + type + ';network=' + name - }, - - success : loadNetworkTable - }); - } // End of for - } // End of if -} - -/** - * Load disk pool contents into a table - * - * @param data HTTP request data - */ -function loadDiskPoolTable(data) { - var hcp2zvm = new Object(); - var args, hcp, pool, stat, tmp; - if (data.rsp.length) { - // Do not continue if the call failed - if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { - return; - } - - // Obtain mapping for zHCP to zVM system - hcp2zvm = getHcpZvmHash(); - - args = data.msg.split(';'); - hcp = args[0].replace('hcp=', ''); - pool = args[1].replace('pool=', ''); - stat = jQuery.trim(args[2].replace('stat=', '')); - tmp = data.rsp[0].split(hcp + ': '); - - // Initialize free or used space in hash - diskSpace[hcp][pool][stat] = 0; - } else { - args = data.msg.split(';'); - - // Provide empty values so the table will be generated - hcp = args[0].replace('hcp=', ''); - pool = ''; - stat = ''; - tmp = new Array(); - } - - // Remove loader - var panelId = hcp + 'Disks'; - $('#' + panelId).find('img[src="images/loader.gif"]').remove(); - - // Get datatable - var tableId = hcp2zvm[hcp] + 'DiskDataTable'; - var dTable; - if (!$('#' + tableId).length) { - // Create a datatable - var table = new DataTable(tableId); - // Resource headers: volume ID, device type, start address, and size - table.init( [ '', 'z/VM', 'Pool', 'Status', 'Volume', 'Device type', 'Starting address', 'Size' ]); - - // Append datatable to panel - $('#' + hcp + 'Disks').append(table.object()); - - // Turn into datatable - dTable = $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - } else { - dTable = $('#' + tableId).dataTable(); - } - - // Skip index 0 and 1 because it contains nothing - for (var i = 2; i < tmp.length; i++) { - tmp[i] = jQuery.trim(tmp[i]); - var diskAttrs = tmp[i].split(' '); - var key = hcp2zvm[hcp] + "-" + pool + "-" + diskAttrs[0]; - var type = diskAttrs[1]; - - // Calculate disk size - var size; - if (type.indexOf('3390') != -1) { - size = convertCylinders2Gb(parseInt(diskAttrs[3])); - } else if (type.indexOf('9336') != -1) { - size = convertBlocks2Gb(parseInt(diskAttrs[3])) - } else { - size = 0; - } - - dTable.fnAddData( [ '', hcp2zvm[hcp], pool, stat, diskAttrs[0], type, diskAttrs[2], diskAttrs[3] + " (" + size + "G)" ]); - - // Add up the free or used size - diskSpace[hcp][pool][stat] += size; - } - - // Plot bar chart when all data is gathered - var plotBarChart = true; - for (var p in diskSpace[hcp]) { - if (!('free' in diskSpace[hcp][p]) || !('used' in diskSpace[hcp][p])) { - plotBarChart = false; - } - } - - if (plotBarChart) { - // Bar chart data points - var ticks = new Array(); - var free = new Array(); - var used = new Array(); - for (var p in diskSpace[hcp]) { - ticks.push(p); - - free.push(diskSpace[hcp][p]['free']); - used.push(diskSpace[hcp][p]['used']); - } - - // Create bar chart, only when there is data - var plot; - var panelId = hcp + 'Disks'; - $('#' + panelId).prepend($('
    ')); - plot = $.jqplot(hcp + 'DiskChart', [used, free], { - title: '', - stackSeries: true, - seriesDefaults: { - renderer: $.jqplot.BarRenderer, - rendererOptions: {barMargin: 25}, - pointLabels: {show: true} - }, - series: [ - {label: 'Used'}, - {label: 'Free'} - ], - axes: { - xaxis: { - renderer: $.jqplot.CategoryAxisRenderer, - ticks: ticks - }, - yaxis: { - tickOptions: {formatString: '%dG'} - } - }, - legend: { - show: true, - placement: 'outsideGrid' - } - }); - } - - // Create actions menu - var menuId = hcp2zvm[hcp] + 'DiskResourceActions'; - if (!$('#' + menuId).length) { - // Empty filter area - $('#' + tableId + '_length').empty(); - - // Add disk to pool - var addLnk = $('Add'); - addLnk.bind('click', function(event){ - openAddDisk2PoolDialog(); - }); - - // Delete disk from pool - var removeLnk = $('Remove'); - removeLnk.bind('click', function(event){ - var disks = getNodesChecked(tableId); - openRemoveDiskFromPoolDialog(disks); - }); - - // Refresh table - var refreshLnk = $('Refresh'); - refreshLnk.bind('click', function(event) { - $('#' + panelId).empty().append(createLoader('')); - - // Query the disk pools - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--diskpoolnames', - msg : hcp - }, - - success : getDiskPool - }); - }); - - // Add ECKD to system - var addEckdLnk = $('Add ECKD'); - addEckdLnk.bind('click', function(event){ - openAddEckd2SystemDialog(hcp); - }); - - // Add Page or Spool - var addPageSpoolLnk = $('Add page/spool') - addPageSpoolLnk.bind('click', function(event){ - openAddPageSpoolDialog(hcp); - }); - - // Add EDEV to system - var addEdevLnk = $('Add EDEV'); - addEdevLnk.bind('click', function(event){ - openAddScsi2SystemDialog(hcp); - }); - - // Remove EDEV - var removeEdevLnk = $('Remove EDEV'); - removeEdevLnk.bind('click', function(event){ - openRemoveScsiDialog(hcp); - }); - - // Indicate disk is to be shared with various users - var shareLnk = $('Share disk'); - shareLnk.bind('click', function(event){ - var disks = getNodesChecked(tableId); - openShareDiskDialog(disks); - }); - - // Advanced menu - var advancedLnk = 'Advanced'; - var advancedMenu = createMenu([addEckdLnk, addPageSpoolLnk, addEdevLnk, removeEdevLnk, shareLnk]); - - // Create action bar - var actionBar = $('').css("width", "450px"); - - // Create an action menu - var actionsMenu = createMenu([refreshLnk, addLnk, removeLnk, [advancedLnk, advancedMenu]]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_length').prepend(menuDiv); - $('#' + tableId + '_length').css({ - 'padding': '0px', - 'width': '460px' - }); - $('#' + tableId + '_filter').css('padding', '10px'); - menuDiv.append(actionBar); - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); -} - -/** - * Load zFCP pool contents into a table - * - * @param data HTTP request data - */ -function loadZfcpPoolTable(data) { - var hcp2zvm = new Object(); - var args, hcp, pool, tmp; - if (data.rsp.length) { - // Do not continue if the call failed - if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { - return; - } - - // Obtain mapping for zHCP to zVM system - hcp2zvm = getHcpZvmHash(); - - args = data.msg.split(';'); - hcp = args[0].replace('hcp=', ''); - pool = args[1].replace('pool=', ''); - tmp = data.rsp[0].split(hcp + ': '); - - // Initialize free, reserved, and used space in hash - zfcpSpace[hcp][pool]['free'] = 0; - zfcpSpace[hcp][pool]['used'] = 0; - zfcpSpace[hcp][pool]['reserved'] = 0; - } else { - args = data.msg.split(';'); - - // Provide empty values so the table will be generated - hcp = args[0].replace('hcp=', ''); - pool = ''; - tmp = new Array(); - } - - // Remove loader - var panelId = hcp + 'Zfcps'; - $('#' + panelId).find('img[src="images/loader.gif"]').remove(); - - // Get datatable - var tableId = hcp2zvm[hcp] + 'ZfcpDataTable'; - var dTable; - if (!$('#' + tableId).length) { - // Create a datatable - var table = new DataTable(tableId); - // Resource headers: status, WWPN, LUN, size, owner, channel, tag - table.init([ '', 'z/VM', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]); - - // Append datatable to panel - $('#' + panelId).append(table.object()); - - // Turn into datatable - dTable = $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - } else { - dTable = $('#' + tableId).dataTable(); - } - - if (data.rsp.length) { - // Skip index 0 and 1 because it contains nothing - var key = ""; - for (var i = 2; i < tmp.length; i++) { - tmp[i] = jQuery.trim(tmp[i]); - var diskAttrs = tmp[i].split(','); - diskAttrs[0] = diskAttrs[0].toLowerCase(); - var key = hcp2zvm[hcp] + '-' + pool + '-' + diskAttrs[2]; - dTable.fnAddData([ '', hcp2zvm[hcp], pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]); - - // Add up the free or used size - zfcpSpace[hcp][pool][diskAttrs[0]] += convertString2Gb(diskAttrs[3]); - } - - // Bar chart data points - var ticks = new Array(); - var free = new Array(); - var used = new Array(); - for (var pool in zfcpSpace[hcp]) { - ticks.push(pool); - - free.push(zfcpSpace[hcp][pool]['free']); - if ('reserved' in zfcpSpace[hcp][pool]) { - used.push(zfcpSpace[hcp][pool]['used'] + zfcpSpace[hcp][pool]['reserved']); - } else { - used.push(zfcpSpace[hcp][pool]['used']); - } - } - - // Create bar chart, only when there is data - if ((used.length || free.length) && ticks.length) { - $('#' + panelId).prepend($('
    ')); - var plot = $.jqplot(hcp + 'ZfcpChart', [used, free], { - title: '', - stackSeries: true, - seriesDefaults: { - renderer: $.jqplot.BarRenderer, - rendererOptions: {barMargin: 25}, - pointLabels: {show: true} - }, - series: [ - {label: 'Used'}, - {label: 'Free'} - ], - axes: { - xaxis: { - renderer: $.jqplot.CategoryAxisRenderer, - ticks: ticks - }, - yaxis: { - tickOptions: {formatString: '%dG'} - } - }, - legend: { - show: true, - placement: 'outsideGrid' - } - }); - } - } - - // Create actions menu - var menuId = hcp2zvm[hcp] + 'ZfcpResourceActions'; - if (!$('#' + menuId).length) { - // Empty filter area - $('#' + tableId + '_length').empty(); - - // Add disk to pool - var addLnk = $('Add'); - addLnk.bind('click', function(event){ - openAddZfcp2PoolDialog(); - }); - - // Delete disk from pool - var removeLnk = $('Remove'); - removeLnk.bind('click', function(event){ - var disks = getNodesChecked(tableId); - openRemoveZfcpFromPoolDialog(disks); - }); - - // Refresh table - var refreshLnk = $('Refresh'); - refreshLnk.bind('click', function(event){ - $('#' + panelId).empty().append(createLoader('')); - - // Query the disk pools - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcp, - args : '--zfcppoolnames', - msg : hcp - }, - - success : getZfcpPool - }); - }); - - // Create action bar - var actionBar = $('
    ').css("width", "450px"); - - // Create an action menu - var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_length').prepend(menuDiv); - $('#' + tableId + '_length').css({ - 'padding': '0px', - 'width': '460px' - }); - $('#' + tableId + '_filter').css('padding', '10px'); - menuDiv.append(actionBar); - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); -} - -/** - * Open dialog to remove disk from pool - * - * @param disks2remove Disks selected in table - */ -function openRemoveDiskFromPoolDialog(disks2remove) { - // Create form to delete disk from pool - var dialogId = 'zvmDeleteDiskFromPool'; - var deleteDiskForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - var disks = new Array(); - if (disks2remove.indexOf(',') > -1) - disks = disks2remove.split(','); - else - disks.push(disks2remove); - - // Pick the last zHCP and pool it finds - var args, tgtHcp = "", tgtPool = "", tgtVol = ""; - for (var i in disks) { - args = disks[i].split('-'); - tgtHcp = args[0]; - tgtPool = args[1]; - tgtVol += args[2] + ','; - } - - // Strip out last comma - tgtVol = tgtVol.slice(0, -1); - - // Create info bar - var info = createInfoBar('Remove a disk from a disk pool defined in the EXTENT CONTROL.'); - deleteDiskForm.append(info); - var action = $('
    '); - var actionSelect = $(''); - action.append(actionSelect); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - // Set region input based on those selected on table (if any) - var region = $('
    '); - var group = $('
    '); - deleteDiskForm.append(action, system, region, group); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - systemSelect.val(tgtHcp); - - actionSelect.change(function() { - if ($(this).val() == '1' || $(this).val() == '3') { - region.show(); - group.hide(); - } else if ($(this).val() == '2') { - region.show(); - group.show(); - } else if ($(this).val() == '7') { - region.val('FOOBAR'); - region.hide(); - group.show(); - } - }); - - // Generate tooltips - deleteDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to delete disk - deleteDiskForm.dialog({ - title:'Delete disk from pool', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var action = $(this).find('select[name=action]').val(); - var system = $(this).find('select[name=system]').val(); - var region = $(this).find('input[name=region]').val(); - var group = $(this).find('input[name=group]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'select[name=action]', 'input[name=region]', 'input[name=group]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - var args; - if (action == '2' || action == '7') - args = region + ';' + group; - else - args = group; - - // Remove disk from pool - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : '--removediskfrompool;' + action + ';' + args, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to add disk to pool - */ -function openAddDisk2PoolDialog() { - // Create form to add disk to pool - var dialogId = 'zvmAddDisk2Pool'; - var addDiskForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - // Create info bar - var info = createInfoBar('Add a disk to a disk pool defined in the EXTENT CONTROL. The disk has to already be attached to SYSTEM.'); - addDiskForm.append(info); - var action = $('
    '); - var actionSelect = $(''); - action.append(actionSelect); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - var volume = $('
    '); - var group = $('
    '); - addDiskForm.append(action, system, volume, group); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - // Generate tooltips - addDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addDiskForm.dialog({ - title:'Add disk to pool', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - // Get inputs - var action = $(this).find('select[name=action]').val(); - var system = $(this).find('select[name=system]').val(); - var volume = $(this).find('input[name=volume]').val(); - var group = $(this).find('input[name=group]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'select[name=action]', 'input[name=volume]', 'input[name=group]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - var args; - if (action == '4') - args = volume + ';' + volume + ';' + group; - else - args = volume + ';' + group; - - // Add disk to pool - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : '--adddisk2pool;' + action + ';' + args, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to remove zFCP from pool - * - * @param devices2remove Comman separated devices selected in table - */ -function openRemoveZfcpFromPoolDialog(devices2remove) { - // Create form to delete device from pool - var dialogId = 'zvmDeleteZfcpFromPool'; - var deleteDiskForm = $('
    '); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - // Verify disks are in the same zFCP pool - var devices = devices2remove.split(','); - var tmp, tgtPool, tgtHcp; - var tgtUnitNo = ""; - for (var i in devices) { - tmp = devices[i].split('-'); - - if (tgtPool && tmp[1] != tgtPool) { - openDialog("warn", "Please select devices in the same zFCP"); - return; - } else { - tgtPool = tmp[1]; - } - - tgtHcp = tmp[0]; // Assume it is just one zHCP. Otherwise, this cannot be done on multiple zHCPs. - tgtUnitNo += tmp[2] + ","; - } - - // Strip out last comma - tgtUnitNo = tgtUnitNo.slice(0, -1); - - // Create info bar - var info = createInfoBar('Remove a zFCP device that is defined in a zFCP pool.'); - deleteDiskForm.append(info); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - var pool = $('
    '); - var unitNo = $('
    '); - var portName = $('
    '); - deleteDiskForm.append(system, pool, unitNo, portName); - - // Append options for hardware control points - systemSelect.append($('')); - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - systemSelect.val(tgtHcp); - - // Generate tooltips - deleteDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to delete device - deleteDiskForm.dialog({ - title:'Delete device from pool', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Remove any warning messages - $(this).find('.ui-state-error').remove(); - - var system = $(this).find('select[name=system]').val(); - var pool = $(this).find('input[name=zfcpPool]').val(); - var unitNo = $(this).find('input[name=zfcpUnitNo]').val(); - var portName = $(this).find('input[name=zfcpPortName]').val(); - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'input[name=zfcpUnitNo]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - var args = '--removezfcpfrompool;' + pool + ';' + unitNo; - if (portName) { - args += ';' + portName; - } - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : system, - args : args, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Open dialog to add zFCP to pool - */ -function openAddZfcp2PoolDialog() { - // Create form to add disk to pool - var dialogId = 'zvmAddDisk2Pool'; - var addDiskForm = $('
    '); - var info = createInfoBar('Add a device to a zFCP pool defined in xCAT.'); - addDiskForm.append(info); - - // Obtain mapping for zHCP to zVM system - var hcp2zvm = new Object(); - hcp2zvm = getHcpZvmHash(); - - var system = $('
    '); - var systemSelect = $(''); - system.append(systemSelect); - - var pool = $('
    '); - var status = $('
    '); - var portName = $('
    '); - var unitNo = $('
    '); - var size = $('
    '); - var range = $('
    '); - var owner = $('
    '); - addDiskForm.append(system, pool, status, portName, unitNo, size, range, owner); - - // Create a array for hardware control points - systemSelect.append($('')); - // Append options for hardware control points - for (var hcp in hcp2zvm) { - systemSelect.append($('')); - } - - // Generate tooltips - addDiskForm.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.8, - delay: 0, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - }, - - // Change z index to show tooltip in front - onBeforeShow: function() { - this.getTip().css('z-index', $.topZIndex()); - } - }); - - // Open dialog to add disk - addDiskForm.dialog({ - title:'Add device to pool', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 500, - buttons: { - "Ok": function(){ - // Delete any warning messages - $(this).find('.ui-state-error').remove(); - - var tgtSystem = $(this).find('select[name=system]').val(); - var tgtPool = $(this).find('input[name=zfcpPool]').val(); - var tgtStatus = $(this).find('select[name=zfcpStatus]').val(); - var tgtPortName = $(this).find('input[name=zfcpPortName]').val(); - var tgtUnitNo = $(this).find('input[name=zfcpUnitNo]').val(); - var tgtSize = $(this).find('input[name=zfcpSize]').val(); - var tgtRange = $(this).find('input[name=zfcpRange]').val(); - - // Device owner is optional - var tgtOwner = ""; - if ($(this).find('input[name=zfcpOwner]').val()) { - tgtOwner = $(this).find('input[name=zfcpOwner]').val(); - } - - // If inputs are not complete, show warning message - var ready = true; - var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'select[name=zfcpStatus]', 'input[name=zfcpPortName]', 'input[name=zfcpUnitNo]'); - for (var i in args) { - if (!$(this).find(args[i]).val()) { - $(this).find(args[i]).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); - } - } - - if (!ready) { - // Show warning message - var warn = createWarnBar('Please provide a value for each required field.'); - warn.prependTo($(this)); - return; - } - - // Change dialog buttons - $(this).dialog('option', 'buttons', { - 'Close': function() {$(this).dialog("close");} - }); - - // zFCP range and owner are optional - var args = '--addzfcp2pool||' + tgtPool + '||' + tgtStatus + '||"' + tgtPortName + '"||' + tgtUnitNo + '||' + tgtSize; - if (tgtRange) { - args += '||' + tgtRange; - } if (tgtOwner) { - args += '||' + tgtOwner; - } - - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chhypervisor', - tgt : tgtSystem, - args : args, - msg : dialogId - }, - - success : updateResourceDialog - }); - }, - "Cancel": function() { - $(this).dialog( "close" ); - } - } - }); -} - -/** - * Update resource dialog - * - * @param data HTTP request data - */ -function updateResourceDialog(data) { - var dialogId = data.msg; - var infoMsg; - - // Create info message - if (jQuery.isArray(data.rsp)) { - infoMsg = ''; - for (var i in data.rsp) { - infoMsg += data.rsp[i] + '
    '; - } - } else { - infoMsg = data.rsp; - } - - // Create info bar with close button - var infoBar = $('
    ').css('margin', '5px 0px'); - var icon = $('').css({ - 'display': 'inline-block', - 'margin': '10px 5px' - }); - - // Create close button to close info bar - var close = $('').css({ - 'display': 'inline-block', - 'float': 'right' - }).click(function() { - $(this).parent().remove(); - }); - - var msg = $('
    ' + infoMsg + '
    ').css({ - 'display': 'inline-block', - 'width': '90%' - }); - - infoBar.append(icon, msg, close); - infoBar.prependTo($('#' + dialogId)); -} - -/** - * Select all checkboxes in the datatable - * - * @param event Event on element - * @param obj Object triggering event - */ -function selectAllDisk(event, obj) { - // This will ascend from - var tableObj = obj.parents('.datatable'); - var status = obj.attr('checked'); - tableObj.find(' :checkbox').attr('checked', status); - - // Handle datatable scroll - tableObj = obj.parents('.dataTables_scroll'); - if (tableObj.length) { - tableObj.find(' :checkbox').attr('checked', status); - } - - event.stopPropagation(); -} - -/** - * Load network details into a table - * - * @param data HTTP request data - */ -function loadNetworkTable(data) { - // Remove loader - var panelId = 'zvmNetworkResource'; - $('#' + panelId).find('img[src="images/loader.gif"]').remove(); - - // Get zVM host names - if (!$.cookie('zvms')) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - async: false, - data : { - cmd : 'webportal', - tgt : '', - args : 'lszvm', - msg : '' - }, - - success : function(data) { - setzVMCookies(data); - } - }); - } - - var zvms = $.cookie('zvms').split(','); - var hcp2zvm = new Object(); - var args, zvm, iHcp, tmp; - for (var i in zvms) { - args = zvms[i].split(':'); - zvm = args[0].toLowerCase(); - - if (args[1].indexOf('.') != -1) { - tmp = args[1].split('.'); - iHcp = tmp[0]; - } else { - iHcp = args[1]; - } - - hcp2zvm[iHcp] = zvm; - } - - var args = data.msg.split(';'); - var hcp = args[0].replace('hcp=', ''); - var type = args[1].replace('type=', ''); - var name = jQuery.trim(args[2].replace('network=', '')); - tmp = data.rsp[0].split(hcp + ': '); - - // Resource tab ID - var info = $('#' + panelId).find('.ui-state-highlight'); - // If there is no info bar - if (!info.length) { - // Create info bar - info = createInfoBar('Below are LANs/VSWITCHes available to use.'); - $('#' + panelId).append(info); - } - - // Get datatable - var dTable = getNetworkDataTable(); - if (!dTable) { - // Create table - var tableId = 'zNetworkDataTable'; - var table = new DataTable(tableId); - table.init( [ '', 'z/VM', 'Type', 'Name', 'Layer', 'Owner', 'Controller', 'Details' ]); - - // Append datatable to tab - $('#' + panelId).append(table.object()); - - // Turn into datatable - dTable = $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - setNetworkDataTable(dTable); - - // Set the column width - var cols = table.object().find('thead tr th'); - cols.eq(0).css('width', '20px'); // HCP column - cols.eq(1).css('width', '20px'); // Type column - cols.eq(2).css('width', '20px'); // Name column - cols.eq(3).css({'width': '600px'}); // Details column - } - - // Skip index 0 because it contains nothing - var details = '
    ';
    -    for ( var i = 1; i < tmp.length; i++) {
    -        details += tmp[i];
    -    }
    -    details += '
    '; - - // Determine the OSI layer - var layer = "3"; - if (details.indexOf("ETHERNET") != -1) { - layer = "2"; - } - - // Find the vSwitch/VLAN owner - var regex = /(LAN|VSWITCH) (.*?)(?:\s|$)/g; - var owner = ""; - var match = ""; - owner = regex.exec(details)[2]; - - // Find the vSwitch controller - regex = /(?:^|\s)Controller: (.*?)(?:\s|$)/g; - var controllers = ""; - match = ""; - while (match = regex.exec(details)) { - controllers += match[1] + ","; - } - controllers = controllers.substring(0, controllers.length - 1); // Delete last two characters - - dTable.fnAddData(['', '
    ' + hcp2zvm[hcp] + '
    ', '
    ' + type + '
    ', '
    ' + name + '
    ', '
    ' + layer + '
    ', '
    ' + owner + '
    ', '
    ' + controllers + '
    ', details]); - - // Create actions menu - if (!$('#networkResourceActions').length) { - // Empty filter area - $('#' + tableId + '_length').empty(); - - // Add Vswitch/Vlan - var addLnk = $('Add'); - addLnk.bind('click', function(event){ - openAddVswitchVlanDialog(); - }); - - // Remove Vswitch/Vlan - var removeLnk = $('Remove'); - removeLnk.bind('click', function(event){ - var networkList = getNodesChecked(tableId).split(','); - if (networkList) { - openRemoveVswitchVlanDialog(networkList); - } - }); - - // Refresh table - var refreshLnk = $('Refresh'); - refreshLnk.bind('click', function(event){ - $('#zvmNetworkResource').empty().append(createLoader('')); - setNetworkDataTable(''); - - // Create a array for hardware control points - var hcps = new Array(); - if ($.cookie('hcp').indexOf(',') > -1) - hcps = $.cookie('hcp').split(','); - else - hcps.push($.cookie('hcp')); - - // Query networks - for (var i in hcps) { - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : hcps[i], - args : '--getnetworknames', - msg : hcps[i] - }, - - success : getNetwork - }); - } - }); - - // Create action bar - var actionBar = $('
    ').css("width", "450px"); - - // Create an action menu - var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_length').prepend(menuDiv); - $('#' + tableId + '_length').css({ - 'padding': '0px', - 'width': '500px' - }); - $('#' + tableId + '_filter').css('padding', '10px'); - menuDiv.append(actionBar); - } - - // Resize accordion - $('#zvmResourceAccordion').accordion('resize'); -} - -/** - * Connect a NIC to a Guest LAN - * - * @param data Data from HTTP request - */ -function connect2GuestLan(data) { - var rsp = data.rsp; - var args = data.msg.split(';'); - var node = args[0].replace('node=', ''); - var address = args[1].replace('addr=', ''); - var lanName = args[2].replace('lan=', ''); - var lanOwner = args[3].replace('owner=', ''); - - // Write ajax response to status bar - var prg = writeRsp(rsp, node + ': '); - $('#' + node + 'StatusBar').find('div').append(prg); - - // Connect NIC to Guest LAN - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--connectnic2guestlan;' + address + ';' + lanName + ';' - + lanOwner, - msg : node - }, - - success : updateZNodeStatus - }); -} - -/** - * Connect a NIC to a VSwitch - * - * @param data Data from HTTP request - */ -function connect2VSwitch(data) { - var rsp = data.rsp; - var args = data.msg.split(';'); - var node = args[0].replace('node=', ''); - var address = args[1].replace('addr=', ''); - var vswitchName = args[2].replace('vsw=', ''); - - // Write ajax response to status bar - var prg = writeRsp(rsp, node + ': '); - $('#' + node + 'StatusBar').find('div').append(prg); - - // Connect NIC to VSwitch - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'chvm', - tgt : node, - args : '--connectnic2vswitch;' + address + ';' + vswitchName, - msg : node - }, - - success : updateZNodeStatus - }); -} - -/** - * Create provision existing node division - * - * @param inst Provision tab instance - * @return Provision existing node division - */ -function createZProvisionExisting(inst) { - // Create provision existing and hide it - var provExisting = $('
    ').hide(); - - var vmFS = $('
    '); - var vmLegend = $('Virtual Machine'); - vmFS.append(vmLegend); - provExisting.append(vmFS); - - var vmAttr = $('
    '); - vmFS.append($('
    ')); - vmFS.append(vmAttr); - - var osFS = $('
    '); - var osLegend = $('Operating System'); - osFS.append(osLegend); - provExisting.append(osFS); - - var osAttr = $('
    '); - osFS.append($('
    ')); - osFS.append(osAttr); - - // Create group input - var group = $('
    '); - var groupLabel = $(''); - group.append(groupLabel); - - // Turn on auto complete for group - var groupNames = $.cookie('groups'); - if (groupNames) { - // Split group names into an array - var tmp = groupNames.split(','); - - // Create drop down for groups - var groupSelect = $(''); - groupSelect.append(''); - for (var i in tmp) { - // Add group into drop down - var opt = $(''); - groupSelect.append(opt); - } - group.append(groupSelect); - - // Create node datatable - groupSelect.change(function(){ - // Get group selected - var thisGroup = $(this).val(); - // If a valid group is selected - if (thisGroup) { - createNodesDatatable(thisGroup, 'zNodesDatatableDIV' + inst); - } - }); - } else { - // If no groups are cookied - var groupInput = $(''); - group.append(groupInput); - } - vmAttr.append(group); - - // Create node input - var node = $('
    '); - var nodeLabel = $(''); - var nodeDatatable = $('

    Select a group to view its nodes

    '); - node.append(nodeLabel); - node.append(nodeDatatable); - vmAttr.append(node); - - // Create operating system image input - var os = $('
    '); - var osLabel = $(''); - var osSelect = $(''); - osSelect.append($('')); - - var imageNames = $.cookie('imagenames').split(','); - if (imageNames) { - imageNames.sort(); - for (var i in imageNames) { - osSelect.append($('')); - } - } - os.append(osLabel); - os.append(osSelect); - osAttr.append(os); - - // Create boot method drop down - var bootMethod = $('
    '); - var methoddLabel = $(''); - var methodSelect = $(''); - methodSelect.append('' - + '' - + '' - + '' - + '' - ); - bootMethod.append(methoddLabel); - bootMethod.append(methodSelect); - osAttr.append(bootMethod); - - // Generate tooltips - provExisting.find('div input[title],select[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.7, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - } - }); - - /** - * Provision existing - */ - var provisionBtn = createButton('Provision'); - provisionBtn.bind('click', function(event) { - // Remove any warning messages - $(this).parent().parent().find('.ui-state-error').remove(); - - var ready = true; - var errMsg = ''; - - // Get provision tab ID - var thisTabId = $(this).parent().parent().parent().attr('id'); - // Get provision tab instance - var inst = thisTabId.replace('zvmProvisionTab', ''); - - // Get nodes that were checked - var dTableId = 'zNodesDatatable' + inst; - var tgts = getNodesChecked(dTableId); - if (!tgts) { - errMsg += 'You need to select a node.
    '; - ready = false; - } - - // Check operating system image - var os = $('#' + thisTabId + ' select[name=os]:visible'); - if (!os.val()) { - errMsg += 'You need to select a operating system image.'; - os.css('border', 'solid #FF0000 1px'); - ready = false; - } else { - os.css('border', 'solid #BDBDBD 1px'); - } - - // If all inputs are valid, ready to provision - if (ready) { - // Disable provision button - $(this).attr('disabled', 'true'); - - // Show loader - $('#zProvisionStatBar' + inst).show(); - $('#zProvisionLoader' + inst).show(); - - // Disable all inputs - var inputs = $('#' + thisTabId + ' input:visible'); - inputs.attr('disabled', 'disabled'); - - // Disable all selects - var selects = $('#' + thisTabId + ' select'); - selects.attr('disabled', 'disabled'); - - // Get operating system image - var osImage = $('#' + thisTabId + ' select[name=os]:visible').val(); - var tmp = osImage.split('-'); - var os = tmp[0]; - var arch = tmp[1]; - var profile = tmp[3]; - - /** - * (1) Set operating system - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeadd', - tgt : '', - args : tgts + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile, - msg : 'cmd=nodeadd;out=' + inst - }, - - success : updateZProvisionExistingStatus - }); - } else { - // Show warning message - var warn = createWarnBar(errMsg); - warn.prependTo($(this).parent().parent()); - } - }); - provExisting.append(provisionBtn); - - return provExisting; -} - -/** - * Create provision new node division - * - * @param inst Provision tab instance - * @return Provision new node division - */ -function createZProvisionNew(inst) { - // Create provision new node division - var provNew = $('
    '); - - // Create VM fieldset - var vmFS = $('
    '); - var vmLegend = $('Virtual Machine'); - vmFS.append(vmLegend); - provNew.append(vmFS); - - var vmAttr = $('
    '); - vmFS.append($('
    ')); - vmFS.append(vmAttr); - - // Create OS fieldset - var osFS = $('
    '); - var osLegend = $('Operating System'); - osFS.append(osLegend); - provNew.append(osFS); - - // Create hardware fieldset - var hwFS = $('
    '); - var hwLegend = $('Hardware'); - hwFS.append(hwLegend); - provNew.append(hwFS); - - var hwAttr = $('
    '); - hwFS.append($('
    ')); - hwFS.append(hwAttr); - - // Create tabs for basic and advanced hardware configuration - var hwTab = new Tab('hwConfig' + inst); - hwTab.init(); - hwAttr.append(hwTab.object()); - - var osAttr = $('
    '); - osFS.append($('
    ')); - osFS.append(osAttr); - - // Create group input - var group = $('
    '); - var groupLabel = $(''); - var groupInput = $(''); - // Get groups on-focus - groupInput.one('focus', function(){ - var groupNames = $.cookie('groups'); - if (groupNames) { - // Turn on auto complete - $(this).autocomplete({ - source: groupNames.split(',') - }); - } - }); - group.append(groupLabel); - group.append(groupInput); - vmAttr.append(group); - - // Create node input - var nodeName = $('
    '); - var nodeLabel = $(''); - var nodeInput = $(''); - nodeName.append(nodeLabel); - nodeName.append(nodeInput); - vmAttr.append(nodeName); - - // Create user ID input - var userId = $('
    '); - vmAttr.append(userId); - - // Create hardware control point input - var hcpDiv = $('
    '); - var hcpLabel = $(''); - var hcpInput = $(''); - hcpInput.blur(function() { - if ($(this).val()) { - var args = $(this).val().split('.'); - if (!$.cookie(args[0] + 'diskpools')) { - // Get disk pools - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : args[0], - args : '--diskpoolnames', - msg : args[0] - }, - - success : setDiskPoolCookies - }); - } - - if (!$.cookie(args[0] + 'zfcppools')) { - // Get zFCP pools - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'lsvm', - tgt : args[0], - args : '--zfcppoolnames', - msg : args[0] - }, - - success : setZfcpPoolCookies - }); - } - - if (!$.cookie(args[0] + 'userprofiles')) { - // Get zFCP pools - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - async: false, - data : { - cmd : 'lsvm', - tgt : args[0], - args : '--userprofilenames', - msg : args[0] - }, - - success : setUserProfilesCookies - }); - } - - if (!$.cookie(args[0] + 'networks') || $.cookie(args[0] + 'networks') === null) { - // Get network names - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - async: false, - data : { - cmd : 'lsvm', - tgt : args[0], - args : '--getnetworknames', - msg : args[0] - }, - - success : setNetworkCookies - }); - } - - // Reset user profile and network drop down box - var thisTabId = $(this).parents('.tab').attr('id'); - var thisUserProfile = $('#' + thisTabId + ' select[name=userProfile]'); - thisUserProfile.children().remove(); - - var definedUserProfiles = $.cookie(args[0] + 'userprofiles').split(','); - for (var i in definedUserProfiles) { - thisUserProfile.append(''); - } - - var thisNetwork = $('#' + thisTabId + ' select[name=network]'); - thisNetwork.children().remove(); - thisNetwork.append(''); // No profile option - var definedNetworks = $.cookie(args[0] + 'networks').split(','); - for (var i in definedNetworks) { - if (!jQuery.trim(definedNetworks[i])) - continue; - - var directoryEntry, interfaceName; - - // Generate directory entry statement for vSwitch, hipersocket, and guest LAN - if (definedNetworks[i].indexOf('VSWITCH ') != -1) { - interfaceName = jQuery.trim(definedNetworks[i].replace('VSWITCH ', '')); - directoryEntry = "TYPE QDIO LAN " + interfaceName; - } else if (definedNetworks[i].indexOf('LAN:HIPERS ') != -1) { - interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:HIPERS ', '')); - directoryEntry = "TYPE HIPERSOCKETS LAN " + interfaceName; - } else { - interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:QDIO ', '')); - directoryEntry = "TYPE QDIO LAN " + interfaceName; - } - - thisNetwork.append(''); - } - - // Update user entry on change - thisNetwork.change(function() { - updateUserEntry(thisTabId); - }); - - thisUserProfile.change(function() { - updateUserEntry(thisTabId); - }); - } - }); - hcpDiv.append(hcpLabel); - hcpDiv.append(hcpInput); - vmAttr.append(hcpDiv); - - // Create an advanced link to set IP address and hostname - var advancedLnk = $('
    '); - vmAttr.append(advancedLnk); - var advanced = $('
    ').hide(); - vmAttr.append(advanced); - - var ip = $('
    '); - advanced.append(ip); - var hostname = $('
    '); - advanced.append(hostname); - - // Show IP address and hostname inputs on-click - advancedLnk.click(function() { - advanced.toggle(); - }); - - // Create operating system image input - var os = $('
    '); - var osLabel = $(''); - var osSelect = $(''); - osSelect.append($('')); - - var imageNames = $.cookie('imagenames').split(','); - if (imageNames) { - imageNames.sort(); - for (var i in imageNames) { - osSelect.append($('')); - } - } - os.append(osLabel); - os.append(osSelect); - osAttr.append(os); - - // Create user entry input - var defaultChkbox = $('').click(function() { - // Remove any warning messages - $(this).parents('.form').find('.ui-state-error').remove(); - - // Get tab Id - var thisTabId = $(this).parents('.ui-tabs-panel').parents('.ui-tabs-panel').attr('id'); - - // Get objects for HCP, user ID, and OS - var userId = $('#' + thisTabId + ' input[name=userId]'); - var os = $('#' + thisTabId + ' select[name=os]'); - - // Get default user entry when clicked - if ($(this).attr('checked')) { - if (!os.val() || !userId.val()) { - // Show warning message - var warn = createWarnBar('Please specify the operating system and user ID before checking this box'); - warn.prependTo($(this).parents('.form')); - - // Highlight empty fields - jQuery.each([os, userId], function() { - if (!$(this).val()) { - $(this).css('border', 'solid #FF0000 1px'); - } - }); - } else { - // Un-highlight empty fields - jQuery.each([os, userId], function() { - $(this).css('border', 'solid #BDBDBD 1px'); - }); - - // Get profile name - var tmp = os.val().split('-'); - var profile = tmp[3]; - - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : 'getdefaultuserentry;' + profile, - msg : thisTabId - }, - - success:function(data) { - // Populate user entry - var tabId = data.msg; - var entry = new String(data.rsp); - var userId = $('#' + tabId + ' input[name=userId]').val(); - entry = entry.replace(new RegExp('LXUSR', 'g'), userId); - $('#' + tabId + ' textarea:visible').val(entry); - } - }); - } - } else { - $('#' + thisTabId + ' textarea:visible').val(''); - - // Un-highlight empty fields - jQuery.each([os, userId], function() { - $(this).css('border', 'solid #BDBDBD 1px'); - }); - } - }); - var userEntry = $('
    '); - userEntry.append($('').append(defaultChkbox, 'Use default')); - - // Add division on basic tab for specifying: memory, # of CPUs, privilege, user profile, and network. - var basicConfig = $('
    '); - var userProfile = $('
    '); - var cpuSelect = $('').change(function() { - updateUserEntry('zvmProvisionTab' + inst); - }); - var cpuCount = $('
    ').append(cpuSelect); - var memorySlider = $('
    '); - var memorySize = $(''); - var memory = $('
    ').append(memorySlider, memorySize); - var acceptableMemorySize = ['512M', '1024M', '2G', '3G', '4G', '5G', '6G', '7G', '8G']; - memorySlider.slider({ - value: 0, - min: 0, - max: 8, - step: 1, - slide: function(event, ui) { - $('#basicConfig' + inst + ' input[name=memory]').val(acceptableMemorySize[ui.value]); - - // Update user entry on change - updateUserEntry('zvmProvisionTab' + inst); - } - }); - - // Initialize storage size - memorySize.val(acceptableMemorySize[0]); - - var privilege = $('
    ' + - '
    ' + - ' A - Primary system operator
    ' + - ' B - System resource operator
    ' + - ' C - System programmer
    ' + - ' D - Spooling operator
    ' + - ' E - System analyst
    ' + - ' F - IBM service representative
    ' + - ' G - General user
    ' + - '
    ' + - '
    '); - privilege.find('input').change(function() { - updateUserEntry('zvmProvisionTab' + inst); - }); - - var network = $('
    '); - - basicConfig.append(userProfile, cpuCount, memory, privilege, network); - hwTab.add('basicConfig' + inst, 'Basic', basicConfig, false); - - // Add division on advanced tab for specifying user directory entry - hwTab.add('advancedConfig' + inst, 'Advanced', userEntry, false); - - // Create disk table - var diskDiv = $('
    '); - var diskLabel = $(''); - var diskTable = $('
    '); - var diskHeader = $(' Type Address Size Mode Pool Password IPL'); - // Adjust header width - diskHeader.find('th').css( { - 'width' : '80px' - }); - diskHeader.find('th').eq(0).css( { - 'width' : '20px' - }); - var diskBody = $(''); - var diskFooter = $(''); - - /** - * Add disks - */ - var addDiskLink = $('Add disk'); - addDiskLink.bind('click', function(event) { - // Get list of disk pools - var thisTabId = $(this).parents('.tab').attr('id'); - var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); - var definedPools = null; - if (thisHcp) { - // Get node without domain name - var temp = thisHcp.split('.'); - definedPools = $.cookie(temp[0] + 'diskpools').split(','); - } - - // Create a row - var diskRow = $(''); - - // Add remove button - var removeBtn = $(''); - var col = $('').append(removeBtn); - removeBtn.bind('click', function(event) { - diskRow.remove(); - }); - diskRow.append(col); - - // Create disk type drop down - var diskType = $(''); - var diskTypeSelect = $(''); - diskTypeSelect.append('' - + '' - ); - diskType.append(diskTypeSelect); - diskRow.append(diskType); - - // Create disk address input - var diskAddr = $(''); - diskRow.append(diskAddr); - - // Create disk size input - var diskSize = $(''); - diskRow.append(diskSize); - - // Create disk mode input - var diskMode = $(''); - var diskModeSelect = $(''); - diskModeSelect.append('' - + '' - + '' - + '' - + '' - + '' - + '' - ); - diskMode.append(diskModeSelect); - diskRow.append(diskMode); - - // Create disk pool drop down - var diskPool = $(''); - var diskPoolSelect = $(''); - for (var i in definedPools) { - diskPoolSelect.append(''); - } - diskPool.append(diskPoolSelect); - diskRow.append(diskPool); - - // Create disk password input - var diskPw = $(''); - diskRow.append(diskPw); - - // Create IPL checkbox - var diskIpl = $(''); - diskRow.append(diskIpl); - diskIpl.find('input').change(function() { - updateUserEntry(thisTabId); - }); - - diskBody.append(diskRow); - - // Generate tooltips - diskBody.find('td input[title],select[title]').tooltip({ - position: "top right", - offset: [-4, 4], - effect: "fade", - opacity: 0.7, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - } - }); - }); - - // Create disk table - diskFooter.append(addDiskLink); - diskTable.append(diskHeader); - diskTable.append(diskBody); - diskTable.append(diskFooter); - - diskDiv.append(diskLabel); - diskDiv.append(diskTable); - hwAttr.append(diskDiv); - - // Create zFCP table - var zfcpDiv = $('
    '); - var zfcpLabel = $(''); - var zfcpTable = $('
    '); - var zfcpHeader = $(' Address Size Pool Tag Port Name Unit # LOADDEV'); - // Adjust header width - zfcpHeader.find('th').css({ - 'width' : '80px' - }); - zfcpHeader.find('th').eq(0).css({ - 'width' : '20px' - }); - var zfcpBody = $(''); - var zfcpFooter = $(''); - - /** - * Add zFCP devices - */ - var addZfcpLink = $('Add zFCP'); - addZfcpLink.bind('click', function(event) { - // Get list of disk pools - var thisTabId = $(this).parents('.tab').attr('id'); - var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); - var definedPools = null; - if (thisHcp) { - // Get node without domain name - var temp = thisHcp.split('.'); - definedPools = $.cookie(temp[0] + 'zfcppools').split(','); - } - - // Create a row - var zfcpRow = $(''); - - // Add remove button - var removeBtn = $(''); - var col = $('').append(removeBtn); - removeBtn.bind('click', function(event) { - zfcpRow.remove(); - }); - zfcpRow.append(col); - - // Create disk address input - var zfcpAddr = $(''); - zfcpRow.append(zfcpAddr); - - // Create disk size input - var zfcpSize = $(''); - zfcpRow.append(zfcpSize); - - // Create zFCP pool drop down - var zfcpPool = $(''); - var zfcpPoolSelect = $(''); - for (var i in definedPools) { - zfcpPoolSelect.append(''); - } - zfcpPool.append(zfcpPoolSelect); - zfcpRow.append(zfcpPool); - - // Create disk tag - var zfcpTag = $(''); - zfcpRow.append(zfcpTag); - - // Create device port name - var zfcpPortName = $(''); - zfcpRow.append(zfcpPortName); - - // Create device unit number - var zfcpUnitNo = $(''); - zfcpRow.append(zfcpUnitNo); - - // Create LOADDEV checkbox - var zfcpLoaddev = $(''); - zfcpRow.append(zfcpLoaddev); - - zfcpBody.append(zfcpRow); - - // Generate tooltips - zfcpBody.find('td input[title],select[title]').tooltip({ - position: "top right", - offset: [-4, 4], - effect: "fade", - opacity: 0.7, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - } - }); - }); - - zfcpFooter.append(addZfcpLink); - zfcpTable.append(zfcpHeader); - zfcpTable.append(zfcpBody); - zfcpTable.append(zfcpFooter); - - zfcpDiv.append(zfcpLabel); - zfcpDiv.append(zfcpTable); - hwAttr.append(zfcpDiv); - - // Generate tooltips - provNew.find('div input[title],select[title],textarea[title]').tooltip({ - position: "center right", - offset: [-2, 10], - effect: "fade", - opacity: 0.7, - predelay: 800, - events: { - def: "mouseover,mouseout", - input: "mouseover,mouseout", - widget: "focus mouseover,blur mouseout", - tooltip: "mouseover,mouseout" - } - }); - - // Disable IPL column if advanced tab is selected - hwTab.object().tabs({ - select: function(event, ui) { - // Get provision tab instance - var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); - var inst = thisTabId.replace('zvmProvisionTab', ''); - - // Disable and de-select IPL device - if (ui.index == 1) { - $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').attr('disabled','disabled'); - } else { - $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('disabled'); - } - - $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('checked'); - } - }); - - /** - * Provision new - */ - var provisionBtn = createButton('Provision'); - provisionBtn.bind('click', function(event) { - // Remove any warning messages - $(this).parent().parent().find('.ui-state-error').remove(); - - var ready = true; - var errMsg = ''; - - // Get tab ID - var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); - // Get provision tab instance - var inst = thisTabId.replace('zvmProvisionTab', ''); - - // Get the selected hardware configuration tab - // Basic tab index = 0 & advanced tab index = 1 - var hwTabIndex = $("#hwConfig" + inst).tabs('option', 'selected'); - - // Check node name, userId, hardware control point, and group - // Check disks and zFCP devices - var inputs = $('#' + thisTabId + ' input:visible'); - for (var i = 0; i < inputs.length; i++) { - // Do not check some inputs - if (inputs.eq(i).attr('name') == 'memory') { - // There should always be a value for memory - // Do not change the border - continue; - } else if (!inputs.eq(i).val() - && inputs.eq(i).attr('type') != 'password' - && inputs.eq(i).attr('name') != 'zfcpTag' - && inputs.eq(i).attr('name') != 'zfcpPortName' - && inputs.eq(i).attr('name') != 'zfcpUnitNo') { - inputs.eq(i).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - inputs.eq(i).css('border', 'solid #BDBDBD 1px'); - } - } - - var selects = $('#' + thisTabId + ' select:visible'); - for (var i = 0; i < selects.length; i++) { - if (!selects.eq(i).val() && selects.eq(i).attr('name') != 'os' && selects.eq(i).attr('name') != 'userProfile' && selects.eq(i).attr('name') != 'network') { - selects.eq(i).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - selects.eq(i).css('border', 'solid #BDBDBD 1px'); - } - } - - if (hwTabIndex == 1) { - // Check user entry - var thisUserEntry = $('#' + thisTabId + ' textarea:visible'); - thisUserEntry.val(thisUserEntry.val().toUpperCase()); - if (!thisUserEntry.val()) { - thisUserEntry.css('border', 'solid #FF0000 1px'); - ready = false; - } else { - thisUserEntry.css('border', 'solid #BDBDBD 1px'); - } - - // Check if user entry contains user ID - var thisUserId = $('#' + thisTabId + ' input[name=userId]:visible'); - var pos = thisUserEntry.val().indexOf('USER ' + thisUserId.val().toUpperCase()); - if (pos < 0) { - - pos = thisUserEntry.val().indexOf('IDENTITY ' + thisUserId.val().toUpperCase()); - if (pos < 0) { - errMsg = errMsg + 'The directory entry does not contain the correct user/identity ID.
    '; - ready = false; - } - } - } - - // Show error message for missing inputs - if (!ready) { - errMsg = errMsg + 'Please provide a value for each missing field.
    '; - } - - // If no operating system is specified, create only user entry - os = $('#' + thisTabId + ' select[name=os]:visible'); - - // Check number of disks - var diskRows = $('#' + thisTabId + ' table tr'); - // If an OS is given, disks are needed - if (os.val() && (diskRows.length < 1)) { - errMsg = errMsg + 'You need to add at some disks.
    '; - ready = false; - } - - // If inputs are valid, ready to provision - if (ready) { - // Generate user directory entry if basic tab is selected - if (hwTabIndex == 0) { - updateUserEntry(thisTabId); - } - - if (!os.val()) { - // If no OS is given, create a virtual server - var msg = ''; - if (diskRows.length > 0) { - msg = 'Do you want to create a virtual server without an operating system?'; - } else { - // If no disks are given, create a virtual server (no disk) - msg = 'Do you want to create a virtual server without an operating system or disks?'; - } - - // Open dialog to confirm - var confirmDialog = $('

    ' + msg + '

    '); - confirmDialog.dialog({ - title:'Confirm', - modal: true, - close: function(){ - $(this).remove(); - }, - width: 400, - buttons: { - "Ok": function(){ - // Disable provision button - provisionBtn.attr('disabled', 'true'); - - // Show loader - $('#zProvisionStatBar' + inst).show(); - $('#zProvisionLoader' + inst).show(); - - // Disable add disk button - addDiskLink.attr('disabled', 'true'); - - // Disable close button on disk table - $('#' + thisTabId + ' table span').unbind('click'); - - // Disable all inputs - var inputs = $('#' + thisTabId + ' input'); - inputs.attr('disabled', 'disabled'); - - // Disable all selects - var selects = $('#' + thisTabId + ' select'); - selects.attr('disabled', 'disabled'); - - // Add a new line at the end of the user entry - var textarea = $('#' + thisTabId + ' textarea'); - var tmp = jQuery.trim(textarea.val()); - textarea.val(tmp + '\n'); - textarea.attr('readonly', 'readonly'); - textarea.css( { - 'background-color' : '#F2F2F2' - }); - - // Get node name - var node = $('#' + thisTabId + ' input[name=nodeName]').val(); - // Get userId - var userId = $('#' + thisTabId + ' input[name=userId]').val(); - // Get hardware control point - var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); - // Get group - var group = $('#' + thisTabId + ' input[name=group]').val(); - // Get IP address and hostname - var ip = $('#' + thisTabId + ' input[name=ip]').val(); - var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); - - // Generate arguments to sent - var args = node + ';zvm.hcp=' + hcp - + ';zvm.userid=' + userId - + ';nodehm.mgt=zvm' - + ';groups=' + group; - if (ip) - args += ';hosts.ip=' + ip; - - if (hostname) - args += ';hosts.hostnames=' + hostname; - - /** - * (1) Define node - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeadd', - tgt : '', - args : args, - msg : 'cmd=nodeadd;out=' + inst - }, - - success : updateZProvisionNewStatus - }); - - $(this).dialog("close"); - }, - "Cancel": function() { - $(this).dialog("close"); - } - } - }); - } else { - /** - * Create a virtual server and install OS - */ - - // Disable provision button - $(this).attr('disabled', 'true'); - - // Show loader - $('#zProvisionStatBar' + inst).show(); - $('#zProvisionLoader' + inst).show(); - - // Disable add disk button - addDiskLink.attr('disabled', 'true'); - - // Disable close button on disk table - $('#' + thisTabId + ' table span').unbind('click'); - - // Disable all inputs - var inputs = $('#' + thisTabId + ' input'); - inputs.attr('disabled', 'disabled'); - inputs.css( { - 'background-color' : '#F2F2F2' - }); - - // Disable all selects - var selects = $('#' + thisTabId + ' select'); - selects.attr('disabled', 'disabled'); - selects.css( { - 'background-color' : '#F2F2F2' - }); - - // Add a new line at the end of the user entry - var textarea = $('#' + thisTabId + ' textarea'); - var tmp = jQuery.trim(textarea.val()); - textarea.val(tmp + '\n'); - textarea.attr('readonly', 'readonly'); - textarea.css( { - 'background-color' : '#F2F2F2' - }); - - // Get node name - var node = $('#' + thisTabId + ' input[name=nodeName]').val(); - // Get userId - var userId = $('#' + thisTabId + ' input[name=userId]').val(); - // Get hardware control point - var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); - // Get group - var group = $('#' + thisTabId + ' input[name=group]').val(); - // Get IP address and hostname - var ip = $('#' + thisTabId + ' input[name=ip]').val(); - var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); - - // Generate arguments to sent - var args = node + ';zvm.hcp=' + hcp - + ';zvm.userid=' + userId - + ';nodehm.mgt=zvm' - + ';groups=' + group; - if (ip) - args += ';hosts.ip=' + ip; - - if (hostname) - args += ';hosts.hostnames=' + hostname; - - /** - * (1) Define node - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeadd', - tgt : '', - args : args, - msg : 'cmd=nodeadd;out=' + inst - }, - - success : updateZProvisionNewStatus - }); - } - } else { - // Show warning message - var warn = createWarnBar(errMsg); - warn.prependTo($(this).parent().parent()); - } - }); - provNew.append(provisionBtn); - - return provNew; -} - -/** - * Load zVMs into column (service page) - * - * @param col Table column where OS images will be placed - */ -function loadzVMs(col) { - // Get group names and description and append to group column - if (!$.cookie('zvms')) { - var infoBar = createInfoBar('No selectable z/VM available'); - col.append(infoBar); - return; - } - - var zNames = $.cookie('zvms').split(','); - - var radio, zBlock, args, zvm, hcp; - for (var i in zNames) { - args = zNames[i].split(':'); - zvm = args[0]; - hcp = args[1]; - - // Create block for each group - zBlock = $('
    ').css({ - 'border': '1px solid', - 'max-width': '200px', - 'margin': '5px auto', - 'padding': '5px', - 'display': 'block', - 'vertical-align': 'middle', - 'cursor': 'pointer', - 'white-space': 'normal' - }).click(function(){ - $(this).children('input:radio').attr('checked', 'checked'); - $(this).parents('td').find('div').attr('class', 'ui-state-default'); - $(this).attr('class', 'ui-state-active'); - }); - radio = $('').css('display', 'none'); - zBlock.append(radio, $('' + zvm + ' managed by ' + hcp + '')); - zBlock.children('span').css({ - 'display': 'block', - 'margin': '5px', - 'text-align': 'left' - }); - col.append(zBlock); - } -} - -/** - * Load groups into column - * - * @param col Table column where OS images will be placed - */ -function loadSrvGroups(col) { - // Get group names and description and append to group column - if (!$.cookie('srv_groups')) { - var infoBar = createInfoBar('No selectable group available'); - col.append(infoBar); - return; - } - - var groupNames = $.cookie('srv_groups').split(','); - - var groupBlock, radio, args, name, ip, hostname, desc; - for (var i in groupNames) { - args = groupNames[i].split(':'); - name = args[0]; - ip = args[1]; - hostname = args[2]; - desc = args[3]; - - // Create block for each group - groupBlock = $('
    ').css({ - 'border': '1px solid', - 'max-width': '200px', - 'margin': '5px auto', - 'padding': '5px', - 'display': 'block', - 'vertical-align': 'middle', - 'cursor': 'pointer', - 'white-space': 'normal' - }).click(function(){ - $(this).children('input:radio').attr('checked', 'checked'); - $(this).parents('td').find('div').attr('class', 'ui-state-default'); - $(this).attr('class', 'ui-state-active'); - }); - radio = $('').css('display', 'none'); - groupBlock.append(radio, $('' + name + ': ' + desc + '')); - groupBlock.children('span').css({ - 'display': 'block', - 'margin': '5px', - 'text-align': 'left' - }); - col.append(groupBlock); - } -} - -/** - * Load OS images into column - * - * @param col Table column where OS images will be placed - */ -function loadOSImages(col) { - // Get group names and description and append to group column - if (!$.cookie('srv_imagenames')) { - var infoBar = createInfoBar('No selectable image available'); - col.append(infoBar); - return; - } - - var imgNames = $.cookie('srv_imagenames').split(','); - - var imgBlock, radio, args, name, desc; - for (var i in imgNames) { - args = imgNames[i].split(':'); - name = args[0]; - desc = args[1]; - - // Create block for each image - imgBlock = $('
    ').css({ - 'border': '1px solid', - 'max-width': '200px', - 'margin': '5px auto', - 'padding': '5px', - 'display': 'block', - 'vertical-align': 'middle', - 'cursor': 'pointer', - 'white-space': 'normal' - }).click(function(){ - $(this).children('input:radio').attr('checked', 'checked'); - $(this).parents('td').find('div').attr('class', 'ui-state-default'); - $(this).attr('class', 'ui-state-active'); - - $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').attr('checked', ''); - $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').parents('td').find('div').attr('class', 'ui-state-default'); - }); - radio = $('').css('display', 'none'); - imgBlock.append(radio, $('' + name + ': ' + desc + '')); - imgBlock.children('span').css({ - 'display': 'block', - 'margin': '5px', - 'text-align': 'left' - }); - col.append(imgBlock); - } -} - -/** - * Load golden images into column - * - * @param col Table column where master copies will be placed - */ -function loadGoldenImages(col) { - // Get group names and description and append to group column - if (!$.cookie('srv_goldenimages')) { - var infoBar = createInfoBar('No selectable master copies available'); - col.append(infoBar); - return; - } - - var imgNames = $.cookie('srv_goldenimages').split(','); - - var imgBlock, radio, args, name, desc; - for (var i in imgNames) { - args = imgNames[i].split(':'); - name = args[0]; - desc = args[1]; - - // Create block for each image - imgBlock = $('
    ').css({ - 'border': '1px solid', - 'max-width': '200px', - 'margin': '5px auto', - 'padding': '5px', - 'display': 'block', - 'vertical-align': 'middle', - 'cursor': 'pointer', - 'white-space': 'normal' - }).click(function(){ - $(this).children('input:radio').attr('checked', 'checked'); - $(this).parents('td').find('div').attr('class', 'ui-state-default'); - $(this).attr('class', 'ui-state-active'); - - // Un-select zVM and image - $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').attr('checked', ''); - $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').parents('td').find('div').attr('class', 'ui-state-default'); - - $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').attr('checked', ''); - $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').parents('td').find('div').attr('class', 'ui-state-default'); - }); - radio = $('').css('display', 'none'); - imgBlock.append(radio, $('' + name + ': ' + desc + '')); - imgBlock.children('span').css({ - 'display': 'block', - 'margin': '5px', - 'text-align': 'left' - }); - col.append(imgBlock); - } -} - -/** - * Set a cookie for zVM host names (service page) - * - * @param data Data from HTTP request - */ -function setzVMCookies(data) { - if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { - var zvms = new Array(); - var hosts = data.rsp[0].split("\n"); - for ( var i = 0; i < hosts.length; i++) { - if (hosts[i] != null && hosts[i] != "") { - zvms.push(hosts[i]); - } - } - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie('zvms', zvms, { expires: exDate }); - } -} - -/** - * Set a cookie for master copies (service page) - * - * @param data Data from HTTP request - */ -function setGoldenImagesCookies(data) { - if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { - var copies = new Array(); - var tmp = data.rsp[0].split(","); - for ( var i = 0; i < tmp.length; i++) { - if (tmp[i] != null && tmp[i] != "") { - copies.push(tmp[i]); - } - } - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie('srv_goldenimages', copies, { expires: exDate }); - } -} - -/** - * Set a cookie for disk pool names of a given node - * - * @param data Data from HTTP request - */ -function setDiskPoolCookies(data) { - if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { - var node = data.msg; - var pools = data.rsp[0].split(node + ': '); - for (var i in pools) { - pools[i] = jQuery.trim(pools[i]); - } - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie(node + 'diskpools', pools, { expires: exDate }); - } -} - -/** - * Set a cookie for zFCP pool names of a given node - * - * @param data Data from HTTP request - */ -function setZfcpPoolCookies(data) { - if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { - var node = data.msg; - var pools = data.rsp[0].split(node + ': '); - for (var i in pools) { - pools[i] = jQuery.trim(pools[i]); - } - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie(node + 'zfcppools', pools, { expires: exDate }); - } -} - -/** - * Set a cookie for zHCP host names - * - * @param zhcps List of zHCPs known - */ -function setzHcpCookies(zhcps) { - if (zhcps.length) { - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie('zhcps', zhcps, { expires: exDate }); - } -} - -/** - * Set a cookie for z/VM user profile names of a given node - * - * @param data Data from HTTP request - */ -function setUserProfilesCookies(data) { - if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) { - var node = data.msg; - var profiles = data.rsp[0].split(node + ': '); - for (var i in profiles) { - profiles[i] = jQuery.trim(profiles[i]); - } - - // Set cookie to expire in 60 minutes - var exDate = new Date(); - exDate.setTime(exDate.getTime() + (240 * 60 * 1000)); - $.cookie(node + 'userprofiles', profiles, { expires: exDate }); - } -} - -/** - * Create virtual machine (service page) - * - * @param tabId Tab ID - * @param group Group - * @param hcp Hardware control point - * @param img OS image - */ -function createzVM(tabId, group, hcp, img, owner) { - // Submit request to create VM - // webportal provzlinux [group] [hcp] [image] [owner] - var iframe = createIFrame('lib/srv_cmd.php?cmd=webportal&tgt=&args=provzlinux;' + group + ';' + hcp + ';' + img + ';' + owner + '&msg=&opts=flush'); - iframe.prependTo($('#' + tabId)); -} - -/** - * Query the profiles that exists - * - * @param panelId Panel ID - */ -function queryProfiles(panelId) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : 'osimage', - msg : panelId - }, - - success : function(data) { - var panelId = data.msg; - setOSImageCookies(data); - configProfilePanel(panelId); - } - }); -} - -/** - * Panel to configure directory entries and disks for a profile - * - * @param panelId Panel ID - */ -function configProfilePanel(panelId) { - // Wipe panel clean - $('#' + panelId).empty(); - - // Add info bar - $('#' + panelId).append(createInfoBar('Create, edit, and delete profiles for the self-service portal. It is important to note the default z/VM user ID for any profile should be LXUSR.')); - - // Create table - var tableId = 'zvmProfileTable'; - var table = new DataTable(tableId); - table.init(['', 'Profile', 'Disk pool', 'Disk size', 'Directory entry']); - - // Insert profiles into table - var profiles = $.cookie('profiles').split(','); - profiles.push('default'); // Add default profile - for (var i in profiles) { - if (profiles[i]) { - // Columns are: profile, selectable, description, disk pool, disk size, and directory entry - var cols = new Array(profiles[i], '', '', ''); - - // Add remove button where id = user name - cols.unshift(''); - - // Add row - table.add(cols); - } - } - - // Append datatable to tab - $('#' + panelId).append(table.object()); - - // Turn into datatable - $('#' + tableId).dataTable({ - 'iDisplayLength': 50, - 'bLengthChange': false, - "bScrollCollapse": true, - "sScrollY": "400px", - "sScrollX": "110%", - "bAutoWidth": true, - "oLanguage": { - "oPaginate": { - "sNext": "", - "sPrevious": "" - } - } - }); - - // Create action bar - var actionBar = $('
    ').css("width", "450px"); - - // Create a profile - var createLnk = $('Create'); - createLnk.click(function() { - profileDialog(); - }); - - // Edit a profile - var editLnk = $('Edit'); - editLnk.click(function() { - var profiles = $('#' + tableId + ' input[type=checkbox]:checked'); - for (var i in profiles) { - var profile = profiles.eq(i).attr('name'); - if (profile) { - // Column order is: profile, selectable, disk pool, disk size, and directory entry - var cols = profiles.eq(i).parents('tr').find('td'); - var pool = cols.eq(2).text(); - var size = cols.eq(3).text(); - var entry = cols.eq(4).html().replace(new RegExp('
    ', 'g'), '\n'); - - editProfileDialog(profile, pool, size, entry); - } - } - }); - - // Delete a profile - var deleteLnk = $('Delete'); - deleteLnk.click(function() { - var profiles = getNodesChecked(tableId); - if (profiles) { - deleteProfileDialog(profiles); - } - }); - - // Refresh profiles table - var refreshLnk = $('Refresh'); - refreshLnk.click(function() { - queryProfiles(panelId); - }); - - // Create an action menu - var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]); - actionsMenu.superfish(); - actionsMenu.css('display', 'inline-block'); - actionBar.append(actionsMenu); - - // Set correct theme for action menu - actionsMenu.find('li').hover(function() { - setMenu2Theme($(this)); - }, function() { - setMenu2Normal($(this)); - }); - - // Create a division to hold actions menu - var menuDiv = $(''); - $('#' + tableId + '_wrapper').prepend(menuDiv); - menuDiv.append(actionBar); - $('#' + tableId + '_filter').appendTo(menuDiv); - - // Resize accordion - $('#' + tableId).parents('.ui-accordion').accordion('resize'); - - // Query directory entries and disk pool/size for each profile - for (var i in profiles) { - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : 'getdefaultuserentry;' + profiles[i], - msg : 'out=' + panelId + ';profile=' + profiles[i] - }, - - success: insertDirectoryEntry - }); - - $.ajax({ - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'webrun', - tgt : '', - args : 'getzdiskinfo;' + profiles[i], - msg : 'out=' + panelId + ';profile=' + profiles[i] - }, - - success: insertDiskInfo - }); - } -} - -/** - * Insert the directory entry into the profile table - * - * @param data Data from HTTP request - */ -function insertDirectoryEntry(data) { - var tableId = 'zvmProfileTable'; - var args = data.msg.split(';'); - - var profile = args[1].replace('profile=', ''); - - // Do not continue if there is nothing - if (!data.rsp.length) - return; - - var entry = data.rsp[0].replace(new RegExp('\n', 'g'), '
    '); - - // Get the row containing the profile - var rowPos = findRow(profile, '#' + tableId, 1); - if (rowPos < 0) - return; - - // Update the directory entry column - var dTable = $('#' + tableId).dataTable(); - dTable.fnUpdate(entry, rowPos, 4, false); - - // Adjust table styling - $('#' + tableId + ' td:nth-child(5)').css({ - 'text-align': 'left' - }); - adjustColumnSize(tableId); -} - -/** - * Insert the disk info into the profile table - * - * @param data Data from HTTP request - */ -function insertDiskInfo(data) { - var tableId = 'zvmProfileTable'; - var args = data.msg.split(';'); - - var profile = args[1].replace('profile=', ''); - - // Do not continue if there is nothing - if (!data.rsp.length) - return; - - // Get the row containing the profile - var rowPos = findRow(profile, '#' + tableId, 1); - if (rowPos < 0) - return; - - // Update the disk info columns - var dTable = $('#' + tableId).dataTable(); - - var tmp = ""; - var pool = ""; - var eckdSize = 0; - var info = data.rsp[0].split('\n'); - for (var i in info) { - if (info[i].indexOf('diskpool') > -1) { - tmp = info[i].split('='); - pool = jQuery.trim(tmp[1]); - - dTable.fnUpdate(pool, rowPos, 2, false); - } if (info[i].indexOf('eckd_size') > -1) { - tmp = info[i].split('='); - eckdSize = jQuery.trim(tmp[1]); - - dTable.fnUpdate(eckdSize, rowPos, 3, false); - } - } - - // Adjust table styling - adjustColumnSize(tableId); -} - -/** - * Open profile dialog - */ -function profileDialog() { - // Create form to add profile - var dialogId = 'zvmCreateProfile'; - var profileForm = $('
    '); - - // Create info bar - var info = createInfoBar('Configure the default settings for a profile'); - profileForm.append(info); - - // Insert profiles into select - var profileSelect = $(''); - var profiles = $.cookie('profiles').split(','); - profiles.push('default'); // Add default profile - for (var i in profiles) { - if (profiles[i]) { - profileSelect.append($('')); - } - } - - profileForm.append($('
    ').append(profileSelect)); - profileForm.append('
    '); - profileForm.append('
    '); - profileForm.append('
    '); + for ( var i = 1; i < userEntry.length; i++) { + userEntry[i] = jQuery.trim(userEntry[i]); + txtArea.append(userEntry[i]); + + if (i < userEntry.length) { + txtArea.append('\n'); + } + } + txtArea.attr('readonly', 'readonly'); + fieldSet.append(txtArea); + + /** + * Edit user entry + */ + txtArea.bind('dblclick', function(event) { + txtArea.attr('readonly', ''); + txtArea.css( { + 'border-width' : '1px' + }); + + saveBtn.show(); + cancelBtn.show(); + saveBtn.css('display', 'inline-table'); + cancelBtn.css('display', 'inline-table'); + }); + + /** + * Save + */ + var saveBtn = createButton('Save').hide(); + saveBtn.bind('click', function(event) { + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); + + // Replace user entry + var newUserEntry = jQuery.trim(txtArea.val()) + '\n'; + + // Replace user entry + $.ajax( { + url : 'lib/zCmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--replacevs', + att : newUserEntry, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process and save it in a cookie + incrementNodeProcess(node); + + txtArea.attr('readonly', 'readonly'); + txtArea.css( { + 'border-width' : '0px' + }); + + // Disable save button + $(this).hide(); + cancelBtn.hide(); + }); + + /** + * Cancel + */ + var cancelBtn = createButton('Cancel').hide(); + cancelBtn.bind('click', function(event) { + txtArea.attr('readonly', 'readonly'); + txtArea.css( { + 'border-width' : '0px' + }); + + cancelBtn.hide(); + saveBtn.hide(); + }); + + // Create info bar + var infoBar = createInfoBar('Double click on the directory entry to edit it.'); + + // Append user entry into division + $('#' + ueDivId).append(infoBar); + $('#' + ueDivId).append(fieldSet); + $('#' + ueDivId).append(saveBtn); + $('#' + ueDivId).append(cancelBtn); +} + +/** + * Increment number of processes running against a node + * + * @param node Node to increment running processes + */ +function incrementNodeProcess(node) { + // Get current processes + var procs = $.cookie(node + 'processes'); + if (procs) { + // One more process + procs = parseInt(procs) + 1; + $.cookie(node + 'processes', procs); + } else { + $.cookie(node + 'processes', 1); + } +} + +/** + * Update provision new node status + * + * @param data Data returned from HTTP request + */ +function updateZProvisionNewStatus(data) { + // Parse ajax response + var rsp = data.rsp; + var args = data.msg.split(';'); + var lastCmd = args[0].replace('cmd=', ''); + var out2Id = args[1].replace('out=', ''); + if (typeof console == "object"){ + console.log("Entering updateZProvisionNewStatus. Last command:<"+lastCmd+"> All args:<"+args+">"); + } + // IDs for status bar, tab, and loader + var statBarId = 'zProvisionStatBar' + out2Id; + var tabId = 'zvmProvisionTab' + out2Id; + var loaderId = 'zProvisionLoader' + out2Id; + + var node = $('#' + tabId + ' input[name=nodeName]').val(); + + /** + * (2) Create user entry + */ + if (lastCmd == 'nodeadd') { + if (rsp.length) { + $('#' + loaderId).hide(); + $('#' + statBarId).find('div').append('
    (Error) Failed to create node definition
    '); + } else { + $('#' + statBarId).find('div').append('
    Node definition created for ' + node + '
    '); + + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // Create user entry + var userEntry = $('#' + tabId + ' textarea').val(); + $.ajax( { + url : 'lib/zCmd.php', + dataType : 'json', + data : { + cmd : 'mkvm', + tgt : node, + args : '', + att : userEntry, + msg : 'cmd=mkvm;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + /** + * (3) Update /etc/hosts + */ + else if (lastCmd == 'mkvm') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // If there was an error, quit + if (containErrors(prg.html())) { + $('#' + loaderId).hide(); + } else { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makehosts', + tgt : '', + args : '', + msg : 'cmd=makehosts;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + /** + * If sourceforge xcat: (4) Update DNS + */ + else if ((lastCmd == 'makehosts') && (builtInXCAT == 0)) { + // If there was an error, quit + if (rsp.length) { + $('#' + loaderId).hide(); + $('#' + statBarId).find('div').append('
    (Error) Failed to update /etc/hosts
    '); + } else { + $('#' + statBarId).find('div').append('
    /etc/hosts updated
    '); + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedns', + tgt : '', + args : '', + msg : 'cmd=makedns;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + /** + * If built in zVM xcat and last command was makehosts or + * If sourceforge xCAT and lastCmd was makedns + * (5) Add disk + * + */ + else if (((lastCmd == 'makehosts') && (builtInXCAT == 1)) || + ((lastCmd == 'makedns') && (builtInXCAT == 0))) { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // If there was an error, quit + if (rsp.length) { + $('#' + loaderId).hide(); + if (builtInXCAT == 1) { + $('#' + statBarId).find('div').append('
    (Error) Failed to update /etc/hosts
    '); + } else { + $('#' + statBarId).find('div').append('
    (Error) Failed to makedns
    '); + } + } else { + if (builtInXCAT == 1) { + $('#' + statBarId).find('div').append('
    /etc/hosts updated
    '); + } else { + $('#' + statBarId).find('div').append('
    makedns updated
    '); + } + + // Set cookie for number of disks + var diskRows = $('#' + tabId + ' table:eq(0):visible tbody tr'); + $.cookie('disks2add' + out2Id, diskRows.length); + if (diskRows.length > 0) { + for (var i = 0; i < diskRows.length; i++) { + var diskArgs = diskRows.eq(i).find('td'); + var type = diskArgs.eq(1).find('select').val(); + var address = diskArgs.eq(2).find('input').val(); + var size = diskArgs.eq(3).find('input').val(); + var mode = diskArgs.eq(4).find('select').val(); + var pool = diskArgs.eq(5).find('select').val(); + var password = diskArgs.eq(6).find('input').val(); + + // Create ajax arguments + var args = ''; + if (type == '3390') { + args = '--add' + type + ';' + pool + ';' + address + + ';' + size + ';' + mode + ';' + password + ';' + + password + ';' + password; + } else if (type == '9336') { + args = '--add' + type + ';' + pool + ';' + address + ';' + + size + ';' + mode + ';' + password + ';' + + password + ';' + password; + } + + // Attach disk to node + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : args, + msg : 'cmd=chvm-disk;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + // Set cookie for number of zFCP devices + var zfcpRows = $('#' + tabId + ' table:eq(1):visible tbody tr'); + $.cookie('zfcp2add' + out2Id, zfcpRows.length); + if (zfcpRows.length > 0) { + for ( var i = 0; i < zfcpRows.length; i++) { + var diskArgs = zfcpRows.eq(i).find('td'); + var address = diskArgs.eq(1).find('input').val(); + var size = diskArgs.eq(2).find('input').val(); + var pool = diskArgs.eq(3).find('select').val(); + var tag = diskArgs.eq(4).find('input').val(); + var portName = diskArgs.eq(5).find('input').val(); + var unitNo = diskArgs.eq(6).find('input').val(); + + // This is either true or false + var loaddev = diskArgs.eq(7).find('input').attr('checked'); + if (loaddev) { + loaddev = "1"; + } else { + loaddev = "0"; + } + + // Create ajax arguments + var args = '--addzfcp;' + pool + ';' + address + ';' + loaddev + ';' + size; + if (tag && tag != "null") { + args += ';' + tag; + } if (portName && tag != "null") { + args += ';' + portName; + } if (unitNo && tag != "null") { + args += ';' + unitNo; + } + + // Attach zFCP device to node + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : args, + msg : 'cmd=chvm-zfcp;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + // Done if no disks to add + if (diskRows.length < 1 && zfcpRows.length < 1) { + $('#' + statBarId).find('div').append('
    No disks found to provison, finished.
    '); + $('#' + loaderId).hide(); + } + } + } + + /** + * (6) Set operating system for given node + */ + else if (lastCmd == 'chvm-disk' || lastCmd == 'chvm-zfcp') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // If there was an error, quit + if (containErrors(prg.html())) { + $('#' + loaderId).hide(); + } else { + // Set cookie for number of disks + // One less disk to add + var disks2add = $.cookie('disks2add' + out2Id); + if (lastCmd == 'chvm-disk') { + if (disks2add > 0) { + disks2add--; + $.cookie('disks2add' + out2Id, disks2add); + } + } + + var zfcp2add = $.cookie('zfcp2add' + out2Id); + if (lastCmd == 'chvm-zfcp') { + if (zfcp2add > 0) { + zfcp2add--; + $.cookie('zfcp2add' + out2Id, zfcp2add); + } + } + + // Only set operating system if there are no more disks to add + if (zfcp2add < 1 && disks2add < 1) { + // If an operating system image is given + var osImage = $('#' + tabId + ' select[name=os]:visible').val(); + if (osImage) { + // Get operating system, architecture, provision method, and profile + var tmp = osImage.split('-'); + var os = tmp[0]; + var arch = tmp[1]; + var profile = tmp[3]; + + // If the last disk is added + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeadd', + tgt : '', + args : node + ';noderes.netboot=zvm;nodetype.os=' + + os + ';nodetype.arch=' + arch + + ';nodetype.profile=' + profile, + msg : 'cmd=noderes;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } else { + $('#' + loaderId).hide(); + } + } + } + } + + /** + * (7) If sourceforge xCAT Update DHCP + */ + else if ((lastCmd == 'noderes') && (builtInXCAT == 0)) { + // If there was an error, do not continue + if (rsp.length) { + $('#' + loaderId).hide(); + $('#' + statBarId).find('div').append('
    (Error) Failed to set operating system
    '); + } else { + $('#' + statBarId).find('div').append('
    Operating system for ' + node + ' set
    '); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedhcp', + tgt : '', + args : '-a', + msg : 'cmd=makedhcp;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + /** + * (8) Prepare node for boot + */ + else if (((lastCmd == 'noderes') && (builtInXCAT == 1)) || + ((lastCmd == 'makedhcp') && (builtInXCAT == 0))) { + // If there was an error, do not continue + if (rsp.length) { + $('#' + loaderId).hide(); + if (builtInXCAT == 1) { + $('#' + statBarId).find('div').append('
    (Error) Failed to set operating system
    '); + } else { + $('#' + statBarId).find('div').append('
    (Error) Failed to make dhcp
    '); + } + } else { + if (builtInXCAT == 1) { + $('#' + statBarId).find('div').append('
    Operating system for ' + node + ' set
    '); + } else { + $('#' + statBarId).find('div').append('
    DHCP for ' + node + ' set
    '); + } + + // Prepare node for boot + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeset', + tgt : node, + args : 'install', + msg : 'cmd=nodeset;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + /** + * (9) Boot node to network + */ + else if (lastCmd == 'nodeset') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // If there was an error + // Do not continue + if (containErrors(prg.html())) { + $('#' + loaderId).hide(); + } else { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'rnetboot', + tgt : node, + args : 'ipl=000C', + msg : 'cmd=rnetboot;out=' + out2Id + }, + + success : updateZProvisionNewStatus + }); + } + } + + /** + * (10) Done + */ + else if (lastCmd == 'rnetboot') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + if (prg.html().indexOf('Error') < 0) { + $('#' + statBarId).find('div').append('
    Open a VNC viewer to see the installation progress.  It might take a couple of minutes before you can connect.
    '); + } + + // Hide loader + $('#' + loaderId).hide(); + } +} + +/** + * Update the provision existing node status + * + * @param data Data returned from HTTP request + */ +function updateZProvisionExistingStatus(data) { + // Get ajax response + var rsp = data.rsp; + var args = data.msg.split(';'); + + // Get command invoked + var cmd = args[0].replace('cmd=', ''); + // Get provision tab instance + var inst = args[1].replace('out=', ''); + if (typeof console == "object"){ + console.log("Entering updateZProvisionExistingStatus. Last command:<"+cmd+"> All args:<"+args+">"); + } + + // Get provision tab and status bar ID + var statBarId = 'zProvisionStatBar' + inst; + var tabId = 'zvmProvisionTab' + inst; + + /** + * (2) Prepare node for boot + */ + if (cmd == 'nodeadd') { + // Get operating system + var bootMethod = $('#' + tabId + ' select[name=bootMethod]').val(); + + // Get nodes that were checked + var dTableId = 'zNodesDatatable' + inst; + var tgts = getNodesChecked(dTableId); + + // Prepare node for boot + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeset', + tgt : tgts, + args : bootMethod, + msg : 'cmd=nodeset;out=' + inst + }, + + success : updateZProvisionExistingStatus + }); + } + + /** + * (3) Boot node from network + */ + else if (cmd == 'nodeset') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + + // If there was an error, do not continue + if (containErrors(prg.html())) { + var loaderId = 'zProvisionLoader' + inst; + $('#' + loaderId).remove(); + return; + } + + // Get nodes that were checked + var dTableId = 'zNodesDatatable' + inst; + var tgts = getNodesChecked(dTableId); + + // Boot node from network + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'rnetboot', + tgt : tgts, + args : 'ipl=000C', + msg : 'cmd=rnetboot;out=' + inst + }, + + success : updateZProvisionExistingStatus + }); + } + + /** + * (4) Done + */ + else if (cmd == 'rnetboot') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).find('div').append(prg); + if (prg.html().indexOf('Error') < 0) { + $('#' + statBarId).find('div').append('
    Open a VNC viewer to see the installation progress.  It might take a couple of minutes before you can connect.
    '); + } + + var loaderId = 'zProvisionLoader' + inst; + $('#' + loaderId).remove(); + } +} + +/** + * Update zVM node status + * + * @param data Data returned from HTTP request + */ +function updateZNodeStatus(data) { + var node = data.msg; + var rsp = data.rsp; + + // Get cookie for number processes performed against this node + var actions = $.cookie(node + 'processes'); + // One less process + actions = actions - 1; + $.cookie(node + 'processes', actions); + + if (actions < 1) { + // Hide loader when there are no more processes + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).hide(); + } + + var statBarId = node + 'StatusBar'; + + // Write ajax response to status bar + var prg = writeRsp(rsp, node + ': '); + $('#' + statBarId).find('div').append(prg); +} + +/** + * Update clone status + * + * @param data Data returned from HTTP request + */ +function updateZCloneStatus(data) { + // Get ajax response + var rsp = data.rsp; + var args = data.msg.split(';'); + var cmd = args[0].replace('cmd=', ''); + + // Get provision instance + var inst = args[1].replace('inst=', ''); + // Get output division ID + var out2Id = args[2].replace('out=', ''); + + /** + * (2) Update /etc/hosts + */ + if (cmd == 'nodeadd') { + var node = args[3].replace('node=', ''); + + // If there was an error, do not continue + if (rsp.length) { + $('#' + out2Id).find('img').hide(); + $('#' + out2Id).find('div').append('
    (Error) Failed to create node definition
    '); + } else { + $('#' + out2Id).find('div').append('
    Node definition created for ' + node + '
    '); + + // If last node definition was created + var tmp = inst.split('/'); + if (tmp[0] == tmp[1]) { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makehosts', + tgt : '', + args : '', + msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id + }, + + success : updateZCloneStatus + }); + } + } + } + + /** + * (3a) Update DNS if source forge xCAT then do makedns + */ + else if ((cmd == 'makehosts') && (builtInXCAT == 0)) { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + out2Id).find('div').append(prg); + + // If there was an error, do not continue + if (rsp.length) { + $('#' + out2Id).find('img').hide(); + $('#' + out2Id).find('div').append('
    (Error) Failed to update /etc/hosts
    '); + } else { + $('#' + out2Id).find('div').append('
    /etc/hosts updated
    '); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedns', + tgt : '', + args : '', + msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id + }, + + success : updateZCloneStatus + }); + } + } + + /** + * (3b) Update DNS for built in xCAT and clone + * Just clone for sourceforge xCAT + */ + else if (((cmd == 'makehosts') && (builtInXCAT == 1)) || + ((cmd == 'makedns') && (builtInXCAT == 0))) { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + out2Id).find('div').append(prg); + + // If there was an error, do not continue + if (rsp.length) { + $('#' + out2Id).find('img').hide(); + if (builtInXCAT == 1) { + $('#' + out2Id).find('div').append('
    (Error) Failed to update /etc/hosts
    '); + } else { + $('#' + out2Id).find('div').append('
    (Error) Failed to makedns
    '); + } + } + // Get clone tab + var tabId = out2Id.replace('CloneStatusBar', 'CloneTab'); + + // If a node range is given + var tgtNodeRange = $('#' + tabId + ' input[name=tgtNode]').val(); + var tgtNodes = ''; + if (tgtNodeRange.indexOf('-') > -1) { + var tmp = tgtNodeRange.split('-'); + + // Get node base name + var nodeBase = tmp[0].match(/[a-zA-Z]+/); + // Get the starting index + var nodeStart = parseInt(tmp[0].match(/\d+/)); + // Get the ending index + var nodeEnd = parseInt(tmp[1].match(/\d+/)); + for ( var i = nodeStart; i <= nodeEnd; i++) { + // Do not append comma for last node + if (i == nodeEnd) { + tgtNodes += nodeBase + i.toString(); + } else { + tgtNodes += nodeBase + i.toString() + ','; + } + } + } else { + tgtNodes = tgtNodeRange; + } + + // Get other inputs + var srcNode = $('#' + tabId + ' input[name=srcNode]').val(); + hcp = $('#' + tabId + ' input[name=newHcp]').val(); + var group = $('#' + tabId + ' input[name=newGroup]').val(); + var diskPool = $('#' + tabId + ' input[name=diskPool]').val(); + var diskPw = $('#' + tabId + ' input[name=diskPw]').val(); + if (!diskPw) { + diskPw = ''; + } + + // Clone + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'mkvm', + tgt : tgtNodes, + args : srcNode + ';pool=' + diskPool + ';pw=' + diskPw, + msg : 'cmd=mkvm;inst=' + inst + ';out=' + out2Id + }, + error: function(jqXHR, textStatus) { + $('#' + out2Id).find('div').append('
    (Error) Failed in clone call with ' + textStatus + '
    '); + }, + success : updateZCloneStatus + }); + } + + /** + * (5) Done + */ + else if (cmd == 'mkvm') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + out2Id).find('div').append(prg); + + // Hide loader + $('#' + out2Id).find('img').hide(); + } +} + +/** + * Get zVM resources + * + * @param data Data from HTTP request + */ +function getZResources(data) { + var tabId = 'zvmResourceTab'; + var info = createInfoBar('Manage storage and networks'); + $('#' + tabId).append(info); + + // Do not continue if there is no output + if (data.rsp.length) { + if (typeof console == "object"){ + console.log("Entering getZResources."); + } + // Push hardware control points into an array + var node, hcp; + var hcpHash = new Object(); + var hostnameHash = new Object(); + for (var i in data.rsp) { + node = data.rsp[i][0]; + hcp = data.rsp[i][1]; + // data will be coming in like "xcat xcat.endicott.ibm.com hosts.hostnames" + // or xcat zhcp.endicott.ibm.com zvm.hcp" + if (data.rsp[i][2]== "zvm.hcp") { + hcpHash[hcp] = 1; + } else { + if (hcp.length) { + hostnameHash[hcp] = node; + } + } + } + + // Create an array for hardware control points + var hcps = new Array(); + for (var key in hcpHash) { + // Get the short host name + //hcp = key.split('.')[0]; //old code + hcp = hostnameHash[key]; + if (typeof console == "object"){ + console.log("getZResources lookup for hostname "+key+" found nodename <"+hcp+">"); + } + if (jQuery.inArray(hcp, hcps) == -1) { + hcps.push(hcp); + } + } + + // Set hardware control point cookie + $.cookie('hcp', hcps); + + // Delete loader + $('#' + tabId).find('img[src="images/loader.gif"]').remove(); + + // Create accordion panel for disk + var resourcesAccordion = $('
    '); + var diskSection = $('
    '); + var diskLnk = $('

    Disks

    ').click(function () { + // Do not load panel again if it is already loaded + if ($('#zvmDiskResource').children().length) { + return; + } + else + $('#zvmDiskResource').append(createLoader('')); + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) { + hcps = $.cookie('hcp').split(','); + } else { + hcps.push($.cookie('hcp')); + } + + // Query the disk pools for each hcp + var panelId = 'zvmDiskResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + if (!info.length) { + info = createInfoBar("Querying "+hcps.length+" zhcp(s) for disk pools."); + $('#' + panelId).append(info); + } + zhcpQueryCountForDisks = hcps.length; + + for (var i in hcps) { + var itemcount = +i + 1; + info.append("
    Querying disk pools from: "+hcps[i]+" ("+itemcount+" of "+hcps.length+")"); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--diskpoolnames', + msg : hcps[i] + }, + + success : getDiskPool + }); + zhcpQueryCountForDisks--; + } + }); + + // Create accordion panel for zFCP devices + var zfcpSection = $('
    '); + var zfcpLnk = $('

    zFCP

    ').click(function () { + // Do not load panel again if it is already loaded + if ($('#zfcpResource').children().length) + return; + else + $('#zfcpResource').append(createLoader('')); + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) { + hcps = $.cookie('hcp').split(','); + } else { + hcps.push($.cookie('hcp')); + + } + + // Query the fcp pools for each hcp + var panelId = 'zfcpResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + if (!info.length) { + info = createInfoBar("Querying "+hcps.length+" zhcp(s) for fcp pools."); + $('#' + panelId).append(info); + } + zhcpQueryCountForZfcps = hcps.length; + for (var i in hcps) { + // Gather fcp pools from hardware control points + var itemcount = +i + 1; + info.append("
    Querying fcp pools from: "+hcps[i]+" ("+itemcount+" of "+hcps.length+")"); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--zfcppoolnames', + msg : hcps[i] + }, + + success : getZfcpPool + }); + zhcpQueryCountForZfcps--; + } + }); + + // Create accordion panel for network + var networkSection = $('
    '); + var networkLnk = $('

    Networks

    ').click(function () { + // Do not load panel again if it is already loaded + if ($('#zvmNetworkResource').children().length) { + return; + } else { + $('#zvmNetworkResource').append(createLoader('')); + } + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) { + hcps = $.cookie('hcp').split(','); + } else { + hcps.push($.cookie('hcp')); + + } + // Query the networks for each + var panelId = 'zvmNetworkResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + if (!info.length) { + info = createInfoBar("Querying "+hcps.length+" zhcp(s) for networks."); + $('#' + panelId).append(info); + } + zhcpQueryCountForNetworks = hcps.length; + for (var i in hcps) { + var itemcount = +i + 1; + info.append("
    Querying networks from: "+hcps[i]+" ("+itemcount+" of "+hcps.length+")"); + $('#zvmResourceAccordion').accordion('resize'); + // Gather networks from hardware control points + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--getnetworknames', + msg : hcps[i] + }, + + success : getNetwork + }); + zhcpQueryCountForNetworks--; + } + }); + + resourcesAccordion.append(diskLnk, diskSection, zfcpLnk, zfcpSection, networkLnk, networkSection); + + // Append accordion to tab + $('#' + tabId).append(resourcesAccordion); + resourcesAccordion.accordion(); + networkLnk.trigger('click'); + } +} + +/** + * Get node attributes from HTTP request data + * + * @param propNames Hash table of property names + * @param keys Property keys + * @param data Data from HTTP request + * @return Hash table of property values + */ +function getAttrs(keys, propNames, data) { + // Create hash table for property values + var attrs = new Object(); + + // Go through inventory and separate each property out + var curKey = null; // Current property key + var addLine; // Add a line to the current property? + for ( var i = 1; i < data.length; i++) { + addLine = true; + + // Loop through property keys + // Does this line contains one of the properties? + for ( var j = 0; j < keys.length; j++) { + // Find property name + if (data[i].indexOf(propNames[keys[j]]) > -1) { + attrs[keys[j]] = new Array(); + + // Get rid of property name in the line + data[i] = data[i].replace(propNames[keys[j]], ''); + // Trim the line + data[i] = jQuery.trim(data[i]); + + // Do not insert empty line + if (data[i].length > 0) { + attrs[keys[j]].push(data[i]); + } + + curKey = keys[j]; + addLine = false; // This line belongs to a property + } + } + + // Line does not contain a property + // Must belong to previous property + if (addLine && data[i].length > 1) { + data[i] = jQuery.trim(data[i]); + attrs[curKey].push(data[i]); + } + } + + return attrs; +} + +/** + * Create add processor dialog + * + * @param node Node to add processor to + */ +function openAddProcDialog(node) { + // Create form to add processor + var addProcForm = $('
    '); + // Create info bar + var info = createInfoBar('Add a temporary processor to this virtual server.'); + addProcForm.append(info); + addProcForm.append('
    '); + addProcForm.append('
    '); + + // Create drop down for processor type + var procType = $('
    '); + procType.append(''); + var typeSelect = $(''); + typeSelect.append('' + + '' + + '' + + '' + ); + procType.append(typeSelect); + addProcForm.append(procType); + + // Generate tooltips + addProcForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add processor + addProcForm.dialog({ + title:'Add processor', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var node = $(this).find('input[name=procNode]').val(); + var address = $(this).find('input[name=procAddress]').val(); + var type = $(this).find('select[name=procType]').val(); + + // If inputs are not complete, show warning message + if (!node || !address || !type) { + var warn = createWarnBar('Please provide a value for each missing field.'); + warn.prependTo($(this)); + } else { + // Add processor + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--addprocessoractive;' + address + ';' + type, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + var statusId = node + 'StatusBar'; + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).show(); + $('#' + statusId).show(); + + // Close dialog + $(this).dialog( "close" ); + } + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add disk dialog + * + * @param node Node to add disk to + * @param hcp Hardware control point of node + */ +function openAddDiskDialog(node, hcp) { + // Get list of disk pools + var cookie = $.cookie(hcp + 'diskpools'); + var pools = new Array(); + if (cookie) { + pools = cookie.split(','); + } + + // Create form to add disk + var addDiskForm = $('
    '); + // Create info bar + var info = createInfoBar('Add a ECKD|3390 or FBA|9336 disk to this virtual server.'); + addDiskForm.append(info); + addDiskForm.append('
    '); + addDiskForm.append('
    '); + addDiskForm.append('
    '); + addDiskForm.append('
    '); + + // Create drop down for disk pool + var diskPool = $('
    '); + diskPool.append(''); + var poolSelect = $(''); + for ( var i = 0; i < pools.length; i++) { + if( !pools[i] || 0 === pools[i].length) continue; + poolSelect.append(''); + } + diskPool.append(poolSelect); + addDiskForm.append(diskPool); + + // Create drop down for disk mode + var diskMode = $('
    '); + diskMode.append(''); + var modeSelect = $(''); + modeSelect.append('' + + '' + + '' + + '' + + '' + + '' + + '' + ); + diskMode.append(modeSelect); + addDiskForm.append(diskMode); + + addDiskForm.append('
    '); + + // Generate tooltips + addDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addDiskForm.dialog({ + title:'Add disk', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var node = $(this).find('input[name=diskNode]').val(); + var type = $(this).find('select[name=diskType]').val(); + var address = $(this).find('input[name=diskAddress]').val(); + var size = $(this).find('input[name=diskSize]').val(); + var pool = $(this).find('select[name=diskPool]').val(); + var mode = $(this).find('select[name=diskMode]').val(); + var password = $(this).find('input[name=diskPassword]').val(); + + // If inputs are not complete, show warning message + if (!node || !type || !address || !size || !pool || !mode) { + var warn = createWarnBar('Please provide a value for each missing field.'); + warn.prependTo($(this)); + } else { + // Add disk + if (type == '3390') { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--add3390;' + pool + ';' + address + ';' + size + + ';' + mode + ';' + password + ';' + password + ';' + password, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + var statusId = node + 'StatusBar'; + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).show(); + $('#' + statusId).show(); + } else if (type == '9336') { + // Default block size for FBA volumes = 512 + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--add9336;' + pool + ';' + address + ';' + size + + ';' + mode + ';' + password + ';' + password + ';' + password, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + var statusId = node + 'StatusBar'; + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).show(); + $('#' + statusId).show(); + } + + // Close dialog + $(this).dialog( "close" ); + } // End of else + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add zFCP device dialog + * + * @param node Node to add disk to + * @param hcp Hardware control point of node + * @param zvm The z/VM system of node + */ +function openAddZfcpDialog(node, hcp, zvm) { + // Get list of disk pools + var cookie = $.cookie(hcp + 'zfcppools'); + var pools = new Array(); + if (cookie) { + pools = cookie.split(','); + } + + // Create form to add disk + var addZfcpForm = $('
    '); + // Create info bar + var info = createInfoBar('Add a SCSI|FCP disk to this virtual server.'); + addZfcpForm.append(info); + addZfcpForm.append('
    '); + addZfcpForm.append('
    '); + addZfcpForm.append('
    '); + addZfcpForm.append('
    '); + + // Create drop down for disk pool + var diskPool = $('
    '); + diskPool.append(''); + var poolSelect = $(''); + for ( var i = 0; i < pools.length; i++) { + if( !pools[i] || 0 === pools[i].length) continue; + poolSelect.append(''); + } + diskPool.append(poolSelect); + addZfcpForm.append(diskPool); + + // Tag to identify where device will be used + addZfcpForm.append('
    '); + + // Create advanced link to set advanced zFCP properties + var advancedLnk = $('
    '); + addZfcpForm.append(advancedLnk); + var advanced = $('
    ').hide(); + addZfcpForm.append(advanced); + + var portName = $('
    '); + var unitNo = $('
    '); + advanced.append(portName, unitNo); + + // Toggle port name and unit number when clicking on advanced link + advancedLnk.click(function() { + advanced.toggle(); + }); + + // Generate tooltips + addZfcpForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addZfcpForm.dialog({ + title:'Add zFCP device', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var node = $(this).find('input[name=diskNode]').val(); + var address = $(this).find('input[name=diskAddress]').val(); + var loaddev = $(this).find('input[name=diskLoaddev]'); + var size = $(this).find('input[name=diskSize]').val(); + var pool = $(this).find('select[name=diskPool]').val(); + var tag = $(this).find('input[name=diskTag]').val(); + var portName = $(this).find('input[name=diskPortName]').val(); + var unitNo = $(this).find('input[name=diskUnitNo]').val(); + + // If inputs are not complete, show warning message + if (!node || !address || !size || !pool) { + var warn = createWarnBar('Please provide a value for each missing field.'); + warn.prependTo($(this)); + } else { + if (loaddev.attr('checked')) { + loaddev = 1; + } else { + loaddev = 0; + } + + var args = '--addzfcp||' + pool + '||' + address + '||' + loaddev + '||' + size; + + if (tag && tag != "null") { + args += '||' + tag; + } else { + args += '|| ""'; + } + + if ((portName && portName != "null") && (unitNo && unitNo != "null")) { + args += '||' + portName + '||' + unitNo; + } + + // Add zFCP device + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : args, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + var statusId = node + 'StatusBar'; + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).show(); + $('#' + statusId).show(); + + // Close dialog + $(this).dialog( "close" ); + } + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create dedicate device dialog + * + * @param node Node to dedicate device to + * @param hcp Hardware control point of node + */ +function openDedicateDeviceDialog(node, hcp) { + // Create form to add disk + var dedicateForm = $('
    '); + // Create info bar + var info = createInfoBar('Add a dedicated device to the configuration'); + dedicateForm.append(info); + + dedicateForm.append('
    '); + dedicateForm.append('
    '); + dedicateForm.append('
    '); + dedicateForm.append('
    '); + + // Generate tooltips + dedicateForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add dedicated device + dedicateForm.dialog({ + title:'Add dedicated device', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var node = $(this).find('input[name=diskNode]').val(); + var vAddress = $(this).find('input[name=virtualAddress]').val(); + var rAddress = $(this).find('input[name=realAddress]').val() + var mode = $(this).find('select[name=mode]').val(); + + // If inputs are not complete, show warning message + if (!node || !vAddress || !rAddress || !mode) { + var warn = createWarnBar('Please provide a value for each missing field.'); + warn.prependTo($(this)); + } else { + var args = '--dedicatedevice;' + vAddress + ';' + rAddress + ';' + mode; + + // Add zFCP device + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : args, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + var statusId = node + 'StatusBar'; + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).show(); + $('#' + statusId).show(); + + // Close dialog + $(this).dialog( "close" ); + } + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add ECKD to system dialog + * + * @param hcp Hardware control point of node + */ +function openAddEckd2SystemDialog(hcp) { + var dialogId = 'zvmAddEckd2System'; + + // Create form to add disk + var addE2SForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Create info bar + var info = createInfoBar('Dynamically add an ECKD disk to a running z/VM system.'); + addE2SForm.append(info); + + addE2SForm.append(system); + addE2SForm.append('
    '); + + // Generate tooltips + addE2SForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addE2SForm.dialog({ + title:'Add ECKD to system', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 420, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var devnum = $(this).find('input[name=devNum]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=devNum]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : "--addeckd;" + devnum, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add Volume to system dialog + * + * @param hcp Hardware control point of node + */ +function openAddVolume2SystemDialog(hcp) { + var dialogId = 'zvmAddVolume2System'; + + // Create form to add volume + var addV2SForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Create info bar + var info = createInfoBar('Permanently add a volume to the z/VM system configuration.'); + addV2SForm.append(info); + + addV2SForm.append(system); + addV2SForm.append('
    '); + addV2SForm.append('
    '); + + // Generate tooltips + addV2SForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add volume + addV2SForm.dialog({ + title:'Add volume to system configuration', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 480, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var devnum = $(this).find('input[name=devNum]').val(); + var volser = $(this).find('input[name=volser]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=devNum]', 'input[name=volser]' ); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : "--addvolume;" + devnum + ";" + volser, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create remove Volume to system dialog + * + * @param hcp Hardware control point of node + */ +function openRemoveVolumeFromSystemDialog(hcp) { + var dialogId = 'zvmRemoveVolumeFromSystem'; + + // Create form to remove volume + var remVfromSForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Create info bar + var info = createInfoBar('Permanently remove a volume from the z/VM system configuration.'); + remVfromSForm.append(info); + + remVfromSForm.append(system); + remVfromSForm.append('
    '); + remVfromSForm.append('
    '); + + // Generate tooltips + remVfromSForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to remove volume + remVfromSForm.dialog({ + title:'Remove volume from system configuration', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 580, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var devnum = $(this).find('input[name=devNum]').val(); + var volser = $(this).find('input[name=volser]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=devNum]', 'input[name=volser]' ); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : "--removevolume;" + devnum + ";" + volser, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add page or spool dialog + * + * @param hcp Hardware control point of node + */ +function openAddPageSpoolDialog(hcp) { + var dialogId = 'zvmAddPageSpool'; + + // Create form to add disk + var addPageSpoolForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Create info bar + var info = createInfoBar('Add a page or spool volume to be used by zVM.'); + addPageSpoolForm.append(info); + + var diskFS = $('
    Disk
    '); + addPageSpoolForm.append(diskFS); + var diskAttr = $('
    '); + diskFS.append($('
    ')); + diskFS.append(diskAttr); + + diskAttr.append(system); + diskAttr.append('
    '); + diskAttr.append('
    '); + diskAttr.append('
    '); + + // Generate tooltips + addPageSpoolForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addPageSpoolForm.dialog({ + title:'Add page or spool', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var volAddr = $(this).find('input[name=volAddr]').val(); + var volLabel = $(this).find('input[name=volLabel]').val(); + var volUse = $(this).find('select[name=volUse]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=volAddr]', 'input[name=volLabel]', 'select[name=volUse]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + var pageSpoolArgs = volAddr + ";" + volLabel + ";" + volUse; + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : system, + args : '--addpagespool;' + pageSpoolArgs, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Open dialog to share disk + * + * @param disks2share Disks selected in table + */ +function openShareDiskDialog(disks2share) { + // Create form to share disk + var dialogId = 'zvmShareDisk'; + var shareDiskForm = $('
    '); + + var args = disks2share.split(';'); + var tgtHcp = args[0]; + var tgtVol = args[1]; + + if (!tgtVol || tgtVol == "undefined") + tgtVol = ""; + + // Create info bar + var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.'); + shareDiskForm.append(info); + + // Set region input based on those selected on table (if any) + var node = $('
    '); + var volAddr = $('
    '); + var shareEnable = $('
    '); + shareDiskForm.append(node, volAddr, shareEnable); + + // Generate tooltips + shareDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to delete disk + shareDiskForm.dialog({ + title:'Share disk', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var node = $(this).find('input[name=node]').val(); + var volAddr = $(this).find('input[name=volAddr]').val(); + var shareEnable = $(this).find('select[name=shareEnable]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('input[name=node]', 'input[name=volAddr]', 'select[name=shareEnable]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + // Remove disk from pool + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : "--sharevolume;" + volAddr + ";" + shareEnable, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Create add SCSI 2 system dialog + * + * @param hcp Hardware control point of node + */ +function openAddScsi2SystemDialog(hcp) { + var dialogId = 'zvmAddScsi2System'; + + // Create form to add disk + var addS2SForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + // Create info bar + var info = createInfoBar('Dynamically add an SCSI disk to a running z/VM system as an EDEV.'); + addS2SForm.append(info); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + var devNo = $('
    '); + var devPathLabel = $(''); + var devPathCount = 1; + //var pathDiv = $('
    '); + + var devPathDiv = $('
    '); + var devPathTable = $('
    '); + var devPathHeader = $(' FCP Device WWPN LUN'); + // Adjust header width + devPathHeader.find('th').css({ + 'width' : '120px' + }); + devPathHeader.find('th').eq(0).css({ + 'width' : '20px' + }); + var devPathBody = $(''); + var devPathFooter = $(''); + + // Create a row + var devPathRow = $(''); + + // Add blank column (remove button replacement) + devPathRow.append(''); + + // Create FCP device number input + var fcpDevNum = $(''); + devPathRow.append(fcpDevNum); + + // Create FCP WWPN input + var fcpWwpn = $(''); + devPathRow.append(fcpWwpn); + + if ($.cookie('zvms')) { + zvms = $.cookie('zvms').split(','); + var zvm; + for (var i in zvms) { + if( !zvms[i] || 0 === zvms[i].length) continue; + var args = zvms[i].split(':'); + var zvm = args[0].toLowerCase(); + var iHcp = args[1]; + } + } + + // Create FCP LUN input + var fcpLun = $(''); + devPathRow.append(fcpLun); + + devPathBody.append(devPathRow); + + var addDevPathLink = $('+ Add path'); + addDevPathLink.bind('click', function(event){ + devPathCount = devPathCount + 1; + // Create a row + var devPathRow = $(''); + + // Add remove button + var removeBtn = $('').css({ + "float": "left", + "cursor": "pointer" + }); + var col = $('').append(removeBtn); + removeBtn.bind('click', function(event) { + $(this).parent().parent().remove(); + }); + devPathRow.append(col); + + // Create FCP device number input + var fcpDevNum = $(''); + devPathRow.append(fcpDevNum); + + // Create FCP WWPN input + var fcpWwpn = $(''); + devPathRow.append(fcpWwpn); + + // Create FCP LUN input + var fcpLun = $(''); + devPathRow.append(fcpLun); + + devPathBody.append(devPathRow); + + // Generate tooltips + addS2SForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + }); + devPathFooter.append(addDevPathLink); + devPathTable.append(devPathHeader); + devPathTable.append(devPathBody); + devPathTable.append(devPathFooter); + devPathDiv.append(devPathLabel); + devPathDiv.append(devPathTable); + + var option = $('
    '); + var persist = $('
    '); + addS2SForm.append(system, devNo, devPathDiv, option, persist); + + // Generate tooltips + addS2SForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + addS2SForm.find('div input[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.7, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + } + }); + + // Open dialog to add disk + addS2SForm.dialog({ + title:'Add SCSI to running system', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 675, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var devNo = $(this).find('input[name=devNo]').val(); + var pathArray = ""; + jQuery('.devPath').each(function(index) { + pathArray += $(this).find('input[name=fcpDevNum]').val() + ','; + pathArray += $(this).find('input[name=fcpWwpn]').val() + ','; + pathArray += $(this).find('input[name=fcpLun]').val() + ';'; + }); + var option = $(this).find('select[name=option]').val(); + var persist = $(this).find('select[name=persist]').val(); + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=fcpDevNum]', 'select[name=option]', 'select[name=persist]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + // Show warning message + if (!ready || !pathArray) { + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : "--addscsi||" + devNo + "||" + pathArray + "||" + option + "||" + persist, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Delete a real SCSI disk + * + * @param hcp Hardware control point of node + */ +function openRemoveScsiDialog(hcp) { + var dialogId = 'zvmRemoveScsiDialog'; + // Create form to add disk + var removeScsiForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Create info bar + var info = createInfoBar('Delete a real SCSI disk'); + removeScsiForm.append(info, system); + removeScsiForm.append('
    '); + removeScsiForm.append('
    '); + addNicForm.append('
    '); + + // Create drop down for NIC types + var nicType = $('
    '); + nicType.append(''); + var nicTypeSelect = $(''); + nicTypeSelect.append('' + + '' + + '' + ); + nicType.append(nicTypeSelect); + addNicForm.append(nicType); + + // Create drop down for network types + var networkType = $('
    '); + networkType.append(''); + var networkTypeSelect = $(''); + networkTypeSelect.append('' + + '' + + '' + ); + networkType.append(networkTypeSelect); + addNicForm.append(networkType); + var hashtable = getselectedNetworkHash(); + if (!hashtable) { + hashtable = [[]]; + setselectedNetworkHash(hashtable); + + if (typeof console == "object") { + console.log("openAddNicDialog. creating new hash[[]] table." ); + } + } + + // Create drop down for network names + var gLansQdioSelect = $(''); + var gLansHipersSelect = $(''); + var vswitchSelect = $(''); + for ( var i = 0; i < networks.length; i++) { + if( !networks[i] || 0 === networks[i].length) continue; + var network = networks[i].split(' '); + var networkOption = $(''); + if (network[0] == 'VSWITCH') { + vswitchSelect.append(networkOption); + + // Load and save specific vswitch details in global table if not there + network[2] = jQuery.trim(network[2]); // Remove new line x012 from end + if (typeof hashtable[node + '_NIC_' + network[2]] === 'undefined') { + if (typeof console == "object"){ + console.log("Calling getNetworkDetails for switch:<"+network[2]+">"); + } + ajaxrequest = 1; + getNetworkDetails(hcpNode, network[2], node + '_NIC_' + network[2], ''); + } + } else if (network[0] == 'LAN:QDIO') { + gLansQdioSelect.append(networkOption); + } else if (network[0] == 'LAN:HIPERS') { + gLansHipersSelect.append(networkOption); + } + } + + // Hide network name drop downs until the NIC type and network type is selected + // QDIO Guest LAN drop down + var guestLanQdio = $('
    ').hide(); + guestLanQdio.append(''); + guestLanQdio.append(gLansQdioSelect); + addNicForm.append(guestLanQdio); + + // HIPERS Guest LAN drop down + var guestLanHipers = $('
    ').hide(); + guestLanHipers.append(''); + guestLanHipers.append(gLansHipersSelect); + addNicForm.append(guestLanHipers); + + // VSWITCH drop down + var vswitch = $('
    ').hide(); + vswitch.append(''); + vswitch.append(vswitchSelect); + + // VLAN id with Porttype + var vswitchvlan = $('
    '); + vswitchvlan.append('
    '); + var vswitchPorttype = $(''); + vswitchvlan.append(vswitchPorttype); + vswitchvlan.append('
    '); + var vswitchVLANId = $(''); + vswitchvlan.append(vswitchVLANId); + + vswitch.append(vswitchvlan); + vswitchvlan.hide(); + addNicForm.append(vswitch); + + // Show network names on change + networkTypeSelect.change(function(){ + // Remove any warning messages + $(this).parent().parent().find('.ui-state-error').remove(); + var networkType = $(this).val(); + + if (typeof console == "object"){ + console.log("Entering networkTypeSelect.change"); + } + // Get NIC type and network type + var nicType = $(this).parent().parent().find('select[name=nicType]').val(); + var networkType = $(this).val(); + + // Hide network name drop downs + var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); + var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); + var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); + var mynode = $(this).parent().parent().find('input[name=nicNode]').val(); + var showvlan = $(this).parent().parent().find('select[name=vswitchVLANporttype]').parent(); + var hashtable = getselectedNetworkHash(); + guestLanQdio.hide(); + guestLanHipers.hide(); + vswitch.hide(); + + // Show correct network name + if (networkType == 'Guest LAN' && nicType == 'QDIO') { + guestLanQdio.show(); + } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { + guestLanHipers.show(); + } else if (networkType == 'Virtual Switch') { + if (nicType == 'QDIO') { + vswitch.show(); + // Show vlan information only if vlan aware + var switchname = $(this).parent().parent().find('select[name=nicVSwitchName]').val(); + var tokens = switchname.split(' '); + var switchkeyid = mynode + '_NIC_' + jQuery.trim(tokens[1]); + if (typeof console == "object"){ + console.log("Checking vswitch index:"+switchkeyid); + } + + // Is this a vlanaware switch, if so show the special fields + if (hashtable[switchkeyid]["vlan_awareness"] == "AWARE") { + showvlan.find('input[name=vswitchvlanid]').val(hashtable[switchkeyid]["vlan_id"]); + showvlan.find('select[name=vswitchVLANporttype]').val(hashtable[switchkeyid]["port_type"]); + showvlan.show(); + } else { + showvlan.hide(); + showvlan.find('input[name=vswitchvlanid]').val('default'); + showvlan.find('select[name=vswitchVLANporttype]').val('default'); + } + } else { + // No such thing as HIPERS VSWITCH + var warn = createWarnBar('The selected choices are not valid.'); + warn.prependTo($(this).parent().parent()); + } + } + }); + + // + // Show network names on change + // + nicTypeSelect.change(function(){ + // Remove any warning messages + $(this).parent().parent().find('.ui-state-error').remove(); + + if (typeof console == "object"){ + console.log("Entering nicTypeSelect.change"); + } + + // Get NIC type and network type + var nicType = $(this).val(); + var networkType = $(this).parent().parent().find('select[name=nicNetworkType]').val(); + var mynode = $(this).parent().parent().find('input[name=nicNode]').val(); + + // Hide network name drop downs + var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent(); + var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent(); + var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent(); + var showvlan = $(this).parent().parent().find('select[name=vswitchVLANporttype]').parent(); + var hashtable = getselectedNetworkHash(); + guestLanQdio.hide(); + guestLanHipers.hide(); + vswitch.hide(); + + // Show correct network name + if (networkType == 'Guest LAN' && nicType == 'QDIO') { + guestLanQdio.show(); + } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') { + guestLanHipers.show(); + } else if (networkType == 'Virtual Switch') { + if (nicType == 'QDIO') { + vswitch.show(); + var switchname = $(this).parent().parent().find('select[name=nicVSwitchName]').val(); + var tokens = switchname.split(' '); + var switchkeyid = mynode + '_NIC_' + jQuery.trim(tokens[1]); + + if (typeof console == "object"){ + console.log("Entering nictypeselect.change. switchkey:<"+switchkeyid); + } + + // Is this a vlanaware switch, if so show the special fields + if (hashtable[switchkeyid]["vlan_awareness"] == "AWARE") { + showvlan.find('input[name=vswitchvlanid]').val(hashtable[switchkeyid]["vlan_id"]); + showvlan.find('select[name=vswitchVLANporttype]').val(hashtable[switchkeyid]["port_type"]); + showvlan.show(); + } else { + showvlan.hide(); + showvlan.find('input[name=vswitchvlanid]').val('default'); + showvlan.find('select[name=vswitchVLANporttype]').val('default'); + } + + } else { + // No such thing as HIPERS VSWITCH + var warn = createWarnBar('The selected choices are not valid.'); + warn.prependTo($(this).parent().parent()); + } + } + }); + + // + // Determine if vlanid fields need to be shown based on vswitch + // + vswitchSelect.change(function(){ + // Remove any warning messages + $(this).parent().parent().find('.ui-state-error').remove(); + + // Get vlan id division + var showvlan = $(this).parent().parent().find('select[name=vswitchVLANporttype]').parent(); + + // Get selected switch name and break it into tokens + var switchname = $(this).val(); + var tokens = switchname.split(' '); + + // Get the node we are doing this for and index for hash table + var mynode = $(this).parent().parent().find('input[name=nicNode]').val(); + + var tokens = switchname.split(' '); + var switchkeyid = mynode + '_NIC_' + jQuery.trim(tokens[1]); + var hashtable = getselectedNetworkHash(); + + if (typeof console == "object"){ + console.log("Entering vswitchselect.change. switchkey:<"+switchkeyid+">"); + } + // Is this a vlanaware switch, if so show the special fields + if (hashtable[switchkeyid]["vlan_awareness"] == "AWARE") { + $(this).find('').val(hashtable[switchkeyid]["vlan_id"]); + showvlan.find('input[name=vswitchvlanid]').val(hashtable[switchkeyid]["vlan_id"]); + showvlan.find('select[name=vswitchVLANporttype]').val(hashtable[switchkeyid]["port_type"]); + showvlan.show(); + } else { + showvlan.hide(); + showvlan.find('input[name=vswitchvlanid]').val('default'); + showvlan.find('select[name=vswitchVLANporttype]').val('default'); + } + }); + + + // Generate tooltips + addNicForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + + // Open dialog to add NIC + addNicForm.dialog({ + title:'Add NIC', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var ready = true; + var errMsg = ''; + + // Get inputs + var node = $(this).find('input[name=nicNode]').val(); + var nicType = $(this).find('select[name=nicType]').val(); + var networkType = $(this).find('select[name=nicNetworkType]').val(); + var address = $(this).find('input[name=nicAddress]').val(); + + // If inputs are not complete, show warning message + if (!node || !nicType || !networkType || !address) { + errMsg = 'Please provide a value for each missing field.
    '; + ready = false; + } + + // If a HIPERS VSWITCH is selected, show warning message + if (nicType == 'HiperSockets' && networkType == 'Virtual Switch') { + errMsg += 'The selected choices are not valid.'; + ready = false; + } + + // If there are errors + if (!ready) { + // Show warning message + var warn = createWarnBar(errMsg); + warn.prependTo($(this)); + } else { + // Add guest LAN + if (networkType == 'Guest LAN') { + var temp; + if (nicType == 'QDIO') { + temp = $(this).find('select[name=nicLanQdioName]').val().split(' '); + } else { + temp = $(this).find('select[name=nicLanHipersName]').val().split(' '); + } + + var lanOwner = temp[0]; + var lanName = temp[1]; + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--addnic;' + address + ';' + nicType + ';3', + msg : 'node=' + node + ';addr=' + address + ';lan=' + + lanName + ';owner=' + lanOwner + }, + success : connect2GuestLan + }); + } + + // Add virtual switch + else if (networkType == 'Virtual Switch' && nicType == 'QDIO') { + var temp = $(this).find('select[name=nicVSwitchName]').val().split(' '); + var vswitchName = jQuery.trim(temp[1]); + var switchkeyid = node + '_NIC_' + vswitchName; + var hashtable = getselectedNetworkHash(); + var awareornot = hashtable[switchkeyid]["vlan_awareness"]; + var porttype = $(this).find('select[name=vswitchVLANporttype]').val(); + var lanid = $(this).find('input[name=vswitchvlanid]').val(); + + // Pass additional lanid data in msg for grant use by connect2VSwitch + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--addnic;' + address + ';' + nicType + ';3', + msg : 'node=' + node + ';addr=' + address + ';vsw=' + + vswitchName + ';vlanaware=' + awareornot + ';porttype=' + + porttype + ';lanid=' + lanid + }, + + success : connect2VSwitch + }); + } + + // Increment node process + incrementNodeProcess(node); + + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); + + // Close dialog + $(this).dialog( "close" ); + } // End of else + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); + // Make sure ajax is done before putting up dialog + $(document).ajaxStop(function() { + //Remove loading vswitch gif status bar + statBar.hide(); + }); + if (ajaxrequest == 0) { + //Remove loading vswitch gif status bar + statBar.hide(); + } + +} + +/** + * Create add vSwitch/VLAN dialog + * + * @param hcp Hardware control point of node + */ +function openAddVswitchVlanDialog(hcp) { + var dialogId = 'zvmAddVswitchVlan'; + + // Create form to add disk + var addVswitchForm = $('
    '); + + // Create info bar + var info = createInfoBar('Create a virtual switch or virtual network LAN.'); + + var netFS = $('
    '); + var netLegend = $('Network'); + netFS.append(netLegend); + + var typeFS = $('
    ').hide(); + var typeLegend = $('Network'); + typeFS.append(typeLegend); + addVswitchForm.append(info, netFS, typeFS); + + var netAttr = $('
    '); + netFS.append($('
    ')); + netFS.append(netAttr); + + var networkTypeDiv = $('
    '); + var networkType = $('
    '); + networkTypeDiv.append(networkType) + netAttr.append(networkTypeDiv); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + netAttr.append(system); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + var typeAttr = $('
    '); + typeFS.append($('
    ')); + typeFS.append(typeAttr); + + // Create vSwitch parameters + var vswitchOptions = $('
    ').hide(); + vswitchOptions.append($('
    ')); + vswitchOptions.append($('
    ')); + vswitchOptions.append($('
    ')); + + // Create an advanced link to configure optional network settings + var advancedLnk = $('
    '); + vswitchOptions.append(advancedLnk); + var advanced = $('
    ').hide(); + vswitchOptions.append(advanced); + + // Show IP address and hostname inputs on-click + advancedLnk.click(function() { + advanced.toggle(); + }); + + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + advanced.append($('
    ')); + + // Create VLAN parameters + var vlanOptions = $('
    ').hide(); + vlanOptions.append($('
    ')); + vlanOptions.append($('
    ')); + vlanOptions.append($('
    ')); + vlanOptions.append($('
    ')); + + typeAttr.append(vswitchOptions, vlanOptions); + + networkType.change(function() { + typeFS.show(); + if ($(this).val() == "vswitch") { + typeFS.find("legend").text("vSwitch"); + vswitchOptions.show(); + vlanOptions.hide(); + } else if ($(this).val() == "vlan") { + typeFS.find("legend").text("VLAN"); + vswitchOptions.hide(); + vlanOptions.show(); + } else { + typeFS.find("legend").text(""); + vswitchOptions.hide(); + vlanOptions.hide(); + typeFS.hide(); + } + }); + + // Generate tooltips + addVswitchForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add vSwitch or VLAN + addVswitchForm.dialog({ + title:'Add vSwitch or VLAN', + modal: true, + close: function() { + $(this).remove(); + }, + width: 750, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var networkType = $(this).find('select[name=networkType]').val(); + if (networkType == "vswitch") { + var networkArgs = "--addvswitch;"; + var system = $(this).find('select[name=system]').val(); + var switchName = $(this).find('input[name=switchName]').val(); + var deviceAddress = $(this).find('input[name=deviceAddress]').val(); + var portName = switchName; + var controllerName = $(this).find('input[name=controllerName]').val(); + var connection = $(this).find('select[name=connection]').val(); + var queueMemoryLimit = $(this).find('input[name=queueMemoryLimit]').val(); + var routingValue = $(this).find('select[name=routingValue]').val(); + var transportType = $(this).find('select[name=transportType]').val(); + var vlanId = $(this).find('input[name=vlanId]').val(); + var portType = $(this).find('select[name=vswitchVLANporttype]').val(); + var updateSysConfig = $(this).find('select[name=updateSysConfig]').val(); + var gvrp = $(this).find('select[name=gvrp]').val(); + var nativeVlanId = $(this).find('input[name=nativeVlanId]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=switchName]', 'input[name=deviceAddress]', 'input[name=controllerName]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + // Show warning message + if (!ready) { + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + if (switchName) + networkArgs += switchName + ";"; + if (deviceAddress) + networkArgs += deviceAddress + ";"; + if (portName) + networkArgs += portName + ";"; + if (controllerName) + networkArgs += controllerName + ";"; + + // Optional parameters + if (connection) + networkArgs += connection + ";"; + if (queueMemoryLimit) + networkArgs += queueMemoryLimit + ";"; + if (routingValue) + networkArgs += routingValue + ";"; + if (transportType) + networkArgs += transportType + ";"; + if (vlanId) + networkArgs += vlanId + ";"; + if (portType) + networkArgs += portType + ";"; + if (updateSysConfig) + networkArgs += updateSysConfig + ";"; + if (gvrp) + networkArgs += gvrp + ";"; + if (nativeVlanId) + networkArgs += nativeVlanId + ";"; + networkArgs = networkArgs.substring(0, networkArgs.length - 1); + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : networkArgs, + msg : dialogId + }, + + success : updateResourceDialog + }); + } else if (networkType == "vlan") { + var networkArgs = "--addvlan;"; + var system = $(this).find('select[name=system]').val(); + var vlanName = $(this).find('input[name=vlanName]').val(); + var vlanOwner = $(this).find('input[name=vlanOwner]').val(); + var vlanType = $(this).find('select[name=vlanType]').val(); + var vlanTransport = $(this).find('select[name=vlanTransport]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=vlanName]', 'input[name=vlanOwner]', 'select[name=vlanType]', 'select[name=vlanTransport]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + // Show warning message + if (!ready) { + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Ethernet Hipersockets are not supported + if (vlanTransport == "2") { + var warn = createWarnBar('Ethernet Hipersockets are not supported'); + warn.prependTo($(this)); + return; + } + + networkArgs += vlanName + ";"; + networkArgs += vlanOwner + ";"; + networkArgs += vlanType + ";"; + networkArgs += vlanTransport; + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : networkArgs, + msg : dialogId + }, + + success : updateResourceDialog + }); + } // End of else if + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Open dialog to delete network + * + * @param node type name for removing network + */ +function openRemoveVswitchVlanDialog(networkList) { + var names = ''; + for (var i in networkList) { + var networkArgs = networkList[i].split(';'); + networkArgs[2] = jQuery.trim(networkArgs[2]); + names += networkArgs[2] + ', '; + } + names = names.substring(0, names.length - 2); // Delete last two characters + + var confirmDialog = $('

    Are you sure you want to remove ' + names + '?

    '); + confirmDialog.dialog({ + title: "Confirm", + modal: true, + width: 400, + buttons: { + "Ok": function() { + for (var i in networkList) { + var networkArgs = networkList[i].split(';'); + var node = networkArgs[0]; + var type = networkArgs[1]; + var name = jQuery.trim(networkArgs[2]); + var owner = networkArgs[3]; + + if (type.indexOf("VSWITCH") != -1) { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : node, + args : '--removevswitch;' + name, + msg : '' + }, + + success: function(data) { + var infoMsg; + + // Create info message + if (jQuery.isArray(data.rsp)) { + infoMsg = ''; + for (var i in data.rsp) { + infoMsg += data.rsp[i] + '
    '; + } + } else { + infoMsg = data.rsp; + } + + openDialog("info", infoMsg); + } + }); + } else if (type.indexOf("LAN") != -1) { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : node, + args : '--removevlan;' + name + ';' + owner, + msg : '' + }, + + success: function(data) { + var infoMsg; + + // Create info message + if (jQuery.isArray(data.rsp)) { + infoMsg = ''; + for (var i in data.rsp) { + infoMsg += data.rsp[i] + '
    '; + } + } else { + infoMsg = data.rsp; + } + + openDialog("info", infoMsg); + } + }); + } + } + $(this).dialog("close"); + }, + "Cancel": function() { + $(this).dialog("close"); + } + } + }); +} + +/** + * Remove processor + * + * @param node Node where processor is attached + * @param address Virtual address of processor + */ +function removeProcessor(node, address) { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--removeprocessor;' + address, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); +} + +/** + * Remove disk + * + * @param node Node where disk is attached + * @param address Virtual address of disk + */ +function removeDisk(node, address) { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--removedisk;' + address, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); +} + +/** + * Remove zFCP device + * + * @param node Node where disk is attached + * @param address Virtual address of zFCP device + * @param wwpn World wide port name of zFCP device + * @param lun Logical unit number of zFCP device + */ +function removeZfcp(node, address, wwpn, lun) { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--removezfcp||' + address + '||' + wwpn + '||' + lun, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); +} + +/** + * Remove NIC + * + * @param node Node where NIC is attached + * @param address Virtual address of NIC + */ +function removeNic(node, nic) { + var args = nic.split('.'); + var address = args[0]; + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--removenic;' + address, + msg : node + }, + + success : updateZNodeStatus + }); + + // Increment node process + incrementNodeProcess(node); + + // Show loader + $('#' + node + 'StatusBarLoader').show(); + $('#' + node + 'StatusBar').show(); +} + +/** + * Set a cookie for the network names of a given node + * + * @param data Data from HTTP request + */ +function setNetworkCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var node = data.msg; + var networks = data.rsp[0].split(node + ': '); + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie(node + 'networks', networks, { expires: exDate }); + } +} + +/** + * Get contents of each disk pool + * + * @param data HTTP request data + */ +function getDiskPool(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1 && data.rsp[0].indexOf("Invalid") == -1) { + var hcp = data.msg; + var pools = data.rsp[0].split(hcp + ': '); + + // Get contents of each disk pool + for (var i in pools) { + if (pools[i]) { + pools[i] = jQuery.trim(pools[i]); + + // Get used space + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcp, + args : '--diskpool;' + pools[i] + ';used', + msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=used' + }, + + success : loadDiskPoolTable + }); + + // Get free space + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcp, + args : '--diskpool;' + pools[i] + ';free', + msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=free' + }, + + success : loadDiskPoolTable + }); + } // End of if + } // End of for + } else { + // Display any errors in info bar + if (data.rsp.length) { + var panelId = 'zvmDiskResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar, create info bar + if (!info.length) { + info = createInfoBar("Error: "+data.rsp[0]); + $('#' + panelId).append(info); + } else { + info.append("
    Error: "+data.rsp[0]); + } + } + // Load empty table + loadDiskPoolTable(""); // Must pass something + } +} + +/** + * Get contents of each zFCP pool + * + * @param data HTTP request data + */ +function getZfcpPool(data) { + if (typeof console == "object"){ + console.log("Entering getZfcpPool."); + } + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1 && data.rsp[0].indexOf("Invalid") == -1) { + var hcp = data.msg; + var pools = data.rsp[0].split(hcp + ': '); + // Get contents of each disk pool + for (var i in pools) { + pools[i] = jQuery.trim(pools[i]); + if (pools[i]) { + + // Query used and free space + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcp, + args : '--zfcppool;' + pools[i] + ';all', + msg : 'hcp=' + hcp + ';pool=' + pools[i] + }, + success : loadZfcpPoolTable + }); + } // End of if + } // End of for + } else { + // Display any errors in info bar + if (data.rsp.length) { + var panelId = 'zfcpResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar, create info bar + if (!info.length) { + info = createInfoBar("Error: "+data.rsp[0]); + $('#' + panelId).append(info); + } else { + info.append("
    Error: "+data.rsp[0]); + } + } + // Load empty table + loadZfcpPoolTable(""); // Must pass something + } +} + +/** + * Get details of each network + * + * @param data HTTP request data + */ +function getNetwork(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1 && data.rsp[0].indexOf("Invalid") == -1) { + var hcp = data.msg; + var networks = data.rsp[0].split(hcp + ': '); + if (typeof console == "object"){ + console.log("Entering getNetwork data:<"+networks+">"); + } + + // Loop through each network + for ( var i = 1; i < networks.length; i++) { + if( !networks[i] || 0 === networks[i].length) continue; + var args = networks[i].split(' '); + var type = args[0]; + var name = args[2]; + name = name.replace(/\n/g,''); + + // Get network details + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcp, + args : '--getnetwork;' + name + ';' + type, + msg : 'hcp=' + hcp + ';type=' + type + ';network=' + name + }, + + success : loadNetworkTable + }); + } // End of for + } // End of if + else { + if (data.rsp.length) { + var panelId = 'zvmNetworkResource'; + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar, create info bar + if (!info.length) { + info = createInfoBar("Error: "+data.rsp[0]); + $('#' + panelId).append(info); + } else { + info.append("
    Error: "+data.rsp[0]); + } + } + // Normally load empty table, but not for networks + } +} + +/** + * Load disk pool contents into a table + * + * @param data HTTP request data + */ +function loadDiskPoolTable(data) { + // Remove loader if all hcps queried + var panelId = 'zvmDiskResource'; + if (!zhcpQueryCountForDisks) { + $('#' + panelId).find('img[src="images/loader.gif"]').remove(); + } + + var hcp2zvm = new Object(); + var args, hcp, pool, stat, tmp; + if (data && typeof data.rsp != "undefined") { + // Do not continue if the call failed + if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { + return; + } + + // Obtain mapping for zHCP to zVM system + hcp2zvm = getHcpZvmHash(); + + args = data.msg.split(';'); + hcp = args[0].replace('hcp=', ''); + pool = args[1].replace('pool=', ''); + stat = jQuery.trim(args[2].replace('stat=', '')); + tmp = data.rsp[0].split(hcp + ': '); + } else { + // Provide empty values so the table will be generated + hcp = ''; + pool = ''; + stat = ''; + tmp = new Array(); + } + + // Resource tab ID + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar + if (!info.length) { + // Create info bar + info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.'); + $('#' + panelId).append(info); + } + + // Get datatable + var tableId = 'zDiskDataTable'; + var dTable = getDiskDataTable(); + if (!dTable) { + // Create a datatable + var table = new DataTable(tableId); + // Resource headers: volume ID, device type, start address, and size + table.init( [ '', 'z/VM', 'Pool', 'Status', 'Volume', 'Device type', 'Starting address', 'Size' ]); + + // Append datatable to panel + $('#' + panelId).append(table.object()); + + // Turn into datatable + dTable = $('#' + tableId).dataTable({ + 'iDisplayLength': 50, + "bScrollCollapse": true, + "sScrollY": "400px", + "sScrollX": "110%", + "bAutoWidth": true, + "oLanguage": { + "oPaginate": { + "sNext": "", + "sPrevious": "" + } + } + }); + setDiskDataTable(dTable); + } + + // Skip index 0 and 1 because it contains nothing + for (var i = 2; i < tmp.length; i++) { + tmp[i] = jQuery.trim(tmp[i]); + var diskAttrs = tmp[i].split(' '); + var key = hcp2zvm[hcp] + "-" + pool + "-" + diskAttrs[0]; + var type = diskAttrs[1]; + + // Calculate disk size + var size; + if (type.indexOf('3390') != -1) { + size = convertCylinders2Gb(parseInt(diskAttrs[3])); + } else if (type.indexOf('9336') != -1) { + size = convertBlocks2Gb(parseInt(diskAttrs[3])) + } else { + size = 0; + } + dTable.fnAddData( [ '', hcp2zvm[hcp], pool, stat, diskAttrs[0], type, diskAttrs[2], diskAttrs[3] + " (" + size + "G)" ]); + } + + // Create actions menu + if (!$('#zvmDiskResourceActions').length) { + // Empty filter area + $('#' + tableId + '_length').empty(); + + // Add disk to pool + var addLnk = $('Add'); + addLnk.bind('click', function(event){ + openAddDisk2PoolDialog(); + }); + + // Delete disk from pool + var removeLnk = $('Remove'); + removeLnk.bind('click', function(event){ + var disks = getNodesChecked(tableId); + openRemoveDiskFromPoolDialog(disks); + }); + + // Refresh table + var refreshLnk = $('Refresh'); + refreshLnk.bind('click', function(event){ + $('#zvmDiskResource').empty().append(createLoader('')); + setDiskDataTable(''); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) + hcps = $.cookie('hcp').split(','); + else + hcps.push($.cookie('hcp')); + + zhcpQueryCountForDisks = hcps.length; + // Query the disk pools for each + for (var i in hcps) { + if( !hcps[i] || 0 === hcps[i].length) continue; + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--diskpoolnames', + msg : hcps[i] + }, + + success : getDiskPool + }); + zhcpQueryCountForDisks--; + } + }); + + // Add ECKD to system + var addEckdLnk = $('Add ECKD'); + addEckdLnk.bind('click', function(event){ + openAddEckd2SystemDialog(hcp); + }); + + // Add Page or Spool + var addPageSpoolLnk = $('Add page/spool') + addPageSpoolLnk.bind('click', function(event){ + openAddPageSpoolDialog(hcp); + }); + + // Add EDEV to system + var addEdevLnk = $('Add EDEV'); + addEdevLnk.bind('click', function(event){ + openAddScsi2SystemDialog(hcp); + }); + + // Remove EDEV + var removeEdevLnk = $('Remove EDEV'); + removeEdevLnk.bind('click', function(event){ + openRemoveScsiDialog(hcp); + }); + + // Indicate disk is to be shared with various users + var shareLnk = $('Share disk'); + shareLnk.bind('click', function(event){ + var disks = getNodesChecked(tableId); + openShareDiskDialog(disks); + }); + + // Add Volume to system + var addVolumeLnk = $('Add volume to system'); + addVolumeLnk.bind('click', function(event){ + openAddVolume2SystemDialog(hcp); + }); + + // Remove Volume from system + var removeVolumeLnk = $('Remove volume from system'); + removeVolumeLnk.bind('click', function(event){ + openRemoveVolumeFromSystemDialog(hcp); + }); + + // Advanced menu + var advancedLnk = 'Advanced'; + var advancedMenu = createMenu([addEckdLnk, addPageSpoolLnk, addEdevLnk, removeEdevLnk, addVolumeLnk, removeVolumeLnk, shareLnk]); + + // Create action bar + var actionBar = $('
    ').css("width", "450px"); + + // Create an action menu + var actionsMenu = createMenu([refreshLnk, addLnk, removeLnk, [advancedLnk, advancedMenu]]); + actionsMenu.superfish(); + actionsMenu.css('display', 'inline-block'); + actionBar.append(actionsMenu); + + // Set correct theme for action menu + actionsMenu.find('li').hover(function() { + setMenu2Theme($(this)); + }, function() { + setMenu2Normal($(this)); + }); + + // Create a division to hold actions menu + var menuDiv = $(''); + $('#' + tableId + '_length').prepend(menuDiv); + $('#' + tableId + '_length').css({ + 'padding': '0px', + 'width': '500px' + }); + $('#' + tableId + '_filter').css('padding', '10px'); + menuDiv.append(actionBar); + } + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); +} + +/** + * Load zFCP pool contents into a table + * + * @param data HTTP request data + */ +function loadZfcpPoolTable(data) { + if (typeof console == "object"){ + console.log("Entering loadZfcpPoolTable."); + } + // Delete loader if last one + var panelId = 'zfcpResource'; + if (!zhcpQueryCountForZfcps) { + $('#' + panelId).find('img[src="images/loader.gif"]').remove(); + } + + var hcp2zvm = new Object(); + var args, hcp, pool, tmp; + if (typeof data.rsp != "undefined") { + // Do not continue if the call failed + if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) { + return; + } + + // Obtain mapping for zHCP to zVM system + hcp2zvm = getHcpZvmHash(); + + args = data.msg.split(';'); + hcp = args[0].replace('hcp=', ''); + pool = args[1].replace('pool=', ''); + tmp = data.rsp[0].split(hcp + ': '); + } else { + // Provide empty values so the table will be generated + hcp = ''; + pool = '' + tmp = new Array(); + } + + // Resource tab ID + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar, create info bar + if (!info.length) { + info = createInfoBar('Below are devices that are defined internally in the zFCP pools.'); + $('#' + panelId).append(info); + } + + // Get datatable + var tableId = 'zFcpDataTable'; + var dTable = getZfcpDataTable(); + if (!dTable) { + // Create a datatable + var table = new DataTable(tableId); + // Resource headers: status, WWPN, LUN, size, owner, channel, tag + table.init( [ '', 'z/VM', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]); + + // Append datatable to panel + $('#' + panelId).append(table.object()); + + // Turn into datatable + dTable = $('#' + tableId).dataTable({ + 'iDisplayLength': 50, + "bScrollCollapse": true, + "sScrollY": "400px", + "sScrollX": "110%", + "bAutoWidth": true, + "oLanguage": { + "oPaginate": { + "sNext": "", + "sPrevious": "" + } + } + }); + setZfcpDataTable(dTable); + } + if ((typeof data.rsp != "undefined") && (data.rsp.length > 0)) { + // Skip index 0 and 1 because it contains nothing + var key = ""; + for (var i = 2; i < tmp.length; i++) { + tmp[i] = jQuery.trim(tmp[i]); + var diskAttrs = tmp[i].split(','); + diskAttrs[0] = diskAttrs[0].toLowerCase(); + var key = hcp2zvm[hcp] + '-' + pool + '-' + diskAttrs[2]; + dTable.fnAddData( [ '', hcp2zvm[hcp], pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]); + } + } + // Create actions menu + if (!$('#zFcpResourceActions').length) { + // Empty filter area + $('#' + tableId + '_length').empty(); + + // Add disk to pool + var addLnk = $('Add'); + addLnk.bind('click', function(event){ + openAddZfcp2PoolDialog(); + }); + + // Delete disk from pool + var removeLnk = $('Remove'); + removeLnk.bind('click', function(event){ + var disks = getNodesChecked(tableId); + openRemoveZfcpFromPoolDialog(disks); + }); + + // Refresh table + var refreshLnk = $('Refresh'); + refreshLnk.bind('click', function(event){ + $('#zfcpResource').empty().append(createLoader('')); + setZfcpDataTable(''); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) + hcps = $.cookie('hcp').split(','); + else + hcps.push($.cookie('hcp')); + + // Query the disk pools for each + zhcpQueryCountForZfcps = hcps.length; + for (var i in hcps) { + if( !hcps[i] || 0 === hcps[i].length) continue; + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--zfcppoolnames', + msg : hcps[i] + }, + + success : getZfcpPool + }); + zhcpQueryCountForZfcps--; + } + }); + // Create action bar + var actionBar = $('
    ').css("width", "450px"); + + // Create an action menu + var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); + actionsMenu.superfish(); + actionsMenu.css('display', 'inline-block'); + actionBar.append(actionsMenu); + + // Set correct theme for action menu + actionsMenu.find('li').hover(function() { + setMenu2Theme($(this)); + }, function() { + setMenu2Normal($(this)); + }); + + // Create a division to hold actions menu + var menuDiv = $(''); + $('#' + tableId + '_length').prepend(menuDiv); + $('#' + tableId + '_length').css({ + 'padding': '0px', + 'width': '500px' + }); + $('#' + tableId + '_filter').css('padding', '10px'); + menuDiv.append(actionBar); + } + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); +} + +/** + * Open dialog to remove disk from pool + * + * @param disks2remove Disks selected in table + */ +function openRemoveDiskFromPoolDialog(disks2remove) { + // Create form to delete disk from pool + var dialogId = 'zvmDeleteDiskFromPool'; + var deleteDiskForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var disks = new Array(); + if (disks2remove.indexOf(',') > -1) + disks = disks2remove.split(','); + else + disks.push(disks2remove); + + // Pick the last zHCP and pool it finds + var args, tgtHcp = "", tgtPool = "", tgtVol = ""; + for (var i in disks) { + if( !disks[i] || 0 === disks[i].length) continue; + args = disks[i].split('-'); + tgtHcp = args[0]; + tgtPool = args[1]; + tgtVol += args[2] + ','; + } + + // Strip out last comma + tgtVol = tgtVol.slice(0, -1); + + // Create info bar + var info = createInfoBar('Remove a disk from a disk pool defined in the EXTENT CONTROL.'); + deleteDiskForm.append(info); + var action = $('
    '); + var actionSelect = $(''); + action.append(actionSelect); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + // Set region input based on those selected on table (if any) + var region = $('
    '); + var group = $('
    '); + deleteDiskForm.append(action, system, region, group); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + systemSelect.val(tgtHcp); + + actionSelect.change(function() { + if ($(this).val() == '1' || $(this).val() == '3') { + region.show(); + group.hide(); + } else if ($(this).val() == '2') { + region.show(); + group.show(); + } else if ($(this).val() == '7') { + region.val('FOOBAR'); + region.hide(); + group.show(); + } + }); + + // Generate tooltips + deleteDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to delete disk + deleteDiskForm.dialog({ + title:'Delete disk from pool', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var action = $(this).find('select[name=action]').val(); + var system = $(this).find('select[name=system]').val(); + var region = $(this).find('input[name=region]').val(); + var group = $(this).find('input[name=group]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'select[name=action]', 'input[name=region]', 'input[name=group]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + var args; + if (action == '2' || action == '7') + args = region + ';' + group; + else + args = region; + + // Remove disk from pool + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : '--removediskfrompool;' + action + ';' + args, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Open dialog to add disk to pool + */ +function openAddDisk2PoolDialog() { + // Create form to add disk to pool + var dialogId = 'zvmAddDisk2Pool'; + var addDiskForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + // Create info bar + var info = createInfoBar('Add a disk to a disk pool defined in the EXTENT CONTROL. The disk has to already be attached to SYSTEM.'); + addDiskForm.append(info); + var action = $('
    '); + var actionSelect = $(''); + action.append(actionSelect); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + var volume = $('
    '); + var group = $('
    '); + addDiskForm.append(action, system, volume, group); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Generate tooltips + addDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addDiskForm.dialog({ + title:'Add disk to pool', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + // Get inputs + var action = $(this).find('select[name=action]').val(); + var system = $(this).find('select[name=system]').val(); + var volume = $(this).find('input[name=volume]').val(); + var group = $(this).find('input[name=group]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'select[name=action]', 'input[name=volume]', 'input[name=group]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + var args; + if (action == '4') + args = volume + ';' + volume + ';' + group; + else + args = volume + ';' + group; + + // Add disk to pool + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : '--adddisk2pool;' + action + ';' + args, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Open dialog to remove zFCP from pool + * + * @param devices2remove Comman separated devices selected in table + */ +function openRemoveZfcpFromPoolDialog(devices2remove) { + // Create form to delete device from pool + var dialogId = 'zvmDeleteZfcpFromPool'; + var deleteDiskForm = $('
    '); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + // Verify disks are in the same zFCP pool + var devices = devices2remove.split(','); + var tmp, tgtPool, tgtHcp; + var tgtUnitNo = ""; + for (var i in devices) { + if( !devices[i] || 0 === devices[i].length) continue; + tmp = devices[i].split('-'); + + if (tgtPool && tmp[1] != tgtPool) { + openDialog("warn", "Please select devices in the same zFCP"); + return; + } else { + tgtPool = tmp[1]; + } + + tgtHcp = tmp[0]; // Assume it is just one zHCP. Otherwise, this cannot be done on multiple zHCPs. + tgtUnitNo += tmp[2] + ","; + } + + // Strip out last comma + tgtUnitNo = tgtUnitNo.slice(0, -1); + + // Create info bar + var info = createInfoBar('Remove a zFCP device that is defined in a zFCP pool.'); + deleteDiskForm.append(info); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + var pool = $('
    '); + var unitNo = $('
    '); + var portName = $('
    '); + deleteDiskForm.append(system, pool, unitNo, portName); + + // Append options for hardware control points + //systemSelect.append($('')); + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + systemSelect.val(tgtHcp); + + // Generate tooltips + deleteDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to delete device + deleteDiskForm.dialog({ + title:'Delete device from pool', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Remove any warning messages + $(this).find('.ui-state-error').remove(); + + var system = $(this).find('select[name=system]').val(); + var pool = $(this).find('input[name=zfcpPool]').val(); + var unitNo = $(this).find('input[name=zfcpUnitNo]').val(); + var portName = $(this).find('input[name=zfcpPortName]').val(); + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'input[name=zfcpUnitNo]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + var args = '--removezfcpfrompool;' + pool + ';' + unitNo; + if (portName) { + args += ';' + portName; + } + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : system, + args : args, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Open dialog to add zFCP to pool + */ +function openAddZfcp2PoolDialog() { + // Create form to add disk to pool + var dialogId = 'zvmAddDisk2Pool'; + var addDiskForm = $('
    '); + var info = createInfoBar('Add a device to a zFCP pool defined in xCAT.'); + addDiskForm.append(info); + + // Obtain mapping for zHCP to zVM system + var hcp2zvm = new Object(); + hcp2zvm = getHcpZvmHash(); + + var system = $('
    '); + var systemSelect = $(''); + system.append(systemSelect); + + var pool = $('
    '); + var status = $('
    '); + var portName = $('
    '); + var unitNo = $('
    '); + var size = $('
    '); + var range = $('
    '); + var owner = $('
    '); + addDiskForm.append(system, pool, status, portName, unitNo, size, range, owner); + + // Create a array for hardware control points + //systemSelect.append($('')); + // Append options for hardware control points + for (var hcp in hcp2zvm) { + systemSelect.append($('')); + } + + // Generate tooltips + addDiskForm.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.8, + delay: 0, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + }, + + // Change z index to show tooltip in front + onBeforeShow: function() { + this.getTip().css('z-index', $.topZIndex()); + } + }); + + // Open dialog to add disk + addDiskForm.dialog({ + title:'Add device to pool', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 500, + buttons: { + "Ok": function(){ + // Delete any warning messages + $(this).find('.ui-state-error').remove(); + + var tgtSystem = $(this).find('select[name=system]').val(); + var tgtPool = $(this).find('input[name=zfcpPool]').val(); + var tgtStatus = $(this).find('select[name=zfcpStatus]').val(); + var tgtPortName = $(this).find('input[name=zfcpPortName]').val(); + var tgtUnitNo = $(this).find('input[name=zfcpUnitNo]').val(); + var tgtSize = $(this).find('input[name=zfcpSize]').val(); + var tgtRange = $(this).find('input[name=zfcpRange]').val(); + + // Device owner is optional + var tgtOwner = ""; + if ($(this).find('input[name=zfcpOwner]').val()) { + tgtOwner = $(this).find('input[name=zfcpOwner]').val(); + } + + // If inputs are not complete, show warning message + var ready = true; + var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'select[name=zfcpStatus]', 'input[name=zfcpPortName]', 'input[name=zfcpUnitNo]'); + for (var i in args) { + if (!$(this).find(args[i]).val()) { + $(this).find(args[i]).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + $(this).find(args[i]).css('border', 'solid #BDBDBD 1px'); + } + } + + if (!ready) { + // Show warning message + var warn = createWarnBar('Please provide a value for each required field.'); + warn.prependTo($(this)); + return; + } + + // Change dialog buttons + $(this).dialog('option', 'buttons', { + 'Close': function() {$(this).dialog("close");} + }); + + // zFCP range and owner are optional + var args = '--addzfcp2pool||' + tgtPool + '||' + tgtStatus + '||"' + tgtPortName + '"||' + tgtUnitNo + '||' + tgtSize; + if (tgtRange) { + args += '||' + tgtRange; + } if (tgtOwner) { + args += '||' + tgtOwner; + } + + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chhypervisor', + tgt : tgtSystem, + args : args, + msg : dialogId + }, + + success : updateResourceDialog + }); + }, + "Cancel": function() { + $(this).dialog( "close" ); + } + } + }); +} + +/** + * Update resource dialog + * + * @param data HTTP request data + */ +function updateResourceDialog(data) { + var dialogId = data.msg; + var infoMsg; + + // Create info message + if (jQuery.isArray(data.rsp)) { + infoMsg = ''; + for (var i in data.rsp) { + infoMsg += data.rsp[i] + '
    '; + } + } else { + infoMsg = data.rsp; + } + + // Create info bar with close button + var infoBar = $('
    ').css('margin', '5px 0px'); + var icon = $('').css({ + 'display': 'inline-block', + 'margin': '10px 5px' + }); + + // Create close button to close info bar + var close = $('').css({ + 'display': 'inline-block', + 'float': 'right' + }).click(function() { + $(this).parent().remove(); + }); + + var msg = $('
    ' + infoMsg + '
    ').css({ + 'display': 'inline-block', + 'width': '90%' + }); + + infoBar.append(icon, msg, close); + infoBar.prependTo($('#' + dialogId)); +} + +/** + * Select all checkboxes in the datatable + * + * @param event Event on element + * @param obj Object triggering event + */ +function selectAllDisk(event, obj) { + // This will ascend from + var tableObj = obj.parents('.datatable'); + var status = obj.attr('checked'); + tableObj.find(' :checkbox').attr('checked', status); + + // Handle datatable scroll + tableObj = obj.parents('.dataTables_scroll'); + if (tableObj.length) { + tableObj.find(' :checkbox').attr('checked', status); + } + + event.stopPropagation(); +} + +/** + * Load network details into a table + * + * @param data HTTP request data + */ +function loadNetworkTable(data) { + // Remove loader if last one + var panelId = 'zvmNetworkResource'; + if (!zhcpQueryCountForNetworks) { + $('#' + panelId).find('img[src="images/loader.gif"]').remove(); + } + + // Get zVM host names + if (!$.cookie('zvms')) { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + async: false, + data : { + cmd : 'webportal', + tgt : '', + args : 'lszvm', + msg : '' + }, + + success : function(data) { + setzVMCookies(data); + } + }); + } + + var zvms = $.cookie('zvms').split(','); + var hcp2zvm = new Object(); + var args, zvm, iHcp, tmp; + for (var i in zvms) { + if( !zvms[i] || 0 === zvms[i].length) continue; + args = zvms[i].split(':'); + zvm = args[0].toLowerCase(); + + if (args[1].indexOf('.') != -1) { + tmp = args[1].split('.'); + iHcp = tmp[0]; + } else { + iHcp = args[1]; + } + + hcp2zvm[iHcp] = zvm; + } + + var args = data.msg.split(';'); + var hcp = args[0].replace('hcp=', ''); + var type = args[1].replace('type=', ''); + var name = jQuery.trim(args[2].replace('network=', '')); + tmp = data.rsp[0].split(hcp + ': '); + + // Resource tab ID + var info = $('#' + panelId).find('.ui-state-highlight'); + // If there is no info bar + if (!info.length) { + // Create info bar + info = createInfoBar('Below are LANs/VSWITCHes available to use.'); + $('#' + panelId).append(info); + } + + // Get datatable + var dTable = getNetworkDataTable(); + if (!dTable) { + // Create table + var tableId = 'zNetworkDataTable'; + var table = new DataTable(tableId); + table.init( [ '', 'z/VM', 'Type', 'Name', 'Layer', 'Owner', 'Controller', 'Details' ]); + + // Append datatable to tab + $('#' + panelId).append(table.object()); + + // Turn into datatable + dTable = $('#' + tableId).dataTable({ + 'iDisplayLength': 50, + "bScrollCollapse": true, + "sScrollY": "400px", + "sScrollX": "110%", + "bAutoWidth": true, + "oLanguage": { + "oPaginate": { + "sNext": "", + "sPrevious": "" + } + } + }); + setNetworkDataTable(dTable); + + // Set the column width + var cols = table.object().find('thead tr th'); + cols.eq(0).css('width', '20px'); // HCP column + cols.eq(1).css('width', '20px'); // Type column + cols.eq(2).css('width', '20px'); // Name column + cols.eq(3).css({'width': '600px'}); // Details column + } + + // Skip index 0 because it contains nothing + var details = '
    ';
    +    for ( var i = 1; i < tmp.length; i++) {
    +        details += tmp[i];
    +    }
    +    details += '
    '; + + // Determine the OSI layer + var layer = "3"; + if (details.indexOf("ETHERNET") != -1) { + layer = "2"; + } + + // Find the vSwitch/VLAN owner + var regex = /(LAN|VSWITCH) (.*?)(?:\s|$)/g; + var owner = ""; + var match = ""; + if (type == "VSWITCH") { + owner = "SYSTEM"; + } else { + owner = regex.exec(details)[2]; + } + + // Find the vSwitch controller + regex = /(?:^|\s)Controller: (.*?)(?:\s|$)/g; + var controllers = ""; + match = ""; + while (match = regex.exec(details)) { + controllers += match[1] + ","; + } + controllers = controllers.substring(0, controllers.length - 1); // Delete last two characters + + dTable.fnAddData(['', '
    ' + hcp2zvm[hcp] + '
    ', '
    ' + type + '
    ', '
    ' + name + '
    ', '
    ' + layer + '
    ', '
    ' + owner + '
    ', '
    ' + controllers + '
    ', details]); + + // Create actions menu + if (!$('#networkResourceActions').length) { + // Empty filter area + $('#' + tableId + '_length').empty(); + + // Add Vswitch/Vlan + var addLnk = $('Add'); + addLnk.bind('click', function(event){ + openAddVswitchVlanDialog(); + }); + + // Remove Vswitch/Vlan + var removeLnk = $('Remove'); + removeLnk.bind('click', function(event){ + var networkList = getNodesChecked(tableId).split(','); + if (networkList) { + openRemoveVswitchVlanDialog(networkList); + } + }); + + // Refresh table + var refreshLnk = $('Refresh'); + refreshLnk.bind('click', function(event){ + $('#zvmNetworkResource').empty().append(createLoader('')); + setNetworkDataTable(''); + + // Create a array for hardware control points + var hcps = new Array(); + if ($.cookie('hcp').indexOf(',') > -1) + hcps = $.cookie('hcp').split(','); + else + hcps.push($.cookie('hcp')); + + // Query networks + zhcpQueryCountForNetworks = hcps.length; + for (var i in hcps) { + if( !hcps[i] || 0 === hcps[i].length) continue; + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : hcps[i], + args : '--getnetworknames', + msg : hcps[i] + }, + + success : getNetwork + }); + zhcpQueryCountForNetworks--; + } + }); + + // Create action bar + var actionBar = $('
    ').css("width", "450px"); + + // Create an action menu + var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]); + actionsMenu.superfish(); + actionsMenu.css('display', 'inline-block'); + actionBar.append(actionsMenu); + + // Set correct theme for action menu + actionsMenu.find('li').hover(function() { + setMenu2Theme($(this)); + }, function() { + setMenu2Normal($(this)); + }); + + // Create a division to hold actions menu + var menuDiv = $(''); + $('#' + tableId + '_length').prepend(menuDiv); + $('#' + tableId + '_length').css({ + 'padding': '0px', + 'width': '500px' + }); + $('#' + tableId + '_filter').css('padding', '10px'); + menuDiv.append(actionBar); + } + + // Resize accordion + $('#zvmResourceAccordion').accordion('resize'); +} + +/** + * Connect a NIC to a Guest LAN + * + * @param data Data from HTTP request + */ +function connect2GuestLan(data) { + var rsp = data.rsp; + var args = data.msg.split(';'); + var node = args[0].replace('node=', ''); + var address = args[1].replace('addr=', ''); + var lanName = args[2].replace('lan=', ''); + var lanOwner = args[3].replace('owner=', ''); + + // Write ajax response to status bar + var prg = writeRsp(rsp, node + ': '); + $('#' + node + 'StatusBar').find('div').append(prg); + + // Continue if no errors found + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + // Connect NIC to Guest LAN + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--connectnic2guestlan;' + address + ';' + lanName + ';' + + lanOwner, + msg : node + }, + + success : updateZNodeStatus + }); + } else { + // Hide loader when error + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).hide(); + } +} + +/** + * Connect a NIC to a VSwitch + * + * @param data Data from HTTP request + */ +function connect2VSwitch(data) { + var rsp = data.rsp; + var args = data.msg.split(';'); + var node = args[0].replace('node=', ''); + var address = args[1].replace('addr=', ''); + var vswitchName = args[2].replace('vsw=', ''); + var vswitchAware = args[3].replace('vlanaware=', ''); + var vswitchPortType = args[4].replace('porttype=', ''); + var vswitchLanId = args[5].replace('lanid=', ''); + + // Set variables to empty string if notaware or they contain "default" + if (vswitchAware.toLowerCase() == 'notaware' ) { + vswitchPortType = ''; + vswitchLanId = ''; + } else { + if (vswitchPortType.toLowerCase() == 'default' ) { + vswitchPortType = ''; + } + if (vswitchLanId.toLowerCase() == 'default' ) { + vswitchLanId = ''; + } + } + + // Write ajax response to status bar + var prg = writeRsp(rsp, node + ': '); + $('#' + node + 'StatusBar').find('div').append(prg); + + // Continue if no errors found + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + // Connect NIC to VSwitch + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'chvm', + tgt : node, + args : '--connectnic2vswitch;' + address + ';' + vswitchName + ';' + + vswitchPortType + ';' + vswitchLanId, + msg : node + }, + + success : updateZNodeStatus + }); + } else { + // Hide loader when error + var statusBarLoaderId = node + 'StatusBarLoader'; + $('#' + statusBarLoaderId).hide(); + } +} + +/** + * Create provision existing node division + * + * @param inst Provision tab instance + * @return Provision existing node division + */ +function createZProvisionExisting(inst) { + // Create provision existing and hide it + var provExisting = $('
    ').hide(); + + var vmFS = $('
    '); + var vmLegend = $('Virtual Machine'); + vmFS.append(vmLegend); + provExisting.append(vmFS); + + var vmAttr = $('
    '); + vmFS.append($('
    ')); + vmFS.append(vmAttr); + + var osFS = $('
    '); + var osLegend = $('Operating System'); + osFS.append(osLegend); + provExisting.append(osFS); + + var osAttr = $('
    '); + osFS.append($('
    ')); + osFS.append(osAttr); + + // Create group input + var group = $('
    '); + var groupLabel = $(''); + group.append(groupLabel); + + // Turn on auto complete for group + var groupNames = $.cookie('groups'); + if (groupNames) { + // Split group names into an array + var tmp = groupNames.split(','); + + // Create drop down for groups + var groupSelect = $(''); + groupSelect.append(''); + for (var i in tmp) { + if( !tmp[i] || 0 === tmp[i].length) continue; + // Add group into drop down + var opt = $(''); + groupSelect.append(opt); + } + group.append(groupSelect); + + // Create node datatable + groupSelect.change(function(){ + // Get group selected + var thisGroup = $(this).val(); + // If a valid group is selected + if (thisGroup) { + createNodesDatatable(thisGroup, 'zNodesDatatableDIV' + inst); + } + }); + } else { + // If no groups are cookied + var groupInput = $(''); + group.append(groupInput); + } + vmAttr.append(group); + + // Create node input + var node = $('
    '); + var nodeLabel = $(''); + var nodeDatatable = $('

    Select a group to view its nodes

    '); + node.append(nodeLabel); + node.append(nodeDatatable); + vmAttr.append(node); + + // Create operating system image input + var os = $('
    '); + var osLabel = $(''); + var osSelect = $(''); + osSelect.append($('')); + + var imageNames = $.cookie('imagenames').split(','); + if (imageNames) { + imageNames.sort(); + for (var i in imageNames) { + if( !imageNames[i] || 0 === imageNames[i].length) continue; + osSelect.append($('')); + } + } + os.append(osLabel); + os.append(osSelect); + osAttr.append(os); + + // Create boot method drop down + var bootMethod = $('
    '); + var methoddLabel = $(''); + var methodSelect = $(''); + methodSelect.append('' + + '' + + '' + + '' + + '' + ); + bootMethod.append(methoddLabel); + bootMethod.append(methodSelect); + osAttr.append(bootMethod); + + // Generate tooltips + provExisting.find('div input[title],select[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.7, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + } + }); + + /** + * Provision existing + */ + var provisionBtn = createButton('Provision'); + provisionBtn.bind('click', function(event) { + // Remove any warning messages + $(this).parent().parent().find('.ui-state-error').remove(); + + var ready = true; + var errMsg = ''; + + // Get provision tab ID + var thisTabId = $(this).parent().parent().parent().attr('id'); + // Get provision tab instance + var inst = thisTabId.replace('zvmProvisionTab', ''); + + // Get nodes that were checked + var dTableId = 'zNodesDatatable' + inst; + var tgts = getNodesChecked(dTableId); + if (!tgts) { + errMsg += 'You need to select a node.
    '; + ready = false; + } + + // Check operating system image + var os = $('#' + thisTabId + ' select[name=os]:visible'); + if (!os.val()) { + errMsg += 'You need to select a operating system image.'; + os.css('border', 'solid #FF0000 1px'); + ready = false; + } else { + os.css('border', 'solid #BDBDBD 1px'); + } + + // If all inputs are valid, ready to provision + if (ready) { + // Disable provision button + $(this).attr('disabled', 'true'); + + // Show loader + $('#zProvisionStatBar' + inst).show(); + $('#zProvisionLoader' + inst).show(); + + // Disable all inputs + var inputs = $('#' + thisTabId + ' input:visible'); + inputs.attr('disabled', 'disabled'); + + // Disable all selects + var selects = $('#' + thisTabId + ' select'); + selects.attr('disabled', 'disabled'); + + // Get operating system image + var osImage = $('#' + thisTabId + ' select[name=os]:visible').val(); + var tmp = osImage.split('-'); + var os = tmp[0]; + var arch = tmp[1]; + var profile = tmp[3]; + + /** + * (1) Set operating system + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeadd', + tgt : '', + args : tgts + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile, + msg : 'cmd=nodeadd;out=' + inst + }, + + success : updateZProvisionExistingStatus + }); + } else { + // Show warning message + var warn = createWarnBar(errMsg); + warn.prependTo($(this).parent().parent()); + } + }); + provExisting.append(provisionBtn); + + return provExisting; +} + +/** + * Create provision new node division + * + * @param inst Provision tab instance + * @return Provision new node division + */ +function createZProvisionNew(inst) { + if (typeof console == "object"){ + console.log("Entering createZProvisionNew. Inst value:"+inst); + } + // Create provision new node division + var provNew = $('
    '); + + // Create VM fieldset + var vmFS = $('
    '); + var vmLegend = $('Virtual Machine'); + vmFS.append(vmLegend); + provNew.append(vmFS); + + var vmAttr = $('
    '); + vmFS.append($('
    ')); + vmFS.append(vmAttr); + + // Create OS fieldset + var osFS = $('
    '); + var osLegend = $('Operating System'); + osFS.append(osLegend); + provNew.append(osFS); + + // Create hardware fieldset + var hwFS = $('
    '); + var hwLegend = $('Hardware'); + hwFS.append(hwLegend); + provNew.append(hwFS); + + var hwAttr = $('
    '); + hwFS.append($('
    ')); + hwFS.append(hwAttr); + + // Create tabs for basic and advanced hardware configuration + var hwTab = new Tab('hwConfig' + inst); + hwTab.init(); + hwAttr.append(hwTab.object()); + + var osAttr = $('
    '); + osFS.append($('
    ')); + osFS.append(osAttr); + + // Create group input + var group = $('
    '); + var groupLabel = $(''); + var groupInput = $(''); + // Get groups on-focus + groupInput.one('focus', function(){ + var groupNames = $.cookie('groups'); + if (groupNames) { + // Turn on auto complete + $(this).autocomplete({ + source: groupNames.split(',') + }); + } + }); + group.append(groupLabel); + group.append(groupInput); + vmAttr.append(group); + + // Create node input + var nodeName = $('
    '); + var nodeLabel = $(''); + var nodeInput = $(''); + nodeName.append(nodeLabel); + nodeName.append(nodeInput); + vmAttr.append(nodeName); + + // Create user ID input + var userId = $('
    '); + vmAttr.append(userId); + + // Create hardware control point input + var hcpDiv = $('
    '); + var hcpNodeLabel = $(''); + var hcpNodeInput = $(''); + var hcpHiddenInput = $(''); + hcpNodeInput.blur(function() { + + if (typeof console == "object") { + console.log("Display loading bar "); + } + // Show the status bar with a message and loading gif + $('#'+'zProvisionStatBar'+inst).find('div').append("Loading zhcp information..."); + $('#'+'zProvisionStatBar'+inst).find('div').append(""); + $('#'+'zProvisionStatBar'+inst).show(); + + // list of calls after the zhcp is verified. Used to determine when in progress gif is to be removed. + var ajaxCalls = {"diskpoolnames":1, "zfcppoolnames":1, "userprofilenames":1}; + var zhcpToCheck = $(this).val(); + var zhcpField = $(this); + var provisionStatusBar = $('#'+'zProvisionStatBar'+inst); + + // Make sure border is set back to black + zhcpField.css('border', 'solid #BDBDBD 1px'); + + if ($(this).val()) { + // Check if this is a valid node by making network names call. + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : zhcpToCheck, + args : '--getnetworknames', + msg : zhcpToCheck + }, + + success: function(data) { + if (data.rsp.length && (data.rsp[0].indexOf("Failed") > -1 || data.rsp[0].indexOf("Invalid") > -1) ) { + // Remove the progress gif, since bailing out + removeProvisionLoadingGif(provisionStatusBar); + + // Create warning dialog + var warning = createWarnBar('Failure getting network data for hardware control point ' + zhcpToCheck + '
    The hcp field must be a xCAT node name.'); + var warnDialog = $('
    ').append(warning); + + // highlight the hcp field + zhcpField.css('border', 'solid #FF0000 1px'); + + // Open warning dialog + warnDialog.dialog({ + title:'Warning', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function() { + $(this).dialog("close"); + } + } + }); + + } else { + // Node is good, now set some cookies from network, then check/set other cookies + setNetworkCookies(data); + + // Get the HCP name from the hcp node name + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsdef', + tgt : '', + args : zhcpToCheck, + msg : 'zhcpFullName' + }, + + success: function(data) { + if (data.rsp.length && (data.rsp[0].indexOf("Failed") > -1 || data.rsp[0].indexOf("Invalid") > -1) ) { + // Remove the progress gif, since bailing out + removeProvisionLoadingGif(provisionStatusBar); + + // Create warning dialog + var warning = createWarnBar('Failure getting hcp data from hardware control point ' + zhcpToCheck + '
    The hcp field must be a valid xCAT node name.'); + var warnDialog = $('
    ').append(warning); + + // highlight the hcp field + zhcpField.css('border', 'solid #FF0000 1px'); + + // Open warning dialog + warnDialog.dialog({ + title:'Warning', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function() { + $(this).dialog("close"); + } + } + }); + } else { + // Now set the hidden hcp field with the full name + // Clear hash table containing definable node attributes + nodeAttrs = new Array(); + + // Get definable attributes + // Data returned + var rsp = data.rsp; + // Group name + var group = data.msg; + // Hash of node attributes + var attrs = new Object(); + + // Go through each attribute + var node, args; + for (var i in rsp) { + // Get node name, skip processing + if (rsp[i].indexOf('Object name:') > -1) { + i++; + } + + // Get key and value + args = rsp[i].split('=', 2); + var key = jQuery.trim(args[0]); + var val = jQuery.trim(rsp[i].substring(rsp[i].indexOf('=') + 1, rsp[i].length)); + + // If this is zhcp key then save full name in hidden field + if (key == "hcp") { + hcpHiddenInput.val(val); + } + + } + + } + } + }); + + if (typeof console == "object"){ + console.log("Looking for cookies from <" + zhcpToCheck + ">"); + } + + if (!$.cookie(zhcpToCheck + 'diskpools')) { + // Get disk pools + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : zhcpToCheck, + args : '--diskpoolnames', + msg : zhcpToCheck + }, + + success : setDiskPoolCookies, + complete : function() { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "diskpoolnames"); + } + }); + } else { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "diskpoolnames"); + } + + if (!$.cookie(zhcpToCheck + 'zfcppools')) { + // Get zFCP pools + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'lsvm', + tgt : zhcpToCheck, + args : '--zfcppoolnames', + msg : zhcpToCheck + }, + + success : setZfcpPoolCookies, + complete : function() { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "zfcppoolnames"); + } + }); + } else { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "zfcppoolnames"); + } + + if (!$.cookie(zhcpToCheck + 'userprofiles')) { + // Get zFCP pools + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + async: false, + data : { + cmd : 'lsvm', + tgt : zhcpToCheck, + args : '--userprofilenames', + msg : zhcpToCheck + }, + + success : setUserProfilesCookies, + complete : function() { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "userprofilenames"); + } + }); + } else { + checkProvisionCallsDone(provisionStatusBar, ajaxCalls, "userprofilenames"); + } + + // Reset user profile and network drop down box + var thisTabId = zhcpField.parents('.tab').attr('id'); + var thisUserProfile = $('#' + thisTabId + ' select[name=userProfile]'); + thisUserProfile.children().remove(); + + var definedUserProfiles = $.cookie(zhcpToCheck + 'userprofiles').split(','); + for (var i in definedUserProfiles) { + if( !definedUserProfiles[i] || 0 === definedUserProfiles[i].length) continue; + thisUserProfile.append(''); + } + + var thisNetwork = $('#' + thisTabId + ' select[name=network]'); + thisNetwork.children().remove(); + thisNetwork.append(''); // No profile option + var definedNetworks = $.cookie(zhcpToCheck + 'networks').split(','); + for (var i in definedNetworks) { + if( !definedNetworks[i] || 0 === definedNetworks[i].length) continue; + if (!jQuery.trim(definedNetworks[i])) + continue; + + var directoryEntry, interfaceName; + + // Generate directory entry statement for vSwitch, hipersocket, and guest LAN + if (definedNetworks[i].indexOf('VSWITCH ') != -1) { + interfaceName = jQuery.trim(definedNetworks[i].replace('VSWITCH ', '')); + directoryEntry = "TYPE QDIO LAN " + interfaceName; + } else if (definedNetworks[i].indexOf('LAN:HIPERS ') != -1) { + interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:HIPERS ', '')); + directoryEntry = "TYPE HIPERSOCKETS LAN " + interfaceName; + } else { + interfaceName = jQuery.trim(definedNetworks[i].replace('LAN:QDIO ', '')); + directoryEntry = "TYPE QDIO LAN " + interfaceName; + } + + thisNetwork.append(''); + } + + // Update user entry on change + thisNetwork.change(function() { + updateUserEntry(thisTabId); + }); + + thisUserProfile.change(function() { + updateUserEntry(thisTabId); + }); + } + } + }); + } + }); + hcpDiv.append(hcpNodeLabel); + hcpDiv.append(hcpNodeInput); + hcpDiv.append(hcpHiddenInput); + vmAttr.append(hcpDiv); + + // Create an advanced link to set IP address and hostname + var advancedLnk = $(''); + vmAttr.append(advancedLnk); + var advanced = $('
    ').hide(); + vmAttr.append(advanced); + + var ip = $('
    '); + advanced.append(ip); + var hostname = $('
    '); + advanced.append(hostname); + + // Show IP address and hostname inputs on-click + advancedLnk.click(function() { + advanced.toggle(); + }); + + // Create operating system image input + var os = $('
    '); + var osLabel = $(''); + var osSelect = $(''); + osSelect.append($('')); + + var imageNames = $.cookie('imagenames').split(','); + if (imageNames) { + imageNames.sort(); + for (var i in imageNames) { + if( !imageNames[i] || 0 === imageNames[i].length) continue; + osSelect.append($('')); + } + } + os.append(osLabel); + os.append(osSelect); + osAttr.append(os); + + // Create user entry input + var defaultChkbox = $('').click(function() { + // Remove any warning messages + $(this).parents('.form').find('.ui-state-error').remove(); + + // Get tab Id + var thisTabId = $(this).parents('.ui-tabs-panel').parents('.ui-tabs-panel').attr('id'); + + // Get objects for HCP, user ID, and OS + var userId = $('#' + thisTabId + ' input[name=userId]'); + var os = $('#' + thisTabId + ' select[name=os]'); + + // Get default user entry when clicked + if ($(this).attr('checked')) { + if (!os.val() || !userId.val()) { + // Show warning message + var warn = createWarnBar('Please specify the operating system and user ID before checking this box'); + warn.prependTo($(this).parents('.form')); + + // Highlight empty fields + jQuery.each([os, userId], function() { + if (!$(this).val()) { + $(this).css('border', 'solid #FF0000 1px'); + } + }); + } else { + // Un-highlight empty fields + jQuery.each([os, userId], function() { + $(this).css('border', 'solid #BDBDBD 1px'); + }); + + // Get profile name + var tmp = os.val().split('-'); + var profile = tmp[3]; + + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'webrun', + tgt : '', + args : 'getdefaultuserentry;' + profile, + msg : thisTabId + }, + + success:function(data) { + // Populate user entry + var tabId = data.msg; + var entry = new String(data.rsp); + var userId = $('#' + tabId + ' input[name=userId]').val(); + entry = entry.replace(new RegExp('LXUSR', 'g'), userId); + $('#' + tabId + ' textarea:visible').val(entry); + } + }); + } + } else { + $('#' + thisTabId + ' textarea:visible').val(''); + + // Un-highlight empty fields + jQuery.each([os, userId], function() { + $(this).css('border', 'solid #BDBDBD 1px'); + }); + } + }); + var userEntry = $('
    '); + userEntry.append($('').append(defaultChkbox, 'Use default')); + + // Add division on basic tab for specifying: memory, # of CPUs, privilege, user profile, and network. + var basicConfig = $('
    '); + var userProfile = $('
    '); + var cpuSelect = $('').change(function() { + updateUserEntry('zvmProvisionTab' + inst); + }); + var cpuCount = $('
    ').append(cpuSelect); + var memorySlider = $('
    '); + var memorySize = $(''); + var memory = $('
    ').append(memorySlider, memorySize); + var acceptableMemorySize = ['512M', '1024M', '2G', '3G', '4G', '5G', '6G', '7G', '8G']; + memorySlider.slider({ + value: 0, + min: 0, + max: 8, + step: 1, + slide: function(event, ui) { + $('#basicConfig' + inst + ' input[name=memory]').val(acceptableMemorySize[ui.value]); + + // Update user entry on change + updateUserEntry('zvmProvisionTab' + inst); + } + }); + + // Initialize storage size + memorySize.val(acceptableMemorySize[0]); + + var privilege = $('
    ' + + '
    ' + + ' A - Primary system operator
    ' + + ' B - System resource operator
    ' + + ' C - System programmer
    ' + + ' D - Spooling operator
    ' + + ' E - System analyst
    ' + + ' F - IBM service representative
    ' + + ' G - General user
    ' + + '
    ' + + '
    '); + privilege.find('input').change(function() { + updateUserEntry('zvmProvisionTab' + inst); + }); + + var network = $('
    '); + + var vswitchvlan = $('

    ' + + '
    ' + + '
    '); + vswitchvlan.find('input').change(function() { + updateUserEntry('zvmProvisionTab' + inst); + }); + vswitchvlan.find('select').change(function() { + updateUserEntry('zvmProvisionTab' + inst); + }); + + vswitchvlan.hide(); + basicConfig.append(userProfile, cpuCount, memory, privilege, network, vswitchvlan); + hwTab.add('basicConfig' + inst, 'Basic', basicConfig, false); + + // Add division on advanced tab for specifying user directory entry + hwTab.add('advancedConfig' + inst, 'Advanced', userEntry, false); + + // Create disk table + var diskDiv = $('
    '); + var diskLabel = $(''); + var diskTable = $('
    '); + var diskHeader = $(' Type Address Size Mode Pool Password IPLNone
    '); + // Adjust header width + diskHeader.find('th').css( { + 'width' : '80px' + }); + diskHeader.find('th').eq(0).css( { + 'width' : '20px' + }); + var diskBody = $(''); + var diskFooter = $(''); + + /** + * Add disks + */ + var addDiskLink = $('Add disk'); + addDiskLink.bind('click', function(event) { + // Get list of disk pools + var thisTabId = $(this).parents('.tab').attr('id'); + var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); + var definedPools = null; + if (thisHcp) { + // Get node without domain name + var temp = thisHcp.split('.'); + definedPools = $.cookie(temp[0] + 'diskpools').split(','); + } else { + var warning = createWarnBar('You must fill in a hardware control point before adding a disk.'); + var warnDialog = $('
    ').append(warning); + + // Open dialog + warnDialog.dialog({ + title:'Warning', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function() { + $(this).dialog("close"); + } + } + }); + return false; + } + + // Create a row + var diskRow = $(''); + + // Add remove button + var removeBtn = $(''); + var col = $('').append(removeBtn); + removeBtn.bind('click', function(event) { + diskRow.remove(); + }); + diskRow.append(col); + + // Create disk type drop down + var diskType = $(''); + var diskTypeSelect = $(''); + diskTypeSelect.append('' + + '' + ); + diskType.append(diskTypeSelect); + diskRow.append(diskType); + + // Create disk address input + var diskAddr = $(''); + diskRow.append(diskAddr); + + // Create disk size input + var diskSize = $(''); + diskRow.append(diskSize); + + // Create disk mode input + var diskMode = $(''); + var diskModeSelect = $(''); + diskModeSelect.append('' + + '' + + '' + + '' + + '' + + '' + + '' + ); + diskMode.append(diskModeSelect); + diskRow.append(diskMode); + + // Create disk pool drop down + var diskPool = $(''); + var diskPoolSelect = $(''); + for (var i in definedPools) { + diskPoolSelect.append(''); + } + diskPool.append(diskPoolSelect); + diskRow.append(diskPool); + + // Create disk password input + var diskPw = $(''); + diskRow.append(diskPw); + + // Create IPL checkbox + //var diskIpl = $(''); + var diskIpl = $(''); + diskRow.append(diskIpl); + diskIpl.find('input').change(function() { + updateUserEntry(thisTabId); + }); + + diskBody.append(diskRow); + + // Generate tooltips + diskBody.find('td input[title],select[title]').tooltip({ + position: "top right", + offset: [-4, 4], + effect: "fade", + opacity: 0.7, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + } + }); + }); + + // Create disk table + diskFooter.append(addDiskLink); + diskTable.append(diskHeader); + diskTable.append(diskBody); + diskTable.append(diskFooter); + + diskDiv.append(diskLabel); + diskDiv.append(diskTable); + hwAttr.append(diskDiv); + + // Create zFCP table + var zfcpDiv = $('
    '); + var zfcpLabel = $(''); + var zfcpTable = $('
    '); + var zfcpHeader = $(' Address Size Pool Tag Port Name Unit # LOADDEV'); + // Adjust header width + zfcpHeader.find('th').css({ + 'width' : '80px' + }); + zfcpHeader.find('th').eq(0).css({ + 'width' : '20px' + }); + var zfcpBody = $(''); + var zfcpFooter = $(''); + + /** + * Add zFCP devices + */ + var addZfcpLink = $('Add zFCP'); + addZfcpLink.bind('click', function(event) { + // Get list of disk pools + var thisTabId = $(this).parents('.tab').attr('id'); + var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val(); + var definedPools = null; + if (thisHcp) { + // Get node without domain name + var temp = thisHcp.split('.'); + definedPools = $.cookie(temp[0] + 'zfcppools').split(','); + } else { + var warning = createWarnBar('You must fill in a hardware control point before adding a zFCP.'); + var warnDialog = $('
    ').append(warning); + + // Open dialog + warnDialog.dialog({ + title:'Warning', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function() { + $(this).dialog("close"); + } + } + }); + + } + + // Create a row + var zfcpRow = $(''); + + // Add remove button + var removeBtn = $(''); + var col = $('').append(removeBtn); + removeBtn.bind('click', function(event) { + zfcpRow.remove(); + }); + zfcpRow.append(col); + + // Create disk address input + var zfcpAddr = $(''); + zfcpRow.append(zfcpAddr); + + // Create disk size input + var zfcpSize = $(''); + zfcpRow.append(zfcpSize); + + // Create zFCP pool drop down + var zfcpPool = $(''); + var zfcpPoolSelect = $(''); + for (var i in definedPools) { + zfcpPoolSelect.append(''); + } + zfcpPool.append(zfcpPoolSelect); + zfcpRow.append(zfcpPool); + + // Create disk tag + var zfcpTag = $(''); + zfcpRow.append(zfcpTag); + + // Create device port name + var zfcpPortName = $(''); + zfcpRow.append(zfcpPortName); + + // Create device unit number + var zfcpUnitNo = $(''); + zfcpRow.append(zfcpUnitNo); + + // Create LOADDEV radio button + var zfcpLoaddev = $(''); + zfcpRow.append(zfcpLoaddev); + + zfcpBody.append(zfcpRow); + + // Generate tooltips + zfcpBody.find('td input[title],select[title]').tooltip({ + position: "top right", + offset: [-4, 4], + effect: "fade", + opacity: 0.7, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + } + }); + }); + + zfcpFooter.append(addZfcpLink); + zfcpTable.append(zfcpHeader); + zfcpTable.append(zfcpBody); + zfcpTable.append(zfcpFooter); + + zfcpDiv.append(zfcpLabel); + zfcpDiv.append(zfcpTable); + hwAttr.append(zfcpDiv); + + // Generate tooltips + provNew.find('div input[title],select[title],textarea[title]').tooltip({ + position: "center right", + offset: [-2, 10], + effect: "fade", + opacity: 0.7, + predelay: 800, + events: { + def: "mouseover,mouseout", + input: "mouseover,mouseout", + widget: "focus mouseover,blur mouseout", + tooltip: "mouseover,mouseout" + } + }); + + // Disable IPL column if advanced tab is selected + hwTab.object().tabs({ + select: function(event, ui) { + // Get provision tab instance + var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); + var inst = thisTabId.replace('zvmProvisionTab', ''); + + // Disable and de-select IPL device + if (ui.index == 1) { + $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').attr('disabled','disabled'); + } else { + $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('disabled'); + } + + $('#' + thisTabId + ' table:eq(0):visible tbody tr td:nth-child(8) input').removeAttr('checked'); + } + }); + + /** + * Provision new + */ + var provisionBtn = createButton('Provision'); + provisionBtn.bind('click', function(event) { + // Remove any warning messages + $(this).parent().parent().find('.ui-state-error').remove(); + + var ready = true; + var errMsg = ''; + + // Get tab ID + var thisTabId = $(this).parents('.ui-tabs-panel').attr('id'); + // Get provision tab instance + var inst = thisTabId.replace('zvmProvisionTab', ''); + + // Get the selected hardware configuration tab + // Basic tab index = 0 & advanced tab index = 1 + var hwTabIndex = $("#hwConfig" + inst).tabs('option', 'selected'); + + // Check node name, userId, hardware control point, and group + // Check disks and zFCP devices + var inputs = $('#' + thisTabId + ' input:visible'); + for (var i = 0; i < inputs.length; i++) { + // Do not check some inputs + if (inputs.eq(i).attr('name') == 'memory') { + // There should always be a value for memory + // Do not change the border + continue; + } else if (!inputs.eq(i).val() + && inputs.eq(i).attr('type') != 'password' + && inputs.eq(i).attr('name') != 'zfcpTag' + && inputs.eq(i).attr('name') != 'zfcpPortName' + && inputs.eq(i).attr('name') != 'zfcpUnitNo') { + inputs.eq(i).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + inputs.eq(i).css('border', 'solid #BDBDBD 1px'); + } + } + + var selects = $('#' + thisTabId + ' select:visible'); + for (var i = 0; i < selects.length; i++) { + if (!selects.eq(i).val() && selects.eq(i).attr('name') != 'os' && selects.eq(i).attr('name') != 'userProfile' && selects.eq(i).attr('name') != 'network') { + selects.eq(i).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + selects.eq(i).css('border', 'solid #BDBDBD 1px'); + } + } + + if (hwTabIndex == 1) { + // Check user entry + var thisUserEntry = $('#' + thisTabId + ' textarea:visible'); + thisUserEntry.val(thisUserEntry.val().toUpperCase()); + if (!thisUserEntry.val()) { + thisUserEntry.css('border', 'solid #FF0000 1px'); + ready = false; + } else { + thisUserEntry.css('border', 'solid #BDBDBD 1px'); + } + + // Check if user entry contains user ID + var thisUserId = $('#' + thisTabId + ' input[name=userId]:visible'); + var pos = thisUserEntry.val().indexOf('USER ' + thisUserId.val().toUpperCase()); + if (pos < 0) { + + pos = thisUserEntry.val().indexOf('IDENTITY ' + thisUserId.val().toUpperCase()); + if (pos < 0) { + errMsg = errMsg + 'The directory entry does not contain the correct user/identity ID.
    '; + ready = false; + } + } + } + var hostnameCheck = $('#' + thisTabId + ' input[name=hostname]').val(); + if (hostnameCheck.length > 70) { + errMsg = errMsg + 'The host name cannot be longer than 70 characters.
    '; + $('#' + thisTabId + ' input[name=hostname]').css('border', 'solid #FF0000 1px'); + ready = false; + } + + // Show error message for missing inputs + if (!ready) { + errMsg = errMsg + 'Please provide a value for each missing field.
    '; + } + + // If no operating system is specified, create only user entry + os = $('#' + thisTabId + ' select[name=os]:visible'); + + // Check number of disks + var diskRows = $('#' + thisTabId + ' table tr'); + // If an OS is given, disks are needed + if (os.val() && (diskRows.length < 1)) { + errMsg = errMsg + 'You need to add at some disks.
    '; + ready = false; + } + + // If inputs are valid, ready to provision + if (ready) { + // Generate user directory entry if basic tab is selected + if (hwTabIndex == 0) { + updateUserEntry(thisTabId); + } + + if (!os.val()) { + // If no OS is given, create a virtual server + var msg = ''; + if (diskRows.length > 0) { + msg = 'Do you want to create a virtual server without an operating system?'; + } else { + // If no disks are given, create a virtual server (no disk) + msg = 'Do you want to create a virtual server without an operating system or disks?'; + } + + // Open dialog to confirm + var confirmDialog = $('

    ' + msg + '

    '); + confirmDialog.dialog({ + title:'Confirm', + modal: true, + close: function(){ + $(this).remove(); + }, + width: 400, + buttons: { + "Ok": function(){ + // Disable provision button + provisionBtn.attr('disabled', 'true'); + + // Show loader + $('#zProvisionStatBar' + inst).show(); + $('#zProvisionLoader' + inst).show(); + + // Disable add disk button + addDiskLink.attr('disabled', 'true'); + + // Disable close button on disk table + $('#' + thisTabId + ' table span').unbind('click'); + + // Disable all inputs + var inputs = $('#' + thisTabId + ' input'); + inputs.attr('disabled', 'disabled'); + + // Disable all selects + var selects = $('#' + thisTabId + ' select'); + selects.attr('disabled', 'disabled'); + + // Add a new line at the end of the user entry + var textarea = $('#' + thisTabId + ' textarea'); + var tmp = jQuery.trim(textarea.val()); + textarea.val(tmp + '\n'); + textarea.attr('readonly', 'readonly'); + textarea.css( { + 'background-color' : '#F2F2F2' + }); + + // Get node name + var node = $('#' + thisTabId + ' input[name=nodeName]').val(); + // Get userId + var userId = $('#' + thisTabId + ' input[name=userId]').val(); + // Get hardware control point + var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); + // Get group + var group = $('#' + thisTabId + ' input[name=group]').val(); + // Get IP address and hostname + var ip = $('#' + thisTabId + ' input[name=ip]').val(); + var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); + + // Generate arguments to sent + var args = node + ';zvm.hcp=' + hcp + + ';zvm.userid=' + userId + + ';nodehm.mgt=zvm' + + ';groups=' + group; + if (ip) + args += ';hosts.ip=' + ip; + + if (hostname) + args += ';hosts.hostnames=' + hostname; + + /** + * (1) Define node + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeadd', + tgt : '', + args : args, + msg : 'cmd=nodeadd;out=' + inst + }, + + success : updateZProvisionNewStatus + }); + + $(this).dialog("close"); + }, + "Cancel": function() { + $(this).dialog("close"); + } + } + }); + } else { + /** + * Create a virtual server and install OS + */ + + // Disable provision button + $(this).attr('disabled', 'true'); + + // Show loader + $('#zProvisionStatBar' + inst).show(); + $('#zProvisionLoader' + inst).show(); + + // Disable add disk button + addDiskLink.attr('disabled', 'true'); + + // Disable close button on disk table + $('#' + thisTabId + ' table span').unbind('click'); + + // Disable all inputs + var inputs = $('#' + thisTabId + ' input'); + inputs.attr('disabled', 'disabled'); + inputs.css( { + 'background-color' : '#F2F2F2' + }); + + // Disable all selects + var selects = $('#' + thisTabId + ' select'); + selects.attr('disabled', 'disabled'); + selects.css( { + 'background-color' : '#F2F2F2' + }); + + // Add a new line at the end of the user entry + var textarea = $('#' + thisTabId + ' textarea'); + var tmp = jQuery.trim(textarea.val()); + textarea.val(tmp + '\n'); + textarea.attr('readonly', 'readonly'); + textarea.css( { + 'background-color' : '#F2F2F2' + }); + + // Get node name + var node = $('#' + thisTabId + ' input[name=nodeName]').val(); + // Get userId + var userId = $('#' + thisTabId + ' input[name=userId]').val(); + // Get hardware control point + var hcp = $('#' + thisTabId + ' input[name=hcp]').val(); + // Get group + var group = $('#' + thisTabId + ' input[name=group]').val(); + // Get IP address and hostname + var ip = $('#' + thisTabId + ' input[name=ip]').val(); + var hostname = $('#' + thisTabId + ' input[name=hostname]').val(); + + // Generate arguments to sent + var args = node + ';zvm.hcp=' + hcp + + ';zvm.userid=' + userId + + ';nodehm.mgt=zvm' + + ';groups=' + group; + if (ip) + args += ';hosts.ip=' + ip; + + if (hostname) + args += ';hosts.hostnames=' + hostname; + + /** + * (1) Define node + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeadd', + tgt : '', + args : args, + msg : 'cmd=nodeadd;out=' + inst + }, + + success : updateZProvisionNewStatus + }); + } + } else { + // Show warning message + var warn = createWarnBar(errMsg); + warn.prependTo($(this).parent().parent()); + } + }); + provNew.append(provisionBtn); + + return provNew; +} +/** + * Remove zprovision loading gif for zhcp and message + * + * @param division holding the gif and message + */ +function removeProvisionLoadingGif(provisionStatBar) { + + // Only remove the status bar message and gif we added, then hide the status bar + var items = provisionStatBar.find('div').children(); + for (var i = 0; i< items.length; i++) { + var nname = items[i].nodeName; + var myid = items[i].id; + if (nname == "B" && myid == "loadzhcp") { + items[i].remove() + } else if (nname == "IMG" && myid == "loadingpic") { + items[i].remove(); + } + } + provisionStatBar.hide(); +} + +/** + * Set hash entry to 0 and check if all are 0. If so call + * removeProvisionLoadingGif + * + * @param division holding the gif and message, and hash, and + * key + */ +function checkProvisionCallsDone(provisionStatBar, table, finishedKey) { + + table[finishedKey] = 0; + + for (var key in table) { + if (table[key] == 1) { + return; // More to do + } + } + + removeProvisionLoadingGif(provisionStatBar); +} + +/** + * Load zVMs into column (service page) + * + * @param col Table column where OS images will be placed + */ +function loadzVMs(col) { + // Get group names and description and append to group column + if (!$.cookie('zvms')) { + var infoBar = createInfoBar('No selectable z/VM available'); + col.append(infoBar); + return; + } + + var zNames = $.cookie('zvms').split(','); + + var radio, zBlock, args, zvm, hcp; + for (var i in zNames) { + if( !zNames[i] || 0 === zNames[i].length) continue; + args = zNames[i].split(':'); + zvm = args[0]; + hcp = args[1]; + + // Create block for each group + zBlock = $('
    ').css({ + 'border': '1px solid', + 'max-width': '200px', + 'margin': '5px auto', + 'padding': '5px', + 'display': 'block', + 'vertical-align': 'middle', + 'cursor': 'pointer', + 'white-space': 'normal' + }).click(function(){ + $(this).children('input:radio').attr('checked', 'checked'); + $(this).parents('td').find('div').attr('class', 'ui-state-default'); + $(this).attr('class', 'ui-state-active'); + }); + radio = $('').css('display', 'none'); + zBlock.append(radio, $('' + zvm + ' managed by ' + hcp + '')); + zBlock.children('span').css({ + 'display': 'block', + 'margin': '5px', + 'text-align': 'left' + }); + col.append(zBlock); + } +} + +/** + * Load groups into column + * + * @param col Table column where OS images will be placed + */ +function loadSrvGroups(col) { + // Get group names and description and append to group column + if (!$.cookie('srv_groups')) { + var infoBar = createInfoBar('No selectable group available'); + col.append(infoBar); + return; + } + + var groupNames = $.cookie('srv_groups').split(','); + + var groupBlock, radio, args, name, ip, hostname, desc; + for (var i in groupNames) { + if( !groupNames[i] || 0 === groupNames[i].length) continue; + args = groupNames[i].split(':'); + name = args[0]; + ip = args[1]; + hostname = args[2]; + desc = args[3]; + + // Create block for each group + groupBlock = $('
    ').css({ + 'border': '1px solid', + 'max-width': '200px', + 'margin': '5px auto', + 'padding': '5px', + 'display': 'block', + 'vertical-align': 'middle', + 'cursor': 'pointer', + 'white-space': 'normal' + }).click(function(){ + $(this).children('input:radio').attr('checked', 'checked'); + $(this).parents('td').find('div').attr('class', 'ui-state-default'); + $(this).attr('class', 'ui-state-active'); + }); + radio = $('').css('display', 'none'); + groupBlock.append(radio, $('' + name + ': ' + desc + '')); + groupBlock.children('span').css({ + 'display': 'block', + 'margin': '5px', + 'text-align': 'left' + }); + col.append(groupBlock); + } +} + +/** + * Load OS images into column + * + * @param col Table column where OS images will be placed + */ +function loadOSImages(col) { + // Get group names and description and append to group column + if (!$.cookie('srv_imagenames')) { + var infoBar = createInfoBar('No selectable image available'); + col.append(infoBar); + return; + } + + var imgNames = $.cookie('srv_imagenames').split(','); + + var imgBlock, radio, args, name, desc; + for (var i in imgNames) { + if( !imgNames[i] || 0 === imgNames[i].length) continue; + args = imgNames[i].split(':'); + name = args[0]; + desc = args[1]; + + // Create block for each image + imgBlock = $('
    ').css({ + 'border': '1px solid', + 'max-width': '200px', + 'margin': '5px auto', + 'padding': '5px', + 'display': 'block', + 'vertical-align': 'middle', + 'cursor': 'pointer', + 'white-space': 'normal' + }).click(function(){ + $(this).children('input:radio').attr('checked', 'checked'); + $(this).parents('td').find('div').attr('class', 'ui-state-default'); + $(this).attr('class', 'ui-state-active'); + + $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').attr('checked', ''); + $('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').parents('td').find('div').attr('class', 'ui-state-default'); + }); + radio = $('').css('display', 'none'); + imgBlock.append(radio, $('' + name + ': ' + desc + '')); + imgBlock.children('span').css({ + 'display': 'block', + 'margin': '5px', + 'text-align': 'left' + }); + col.append(imgBlock); + } +} + +/** + * Load golden images into column + * + * @param col Table column where master copies will be placed + */ +function loadGoldenImages(col) { + // Get group names and description and append to group column + if (!$.cookie('srv_goldenimages')) { + var infoBar = createInfoBar('No selectable master copies available'); + col.append(infoBar); + return; + } + + var imgNames = $.cookie('srv_goldenimages').split(','); + + var imgBlock, radio, args, name, desc; + for (var i in imgNames) { + if( !imgNames[i] || 0 === imgNames[i].length) continue; + args = imgNames[i].split(':'); + name = args[0]; + desc = args[1]; + + // Create block for each image + imgBlock = $('
    ').css({ + 'border': '1px solid', + 'max-width': '200px', + 'margin': '5px auto', + 'padding': '5px', + 'display': 'block', + 'vertical-align': 'middle', + 'cursor': 'pointer', + 'white-space': 'normal' + }).click(function(){ + $(this).children('input:radio').attr('checked', 'checked'); + $(this).parents('td').find('div').attr('class', 'ui-state-default'); + $(this).attr('class', 'ui-state-active'); + + // Un-select zVM and image + $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').attr('checked', ''); + $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').parents('td').find('div').attr('class', 'ui-state-default'); + + $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').attr('checked', ''); + $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').parents('td').find('div').attr('class', 'ui-state-default'); + }); + radio = $('').css('display', 'none'); + imgBlock.append(radio, $('' + name + ': ' + desc + '')); + imgBlock.children('span').css({ + 'display': 'block', + 'margin': '5px', + 'text-align': 'left' + }); + col.append(imgBlock); + } +} + +/** + * Set a cookie for zVM host names (service page) + * + * @param data Data from HTTP request + */ +function setzVMCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var zvms = new Array(); + var hosts = data.rsp[0].split("\n"); + for ( var i = 0; i < hosts.length; i++) { + if (hosts[i] != null && hosts[i] != "") { + zvms.push(hosts[i]); + if (typeof console == "object"){ + console.log("Setting a zVM cookie:<"+hosts[i]+">"); + } + } + } + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie('zvms', zvms, { expires: exDate }); + } +} + +/** + * Set a cookie for master copies (service page) + * + * @param data Data from HTTP request + */ +function setGoldenImagesCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var copies = new Array(); + var tmp = data.rsp[0].split(","); + for ( var i = 0; i < tmp.length; i++) { + if (tmp[i] != null && tmp[i] != "") { + copies.push(tmp[i]); + } + } + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie('srv_goldenimages', copies, { expires: exDate }); + } +} + +/** + * Set a cookie for disk pool names of a given node + * + * @param data Data from HTTP request + */ +function setDiskPoolCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var node = data.msg; + var pools = data.rsp[0].split(node + ": "); + var pools2 = []; + for (var j in pools) { + if (pools[j] != "") { + pools2.push(jQuery.trim(pools[j])); + } + } + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie(node + 'diskpools', pools2, { expires: exDate }); + } +} + +/** + * Set a cookie for zFCP pool names of a given node + * + * @param data Data from HTTP request + */ +function setZfcpPoolCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var node = data.msg; + var pools = data.rsp[0].split(node + ': '); + var pools2 = []; + for (var j in pools) { + if (pools[j] != "") { + pools2.push(jQuery.trim(pools[j])); + } + } + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie(node + 'zfcppools', pools2, { expires: exDate }); + } +} + +/** + * Set a cookie for zHCP host names + * + * @param zhcps List of zHCPs known + */ +function setzHcpCookies(zhcps) { + if (zhcps.length) { + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie('zhcps', zhcps, { expires: exDate }); + } +} + +/** + * Set a cookie for z/VM user profile names of a given node + * + * @param data Data from HTTP request + */ +function setUserProfilesCookies(data) { + if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) { + var node = data.msg; + var profiles = data.rsp[0].split(node + ': '); + var profiles2 = []; + for (var j in profiles) { + if (profiles[j] != "") { + profiles2.push(jQuery.trim(profiles[j])); + } + } + + // Set cookie to expire in 60 minutes + var exDate = new Date(); + exDate.setTime(exDate.getTime() + (60 * 60 * 1000)); + $.cookie(node + 'userprofiles', profiles2, { expires: exDate }); + } +} + +/** + * Create virtual machine (service page) + * + * @param tabId Tab ID + * @param group Group + * @param hcp Hardware control point + * @param img OS image + */ +function createzVM(tabId, group, hcp, img, owner) { + // Submit request to create VM + // webportal provzlinux [group] [hcp] [image] [owner] + var iframe = createIFrame('lib/srv_cmd.php?cmd=webportal&tgt=&args=provzlinux;' + group + ';' + hcp + ';' + img + ';' + owner + '&msg=&opts=flush'); + iframe.prependTo($('#' + tabId)); +} + +/** + * Query the profiles that exists + * + * @param panelId Panel ID + */ +function queryProfiles(panelId) { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'tabdump', + tgt : '', + args : 'osimage', + msg : panelId + }, + + success : function(data) { + var panelId = data.msg; + setOSImageCookies(data); + configProfilePanel(panelId); + } + }); +} + +/** + * Panel to configure directory entries and disks for a profile + * + * @param panelId Panel ID + */ +function configProfilePanel(panelId) { + // Wipe panel clean + $('#' + panelId).empty(); + + // Add info bar + $('#' + panelId).append(createInfoBar('Create, edit, and delete profiles for the self-service portal. It is important to note the default z/VM user ID for any profile should be LXUSR.')); + + // Create table + var tableId = 'zvmProfileTable'; + var table = new DataTable(tableId); + table.init(['', 'Profile', 'Disk pool', 'Disk size', 'Directory entry']); + + // Insert profiles into table + var profiles = $.cookie('profiles').split(','); + profiles.push('default'); // Add default profile + for (var i in profiles) { + if (profiles[i]) { + // Columns are: profile, selectable, description, disk pool, disk size, and directory entry + var cols = new Array(profiles[i], '', '', ''); + + // Add remove button where id = user name + cols.unshift(''); + + // Add row + table.add(cols); + } + } + + // Append datatable to tab + $('#' + panelId).append(table.object()); + + // Turn into datatable + $('#' + tableId).dataTable({ + 'iDisplayLength': 50, + 'bLengthChange': false, + "bScrollCollapse": true, + "sScrollY": "400px", + "sScrollX": "110%", + "bAutoWidth": true, + "oLanguage": { + "oPaginate": { + "sNext": "", + "sPrevious": "" + } + } + }); + + // Create action bar + var actionBar = $('
    ').css("width", "450px"); + + // Create a profile + var createLnk = $('Create'); + createLnk.click(function() { + profileDialog(); + }); + + // Edit a profile + var editLnk = $('Edit'); + editLnk.click(function() { + var profiles = $('#' + tableId + ' input[type=checkbox]:checked'); + for (var i in profiles) { + var profile = profiles.eq(i).attr('name'); + if (profile) { + // Column order is: profile, selectable, disk pool, disk size, and directory entry + var cols = profiles.eq(i).parents('tr').find('td'); + var pool = cols.eq(2).text(); + var size = cols.eq(3).text(); + var entry = cols.eq(4).html().replace(new RegExp('
    ', 'g'), '\n'); + + editProfileDialog(profile, pool, size, entry); + } + } + }); + + // Delete a profile + var deleteLnk = $('Delete'); + deleteLnk.click(function() { + var profiles = getNodesChecked(tableId); + if (profiles) { + deleteProfileDialog(profiles); + } + }); + + // Refresh profiles table + var refreshLnk = $('Refresh'); + refreshLnk.click(function() { + queryProfiles(panelId); + }); + + // Create an action menu + var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]); + actionsMenu.superfish(); + actionsMenu.css('display', 'inline-block'); + actionBar.append(actionsMenu); + + // Set correct theme for action menu + actionsMenu.find('li').hover(function() { + setMenu2Theme($(this)); + }, function() { + setMenu2Normal($(this)); + }); + + // Create a division to hold actions menu + var menuDiv = $(''); + $('#' + tableId + '_wrapper').prepend(menuDiv); + menuDiv.append(actionBar); + $('#' + tableId + '_filter').appendTo(menuDiv); + + // Resize accordion + $('#' + tableId).parents('.ui-accordion').accordion('resize'); + + // Query directory entries and disk pool/size for each profile + for (var i in profiles) { + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'webrun', + tgt : '', + args : 'getdefaultuserentry;' + profiles[i], + msg : 'out=' + panelId + ';profile=' + profiles[i] + }, + + success: insertDirectoryEntry + }); + + $.ajax({ + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'webrun', + tgt : '', + args : 'getzdiskinfo;' + profiles[i], + msg : 'out=' + panelId + ';profile=' + profiles[i] + }, + + success: insertDiskInfo + }); + } +} + +/** + * Insert the directory entry into the profile table + * + * @param data Data from HTTP request + */ +function insertDirectoryEntry(data) { + var tableId = 'zvmProfileTable'; + var args = data.msg.split(';'); + + var profile = args[1].replace('profile=', ''); + + // Do not continue if there is nothing + if (!data.rsp.length) + return; + + var entry = data.rsp[0].replace(new RegExp('\n', 'g'), '
    '); + + // Get the row containing the profile + var rowPos = findRow(profile, '#' + tableId, 1); + if (rowPos < 0) + return; + + // Update the directory entry column + var dTable = $('#' + tableId).dataTable(); + dTable.fnUpdate(entry, rowPos, 4, false); + + // Adjust table styling + $('#' + tableId + ' td:nth-child(5)').css({ + 'text-align': 'left' + }); + adjustColumnSize(tableId); +} + +/** + * Insert the disk info into the profile table + * + * @param data Data from HTTP request + */ +function insertDiskInfo(data) { + var tableId = 'zvmProfileTable'; + var args = data.msg.split(';'); + + var profile = args[1].replace('profile=', ''); + + // Do not continue if there is nothing + if (!data.rsp.length) + return; + + // Get the row containing the profile + var rowPos = findRow(profile, '#' + tableId, 1); + if (rowPos < 0) + return; + + // Update the disk info columns + var dTable = $('#' + tableId).dataTable(); + + var tmp = ""; + var pool = ""; + var eckdSize = 0; + var info = data.rsp[0].split('\n'); + for (var i in info) { + if (info[i].indexOf('diskpool') > -1) { + tmp = info[i].split('='); + pool = jQuery.trim(tmp[1]); + + dTable.fnUpdate(pool, rowPos, 2, false); + } if (info[i].indexOf('eckd_size') > -1) { + tmp = info[i].split('='); + eckdSize = jQuery.trim(tmp[1]); + + dTable.fnUpdate(eckdSize, rowPos, 3, false); + } + } + + // Adjust table styling + adjustColumnSize(tableId); +} + +/** + * Open profile dialog + */ +function profileDialog() { + // Create form to add profile + var dialogId = 'zvmCreateProfile'; + var profileForm = $('
    '); + + // Create info bar + var info = createInfoBar('Configure the default settings for a profile'); + profileForm.append(info); + + // Insert profiles into select + var profileSelect = $(''); + var profiles = $.cookie('profiles').split(','); + profiles.push('default'); // Add default profile + for (var i in profiles) { + if (profiles[i]) { + profileSelect.append($('')); + } + } + + profileForm.append($('
    ').append(profileSelect)); + profileForm.append('
    '); + profileForm.append('
    '); + profileForm.append('