From 205f7b8ee518a8b00ebbd8b3f201e9dc559a4870 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 6 Jan 2011 17:36:26 -0800 Subject: [PATCH 01/25] bug 7744: selected_midmenu_id is not used in multiple-selection middle menu. So, remove the code. --- ui/scripts/cloud.core.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index a28af853528..a76998198da 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -980,14 +980,10 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json if(isMultipleSelectionInMidMenu != true) { $midmenuItem1.click(); } - else { - if(selected_midmenu_id != null && selected_midmenu_id.length > 0) - $("#"+selected_midmenu_id).find("#content").removeClass("selected"); - selected_midmenu_id = getMidmenuIdFn($midmenuItem1.data("jsonObj")); - $midmenuItem1.find("#content").addClass("selected"); - clearRightPanel(); + else { + $midmenuItem1.find("#content").addClass("selected"); toRightPanelFn($midmenuItem1); - //$midmenuItem1.click(); + //$midmenuItem1.click(); //$midmenuItem1.click() is not working in multiple-selection middle menu $midmenuItem1.addClass("ui-selected"); //because instance page is using JQuery selectable widget to do multiple-selection selectedItemsInMidMenu[items[i].id] = $midmenuItem1; //because instance page is using JQuery selectable widget to do multiple-selection From d2196d169e366717fb8fb3c98975683cde952656 Mon Sep 17 00:00:00 2001 From: keshav Date: Thu, 6 Jan 2011 17:45:44 -0800 Subject: [PATCH 02/25] Moved global lock inside storage cleanup method. --- .../com/cloud/storage/StorageManagerImpl.java | 183 +++++++++--------- 1 file changed, 91 insertions(+), 92 deletions(-) diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 0ba0d3f998b..73c90d14731 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -2006,18 +2006,7 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag try { s_logger.info("Storage Garbage Collection Thread is running."); - GlobalLock scanLock = GlobalLock.getInternLock(this.getClass().getName()); - try { - if (scanLock.lock(3)) { - try { - cleanupStorage(true); - } finally { - scanLock.unlock(); - } - } - } finally { - scanLock.releaseRef(); - } + cleanupStorage(true); } catch (Exception e) { s_logger.error("Caught the following Exception", e); @@ -2027,89 +2016,99 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag @Override public void cleanupStorage(boolean recurring) { + GlobalLock scanLock = GlobalLock.getInternLock(this.getClass().getName()); + + try { + if (scanLock.lock(3)) { + try { + // Cleanup primary storage pools + List storagePools = _storagePoolDao.listAll(); + for (StoragePoolVO pool : storagePools) { + try { + if (recurring && pool.isLocal()) { + continue; + } - // Cleanup primary storage pools - List storagePools = _storagePoolDao.listAll(); - for (StoragePoolVO pool : storagePools) { - try { - if (recurring && pool.isLocal()) { - continue; - } - - List unusedTemplatesInPool = _tmpltMgr.getUnusedTemplatesInPool(pool); - s_logger.debug("Storage pool garbage collector found " + unusedTemplatesInPool.size() + " templates to clean up in storage pool: " + pool.getName()); - for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) { - if (templatePoolVO.getDownloadState() != VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { - s_logger.debug("Storage pool garbage collector is skipping templatePoolVO with ID: " + templatePoolVO.getId() + " because it is not completely downloaded."); - continue; - } - - if (!templatePoolVO.getMarkedForGC()) { - templatePoolVO.setMarkedForGC(true); - _vmTemplatePoolDao.update(templatePoolVO.getId(), templatePoolVO); - s_logger.debug("Storage pool garbage collector has marked templatePoolVO with ID: " + templatePoolVO.getId() + " for garbage collection."); - continue; - } - - _tmpltMgr.evictTemplateFromStoragePool(templatePoolVO); - } - } catch (Exception e) { - s_logger.warn("Problem cleaning up primary storage pool " + pool, e); - } - } + List unusedTemplatesInPool = _tmpltMgr.getUnusedTemplatesInPool(pool); + s_logger.debug("Storage pool garbage collector found " + unusedTemplatesInPool.size() + " templates to clean up in storage pool: " + pool.getName()); + for (VMTemplateStoragePoolVO templatePoolVO : unusedTemplatesInPool) { + if (templatePoolVO.getDownloadState() != VMTemplateStorageResourceAssoc.Status.DOWNLOADED) { + s_logger.debug("Storage pool garbage collector is skipping templatePoolVO with ID: " + templatePoolVO.getId() + " because it is not completely downloaded."); + continue; + } - // Cleanup secondary storage hosts - List secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); - for (HostVO secondaryStorageHost : secondaryStorageHosts) { - try { - long hostId = secondaryStorageHost.getId(); - List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId); - s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: " - + secondaryStorageHost.getName()); - for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) { - if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) { - s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO.getInstallPath()); - continue; - } - - String installPath = destroyedTemplateHostVO.getInstallPath(); - - if (installPath != null) { - Answer answer = _agentMgr.easySend(hostId, new DeleteTemplateCommand(destroyedTemplateHostVO.getInstallPath())); - - if (answer == null || !answer.getResult()) { - s_logger.debug("Failed to delete template at: " + destroyedTemplateHostVO.getInstallPath()); - } else { - _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); - s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath()); - } - } else { - _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); - } - } - } catch (Exception e) { - s_logger.warn("problem cleaning up secondary storage " + secondaryStorageHost, e); - } - } - - List vols = _volsDao.listRemovedButNotDestroyed(); - for (VolumeVO vol : vols) { - try { - Long poolId = vol.getPoolId(); - Answer answer = null; - StoragePoolVO pool = _storagePoolDao.findById(poolId); - final DestroyCommand cmd = new DestroyCommand(pool, vol, null); - answer = sendToPool(pool, cmd); - if (answer != null && answer.getResult()) { - s_logger.debug("Destroyed " + vol); - vol.setDestroyed(true); - _volsDao.update(vol.getId(), vol); - } - } catch (Exception e) { - s_logger.warn("Unable to destroy " + vol.getId(), e); - } - } + if (!templatePoolVO.getMarkedForGC()) { + templatePoolVO.setMarkedForGC(true); + _vmTemplatePoolDao.update(templatePoolVO.getId(), templatePoolVO); + s_logger.debug("Storage pool garbage collector has marked templatePoolVO with ID: " + templatePoolVO.getId() + " for garbage collection."); + continue; + } + _tmpltMgr.evictTemplateFromStoragePool(templatePoolVO); + } + } catch (Exception e) { + s_logger.warn("Problem cleaning up primary storage pool " + pool, e); + } + } + + // Cleanup secondary storage hosts + List secondaryStorageHosts = _hostDao.listSecondaryStorageHosts(); + for (HostVO secondaryStorageHost : secondaryStorageHosts) { + try { + long hostId = secondaryStorageHost.getId(); + List destroyedTemplateHostVOs = _vmTemplateHostDao.listDestroyed(hostId); + s_logger.debug("Secondary storage garbage collector found " + destroyedTemplateHostVOs.size() + " templates to cleanup on secondary storage host: " + + secondaryStorageHost.getName()); + for (VMTemplateHostVO destroyedTemplateHostVO : destroyedTemplateHostVOs) { + if (!_tmpltMgr.templateIsDeleteable(destroyedTemplateHostVO)) { + s_logger.debug("Not deleting template at: " + destroyedTemplateHostVO.getInstallPath()); + continue; + } + + String installPath = destroyedTemplateHostVO.getInstallPath(); + + if (installPath != null) { + Answer answer = _agentMgr.easySend(hostId, new DeleteTemplateCommand(destroyedTemplateHostVO.getInstallPath())); + + if (answer == null || !answer.getResult()) { + s_logger.debug("Failed to delete template at: " + destroyedTemplateHostVO.getInstallPath()); + } else { + _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); + s_logger.debug("Deleted template at: " + destroyedTemplateHostVO.getInstallPath()); + } + } else { + _vmTemplateHostDao.remove(destroyedTemplateHostVO.getId()); + } + } + } catch (Exception e) { + s_logger.warn("problem cleaning up secondary storage " + secondaryStorageHost, e); + } + } + + List vols = _volsDao.listRemovedButNotDestroyed(); + for (VolumeVO vol : vols) { + try { + Long poolId = vol.getPoolId(); + Answer answer = null; + StoragePoolVO pool = _storagePoolDao.findById(poolId); + final DestroyCommand cmd = new DestroyCommand(pool, vol, null); + answer = sendToPool(pool, cmd); + if (answer != null && answer.getResult()) { + s_logger.debug("Destroyed " + vol); + vol.setDestroyed(true); + _volsDao.update(vol.getId(), vol); + } + } catch (Exception e) { + s_logger.warn("Unable to destroy " + vol.getId(), e); + } + } + } finally { + scanLock.unlock(); + } + } + } finally { + scanLock.releaseRef(); + } } @Override From c04ee3d85f0f06d065e637c2fc1e427f792ad673 Mon Sep 17 00:00:00 2001 From: will Date: Thu, 6 Jan 2011 18:11:01 -0800 Subject: [PATCH 03/25] Removing one more check for networkoffering.type --- ui/scripts/cloud.core.network.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.network.js b/ui/scripts/cloud.core.network.js index 79bbf7c649b..9bf4d9a937a 100644 --- a/ui/scripts/cloud.core.network.js +++ b/ui/scripts/cloud.core.network.js @@ -1122,7 +1122,7 @@ function bindAddNetworkButton($button) { var networkOfferings = json.listnetworkofferingsresponse.networkoffering; if (networkOfferings != null && networkOfferings.length > 0) { for (var i = 0; i < networkOfferings.length; i++) { - if (networkOfferings[i].type == "Direct" && networkOfferings[i].isdefault) { + if (networkOfferings[i].isdefault) { // Create a network from this. $.ajax({ data: createURL("command=createNetwork&name="+name+"&displayText="+desc+"&networkOfferingId="+networkOfferings[i].id+"&zoneId="+zoneObj.id+vlan+scopeParams+"&gateway="+todb(gateway)+"&netmask="+todb(netmask)+"&startip="+todb(startip)+"&endip="+todb(endip)), From df35baa165175044c838cad017f136f9e1f21810 Mon Sep 17 00:00:00 2001 From: NIKITA Date: Thu, 6 Jan 2011 18:31:12 -0800 Subject: [PATCH 04/25] New Custom Design for Cloud Console --- ui/css/main.css | 2 +- ui/custom/custom1/css/custom1.css | 367 ++++++++++++++++++ .../custom1/images/custom1_actionpanel_bg.gif | Bin 0 -> 381 bytes .../images/custom1_actionpanel_border.gif | Bin 0 -> 171 bytes .../images/custom1_actionpanel_hover.gif | Bin 0 -> 345 bytes .../custom1/images/custom1_adv_searchbg.gif | Bin 0 -> 326 bytes .../custom1/images/custom1_contenttab_ON.gif | Bin 0 -> 2073 bytes .../images/custom1_contenttab_hover.gif | Bin 0 -> 551 bytes .../images/custom1_filter_downarrow.gif | Bin 0 -> 340 bytes .../custom1/images/custom1_filter_uparrow.gif | Bin 0 -> 341 bytes .../custom1/images/custom1_header_bg.jpg | Bin 0 -> 623 bytes .../custom1/images/custom1_headerleft.jpg | Bin 0 -> 6729 bytes .../custom1/images/custom1_language_bg.gif | Bin 0 -> 848 bytes .../images/custom1_language_bg_hover.gif | Bin 0 -> 921 bytes .../custom1/images/custom1_language_icon.gif | Bin 0 -> 571 bytes .../custom1_leftmenu_contentselected.gif | Bin 0 -> 183 bytes .../images/custom1_leftmenu_expanded.gif | Bin 0 -> 1584 bytes .../images/custom1_leftmenu_highlighted.gif | Bin 0 -> 253 bytes .../custom1/images/custom1_leftmenu_hover.gif | Bin 0 -> 204 bytes .../custom1/images/custom1_leftmenubg.gif | Bin 0 -> 229 bytes ui/custom/custom1/images/custom1_logo.jpg | Bin 0 -> 4527 bytes .../images/custom1_mgmtconsole_logo.jpg | Bin 0 -> 5608 bytes .../custom1/images/custom1_midmenu_hover.gif | Bin 0 -> 368 bytes .../images/custom1_midmenu_selected.gif | Bin 0 -> 249 bytes .../custom1/images/custom1_midmenubg.gif | Bin 0 -> 476 bytes .../custom1/images/custom1_search_textbg.gif | Bin 0 -> 753 bytes ui/index.jsp | 1 + 27 files changed, 369 insertions(+), 1 deletion(-) create mode 100644 ui/custom/custom1/css/custom1.css create mode 100644 ui/custom/custom1/images/custom1_actionpanel_bg.gif create mode 100644 ui/custom/custom1/images/custom1_actionpanel_border.gif create mode 100644 ui/custom/custom1/images/custom1_actionpanel_hover.gif create mode 100644 ui/custom/custom1/images/custom1_adv_searchbg.gif create mode 100644 ui/custom/custom1/images/custom1_contenttab_ON.gif create mode 100644 ui/custom/custom1/images/custom1_contenttab_hover.gif create mode 100644 ui/custom/custom1/images/custom1_filter_downarrow.gif create mode 100644 ui/custom/custom1/images/custom1_filter_uparrow.gif create mode 100644 ui/custom/custom1/images/custom1_header_bg.jpg create mode 100644 ui/custom/custom1/images/custom1_headerleft.jpg create mode 100644 ui/custom/custom1/images/custom1_language_bg.gif create mode 100644 ui/custom/custom1/images/custom1_language_bg_hover.gif create mode 100644 ui/custom/custom1/images/custom1_language_icon.gif create mode 100644 ui/custom/custom1/images/custom1_leftmenu_contentselected.gif create mode 100644 ui/custom/custom1/images/custom1_leftmenu_expanded.gif create mode 100644 ui/custom/custom1/images/custom1_leftmenu_highlighted.gif create mode 100644 ui/custom/custom1/images/custom1_leftmenu_hover.gif create mode 100644 ui/custom/custom1/images/custom1_leftmenubg.gif create mode 100644 ui/custom/custom1/images/custom1_logo.jpg create mode 100644 ui/custom/custom1/images/custom1_mgmtconsole_logo.jpg create mode 100644 ui/custom/custom1/images/custom1_midmenu_hover.gif create mode 100644 ui/custom/custom1/images/custom1_midmenu_selected.gif create mode 100644 ui/custom/custom1/images/custom1_midmenubg.gif create mode 100644 ui/custom/custom1/images/custom1_search_textbg.gif diff --git a/ui/css/main.css b/ui/css/main.css index 36c97b229bf..25225cc553c 100644 --- a/ui/css/main.css +++ b/ui/css/main.css @@ -299,7 +299,7 @@ a:hover { .vmpopup_container_closebutton { width:13px; height:13px; - float:left; + float:right; background:url(../images/vm_closebutton.gif) no-repeat top left; margin:8px 0 0 0; padding:0; diff --git a/ui/custom/custom1/css/custom1.css b/ui/custom/custom1/css/custom1.css new file mode 100644 index 00000000000..82215920360 --- /dev/null +++ b/ui/custom/custom1/css/custom1.css @@ -0,0 +1,367 @@ +@charset "UTF-8"; +/* CSS Document */ + +#main_header { + min-width:980px; + width:100%; + height:44px; + float:left; + background:#b84634 url(../../custom1/images/custom1_header_bg.jpg) repeat-x top left; + margin:0; + padding:0; +} + +.header_left { + width:309px; + height:44px; + float:left; + background:url(../../custom1/images/custom1_headerleft.jpg) no-repeat top left; + margin:0; + padding:0; +} + +.logo { + width:80px; + height:37px; + float:left; + background:url(../../custom1/images/custom1_logo.jpg) no-repeat top left; + margin:0 0 0 8px; + display:inline; + padding:0; +} + +.mgmtconsole_logo { + width:157px; + height:21px; + float:left; + background:url(../../custom1/images/custom1_mgmtconsole_logo.jpg) no-repeat top left; + margin:15px 0 0 9px; + display:inline; + padding:0; +} + + +.language_dropdownpanel { + width:103px; + height:19px; + float:left; + position:relative; + background:url(../../custom1/images/custom1_language_bg.gif) no-repeat top left; + margin:-3px 0 0 8px; + display:inline; + padding:0; + cursor:pointer; + cursor:hand; +} + +.language_dropdownpanel:hover { + background:url(../../custom1/images/custom1_language_bg_hover.gif) no-repeat top left; +} + +.language_icon { + width: 13px; + height:12px; + float:left; + background:url(../../custom1/images/custom1_language_icon.gif) no-repeat top left; + margin:3px 0 0 5px; + display:inline; + padding:0; +} + +.language_dropdownbox { + width:101px; + height:auto; + position:absolute; + background:#a44031 repeat top left; + border:1px solid #d87d58; + margin:0; + padding:0 0 15px 0; + top:17px; + z-index:1010; +} + +.leftmenu_panel { + width:221px; + height:100%; + min-height:1025px; + float:left; + background:#f3f3f3 repeat top left; + border-right:1px dotted #262626; + border-top:1px solid #FFF; + margin:0 0 0 -100%; + padding:0; +} + +.leftmenu_list{ + width:100%; + height:auto; + float:left; + margin:0; + padding:0; + background:url(../../custom1/images/custom1_leftmenubg.gif) repeat-x bottom left; + border-bottom:1px dotted #333; +} + +.leftmenu_expandedbox{ + width:100%; + height:auto; + float:left; + position:relative; + background:#9fa983 url(../../custom1/images/custom1_leftmenu_expanded.gif) repeat-x top left; + border-bottom:1px solid #FFF; + margin:0; + padding:0; + overflow-x:scoll; + overflow-x:auto; + overflow-y:hidden; +} + +.leftmenu_content_flevel.selected{ + background:#8a8a8a url(../../custom1/images/custom1_leftmenu_highlighted.gif) repeat-x top left; + border-bottom:1px dotted #333; + font-weight:bold; + color:#FFF; +} + +.leftmenu_content_flevel:hover{ + background:#f7f7f7 url(../../custom1/images/custom1_leftmenu_hover.gif) repeat-x top left; +} + +.leftmenu_content:hover{ + color:#7c8559; + background:#919b6c repeat top left; +} + +.leftmenu_content.selected{ + color:#FFF; + background:#b6b6b6 url(../../custom1/images/custom1_leftmenu_contentselected.gif) repeat-x top left; + border-bottom:1px solid #666666; +} + +.leftmenu_secondindent{ + min-width:180px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 30px; + display:inline; + padding:0; +} + +.leftmenu_thirdindent{ + min-width:160px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 50px; + display:inline; + padding:0; +} + +.leftmenu_fourthindent{ + min-width:200px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 70px; + display:inline; + padding:0; +} + +.leftmenu_fifthindent{ + min-width:200px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 100px; + display:inline; + padding:0; +} + +.leftmenu_sixthindent{ + min-width:200px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 120px; + display:inline; + padding:0; +} + +.leftmenu_domainindent{ + min-width:180px; + max-width:auto; + height:auto; + float:left; + color:#333; + margin:7px 0 0 30px; + display:inline; + padding:0; +} + + +.actionpanel { + width:100%; + height:27px; + float:left; + background: url(../../custom1/images/custom1_actionpanel_bg.gif) repeat-x top left; + margin:0; + padding:0; +} + +.searchpanel { + width:223px; + height:27px; + float:left; + margin:0; + padding:0; + background:url(../../custom1/images/custom1_actionpanel_border.gif) no-repeat top right; + list-style:none +} + +.searchpanel_filterbutton { + width:16px; + height:16px; + float:left; + margin:5px 0 0 4px; + display:inline; + background:url(../../custom1/images/custom1_filter_downarrow.gif) no-repeat top left; + cursor:pointer; + cursor:hand; +} + +.searchpanel_filterbutton.up { + background:url(../../custom1/images/custom1_filter_uparrow.gif) no-repeat top left; +} + +.search_textbg { + width:186px; + height:16px; + float:left; + background:url(../../custom1/images/custom1_search_textbg.gif) no-repeat top left; + margin:0; + padding:0; +} + +.actionpanel_button_wrapper{ + width:auto; + height:27px; + float:left; + margin:0; + padding:0; + background:url(../../custom1/images/custom1_actionpanel_border.gif) no-repeat top right; +} + +.actionpanel_button_links{ + width:auto; + height:auto; + color:#333; + font-size:10px; + font-weight:normal; + text-decoration:none; + float:left; + margin:7px 11px 0 5px; + padding:0; +} + + +.actionpanel_button:hover{ + background:url(../../custom1/images/custom1_actionpanel_hover.gif) repeat-x top right; + color:#FFF; +} + +.midmenu_panel { + width:221px; + min-height:1000px; + height:auto; + float:left; + position:relative; + background:#fdfaf0 repeat top left; + border-right:1px solid #aeb9c5; + margin:27px 0 0 -100%; + display:inline; + padding:0; +} + +.midmenu_list{ + width:220px; + height:auto; + float:left; + background:#fef8e5 url(../../custom1/images/custom1_midmenubg.gif) repeat-x bottom left; + border-bottom:1px dotted #333; + margin:0; + padding:0; +} + +.midmenu_content:hover{ + background:#f6efce url(../../custom1/images/custom1_midmenu_hover.gif) repeat-x top left; + color:#333; +} + +.midmenu_content.selected { + background:#b6b6b6 url(../../custom1/images/custom1_midmenu_selected.gif) repeat-x top left; + color:#333; + +} + + +.tabbox { + width:100%; + height:auto; + float:left; + margin:0; + padding:0; + border:none; +} + +.content_tabs { + width:101px; + height:27px; + float:left; + font-size:11px; + margin:0 0 0 0; + text-align:center; + padding:6px 0 0 0; + display:inline; + +} + +.content_tabs.on { + background:url(../../custom1/images/custom1_contenttab_ON.gif) no-repeat bottom left; + color:#FFF; + border-right:1px dotted #333; + + +} + +.content_tabs.off { + background:none; + color:#333; + cursor:pointer; + cursor:hand; + border-right:1px dotted #333; + + +} + +.content_tabs.off:hover { + background:url(../../custom1/images/custom1_contenttab_hover.gif) no-repeat bottom left; + color:#333; + cursor:pointer; + cursor:hand; +} + +.adv_searchpopup_bg { + width:100%; + height:auto; + float:left; + background:#777777 url(../../custom1/images/custom1_adv_searchbg.gif) repeat-x top left; + border-bottom:1px solid #2d2d2d; + margin:0; + padding:0 0 9px 0; +} diff --git a/ui/custom/custom1/images/custom1_actionpanel_bg.gif b/ui/custom/custom1/images/custom1_actionpanel_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..897a2219a80d0d709fdc49ff339ad4c6134f07e2 GIT binary patch literal 381 zcmV-@0fPQVNk%w1VF~~n0M!5hpP!$QkdT#?m9Vk0n3$N8lar>VrlX^yt*)+&jEtL` zn~si-sj8~FyuP!ww#UrRyuZQ1#>l_J#kRP)%Fxuz)!NL|*~7`q%hJ}w$;`;k(aY1= z$j;KWxVg&G*38x0%+uM+($~z>*vr(}vbDCy&e6)y)ydG*%hcM;)Y`(v$-ctH!NthF z!^OtS�=Z#L3Oa&C$We$h*G5%hK4()!Mwj!oS1D$IQ^n)7iPaz5oCK0000000000 z00000A^8LV00000EC2ui015yb000J>z)z)CDGEQR+-PZOrkWs-Xd|L+Hd0K;Uh^>pUGTc7kw%b5i*2_EE0-}EfOmdHxQB#Hj*=v zIt`ken-d)qprIWd4y7ce4yO(StgWsHu(7fXv|Ww`|$6 z*|TTwKYaAWxr>L6o#^Z9+qq}ou08vXpE-Z((zR_nc5c|X`OM`TXD;77ed*e<)8{vA z+_Y`SE(Ro^_>%?9(*cnnI~iCt9vE;mmHJ8unE0x#>^p3b#S%C>D${e378jG_)(9Cs PEtW$G6*gS00u0swq}xml literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_actionpanel_hover.gif b/ui/custom/custom1/images/custom1_actionpanel_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..77378ff5c948d3c98890847cafe4cff2a1e871a4 GIT binary patch literal 345 zcmZ?wbhEHbWM`0OxXQp#RaI49Uf$HyR99D5Q&ZE@($dr0+uq*3_u!EU6DCfZHht!- z*-4Gj$y6%`w|ZeO}$)uN@#cI@7_a`oCd^X5;QGIh(2-MjW3oWF4Kn)MskZ`!hE z{igW~m+ahkaPyAclcr2tx?=VEOsc5!ZD!!xww;f0*KS5f25SJiH-lIJ literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_adv_searchbg.gif b/ui/custom/custom1/images/custom1_adv_searchbg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9afafc9ce12b1eafb0b54a3cff2580dc1a4a0b65 GIT binary patch literal 326 zcmZ?wbhEHbWMc4TxXQp#US3{RRaH?@QC(dtE+4F?Aa41 zPOPo1t*fhRXlR%=ZQ7hUb7st#F>BVW=H}*w3l~n9FrlWVX71d%?d|Qoy}dm>Ju_#{ zY;A4r=;)}guWxH>>+J08?(UvEdGh@E^ZWYxrcRyO*w{E}(xm?W{wY(YG&MCfG}JRt z02F_+fOYGDNRXcx*peN%jyjn1xV1ldSk&ks642_h>86WPi_XK38dHNbC%!0&njt=w zi_29h)kw-$W6BD3hXsD@%|B}_WH_2QgoU-V)YSO8wdLe^C-6)X6Jwsn%s7*gbq*`j Td?toPi@TpJQyWJys`Dx`?XrLdX%P&Vn!HJWQcH@`nFz3B$9XV=5Yv&)tPuOjVB}^V%@Xnk#0^!I8B8+&Lv~`e=2y42iVQVxH0@~*scUP72ma4Ex+(s@1f4(nXA?kDL{wE(GgVU~t63$Rl1LdzWYzRkRZ~+dtGtv)53`;m z<)l9>$}Z1NEyznRN-0Tx{pcn65FBO#KLk5;$OHy!ZR%+2fHyUFcD8p>yIR_*)K-%Z zU9BJb##%qpO~yJq#^2LvZ9^k)6B!w62?=W%iPgo`AK!i~e-o^&ZwiDUdR*-$%Dt`%{`R2O9 z+`C5?wF3WTqsZ$&fr9)SYP;@3FGZd?rCfd0%IT#=nrUZh#7Wm0r+UMK7k@j` zm?tdDfFIoS5h?1PFSLBD-|k+Xf!JenEC=4(TAq8c8`qZ)aS`)XhQK&?3Vk)`FP~nd zNP%TTn$s!@!z$W*3voOTt>XKiJt~T$L0j|1-n|a*C?UK$klf)~ihsEgjtDM)5=LJr zJ4}ZMyvVrRUiGrTE#_o-?yI_m%5vZ81?j@i6#o}_UD78j^dkZTU%axXC5S5?#&tux z)?$Fy-O|&GbsYklc-^pVolZmFuJlsWz#laZLv1QJ7g7a}_6;7-#hV)6A6tA=| zS?jEddW43xder0o6m#&wRz327#zhWjNKRibY*6PTrC~_3ytZNBXl2LR(3uY(!bUFh zYkO$Ns5^~=m-r@Rx?W@P&rgWT!xmuFa~N4xtC-#`g&NLkV0aEd4JO=&Igt}LGG>Sq zXp~$eBQU2Viixra-e9;5ct?&$g~v6`_@J*`oJ31H_J}LbIpF1$G)-H1iArbi^2w-G zJk(rsRLILW#^CwNF3+OBrf6jv@zMzL(ef22++|(~VHeNSbb*UWy%{qFNi{md2;W7nH8V zE|J;487c|V)*P_v4qRg3zPWthDoJIB0^5_3VR$scT7XF>blv%wX95WP4$g}1Y7whPa<>6B|SOU?B}yZnK2B$OfDr+rN9X| z3k6PHpwMiq74tw2pwmbjJGWD%d9|@Gftyt{7us50RsV6l+l6A-it`249e2(V3WvR# z74rrdclPXo5dnxdAokDit8I{y?iTODsOvVKz`ue@NP@N_ghSBiatoNmDLWT3#p3sL_tD^2$XPQIY=FI#0TiK)IAtNIyfXtC!(cHfAA6#6JN|_%02}w!DEwu*oi^lBQ+ISs2es$m40mkV$<+@a4t&a*d zNqa}X7+cWmqh-gUb>&H8g!9UpL9Edjw|W;<9TlT(*5{{DuU!T~0jP{gH~<*`4RjFA AY5)KL literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_contenttab_hover.gif b/ui/custom/custom1/images/custom1_contenttab_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8bf1abbdf0a415aa00d25b37940cb2618106e9a GIT binary patch literal 551 zcmV+?0@(dWNk%w1VPyaz0J8u9|NsBe($dq@)7skF+1c6H*x1$8)zs9~*Vot9*4EqG z+x`9h-rnB!_V)Mp_u$~*A^8LV00000EC2ui0A&Cn000F4P^mHLuvE&sXXl!hg`QYu zV|tDo8eZ@#!gOulc&_h!@BhG{aQGt(j07W0sazs!%^Q+=)J2__=QLU6UaPcia!f9p z&*-#z&2GEj@VI=gE|Ben0zR*|`}==@e0q6CmY0~Bnwy-R zfCvQ$pp~Gbo{puTmZ_n7sjRM?ucEZIwzs&sy1Tr+zPt$t3B#hqwZX^5$hgb2&BD6R z(#5vV$JW=w+S}aS-rwNi;^XAv2IuF)2I}hx>*?C)=1#Ld zpS*(z6DnNDu%W|;5YZh-I8kCngcC2yJD|}3M~oEIJ1Xo*(j&-?98;=X$+D%(moQ_> zoJq5$&6_xL&J=J!fX|;mdHU=b^e0iEM2{vddUUAMqC%faH5#=lRj63AYTe4UtJkk! z!-^eCwyfE+Xw!ZT;FE1zr~%vxa4VPYPrE?z&fR-AZcw>*-)fCZxUk{Fh!ZPb%($`R z$B-jSo=my2<;$2eYu?Pcv**vC7Xuhgy0q!js8geMU_dd01*&7qo=v;9ZPTm~zrM}8 px9{Ho8niCF8@Tb~$VUq&Ts*n+=eCzOhfcjZ>IM&BTkjnK06Sb4HoE`- literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_filter_downarrow.gif b/ui/custom/custom1/images/custom1_filter_downarrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..35bc3330338c82a1138f516300d07c47785ddf30 GIT binary patch literal 340 zcmZ?wbhEHb6krfwxXQp#R#sMATpSx48x|H85D?()?d|I7T2N5n;NW0mW0RAUlb)WQ zl$3Ps+O_M~ub((~Y4+^dJ9g~o>*=39eR@__R&Q_b)Tz_9ZQB-~kXT+`K4HRyuFmc$ z(`TlnrA?VKW!kjqsi~=Tb#-p;?)mxoSFc`Ov3l*A4V!Ml0i{y)gsBo@&eN977GbDGFSrucByo9 literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_filter_uparrow.gif b/ui/custom/custom1/images/custom1_filter_uparrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..264da97f4949ba323747c5a6d905a4cf392cb922 GIT binary patch literal 341 zcmZ?wbhEHb6krfwxXQp#R#xWi?Oj}4Tu@LD78Vu|5a8fqoI8yjn5W0Rhqo|Kf7 zlaq7s;KA$HuO}xbZ{ECl_Uzdw&Rv{3b()u#*NWBay1Tn)&6?%r?mlVKq%|8h#U~^t zr=_*FwqCn-Ej2Z@tFt>HA>qJ*1MAkUD=#nKwf|s$&x9K{Zd6xS*VNR+$H&*z)lHi= zeaiG%3}gYtpDbW~Iv^6{CkD162TyHB9Vy}2lU#~3tmgaqv?i~JS|9F}aQbZ(bL)l* zA3cF{FSg8T$k^>H*>UP^+>N*V-H%x+b?nNynwn(g_}Z15n|OM7G?aKJP89FuVV*u? p<}7BWx%1{PU}9LjWa%;n&E=~Yw1rnMR#~DWsIY#CnxG?tH2~=#cY6Q; literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_header_bg.jpg b/ui/custom/custom1/images/custom1_header_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2902bf6e53c2112b6b5e5b46620fce48e8daff9f GIT binary patch literal 623 zcmex=C5UDGKfoZ!!Jxyy$IK|mz$D1XEXer(2tx-0 z1JEp>E8&2Vjft6+or95)fr*(BE(&C@ure}nG7B&;F|aZ-F>%ABfTk%LG6^|~hz1%d zIVDb9c=6%KBxYe{7oaVSj4Z6Y2tx!JnG_9$MFJBGn^ZnHHf}ulP>9*Nd9jOX%Kuvo zJV4u+1epaH>=|Cp{o9$QCbGxp$uSo*^_Rwd`7Srj@5;8P6@4{$zcyddDKpBzD_>P= zw<*t_h2nLBJ2F%8m~T4P!G-UoGf75tGYsubJJUPi+&=jEQyUh{n7)T%NaYgq{4C~3@;@5KM33VeD?0_@T}9XO1k4u6>OaM;?e%ePqhAW g|K7dj)`JP_c2+0npQu}P*Z7$Jiof?_-~7J`0GK(g$N&HU literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_headerleft.jpg b/ui/custom/custom1/images/custom1_headerleft.jpg new file mode 100644 index 0000000000000000000000000000000000000000..570bff9fd4b18b861174eeb995acf3d6022a5960 GIT binary patch literal 6729 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 YFxAtUeI*%>a@@donNzPrzlUG{0Sym)RR910 literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_language_bg.gif b/ui/custom/custom1/images/custom1_language_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c668e733e35f1ecb44097da6fd32be54571dec7 GIT binary patch literal 848 zcmZ?wbhEHbOlJ^gxXQq=%t3d#quz1{y<4>*x9fl?beV(R?b?vt5w7*Ug&X196TwN&;?I2d{E9xD@YlE!+EIq|?pPz?-E3`(o{{XM3-8GrFGZ zb1m2RR!zvIIG5FKhSzhv_s2Qht_fc2Zgerq=|-{tt(xGgS>6oP0E$0Zz{co+NRXcx z*#0}PKi{Om!_{(d;sh71-ZPAhp0#TH{wYCHQ}uSbKfe;aAc&tm?dR$#PTVgyetdDT zMP?Rbin0L9FGfa&=DJ3P#(JifrsnqEy1w3)zS^$ddWME+Gn;$n_RpW$(bLwiBEYO6 zsMNQlaoW5&8zwdNOqj8LM(vz+6T0fRE@`iudT8F(x$74&Nva7c%$&XZ=z-IlXYFa4 z(B8Ij4%?zbYj5wrv~}~GJKJvwE3-`8a&r2;$t~M2Z`*f#?(WXDhxdCa{{GS(?-+NH zLE_=I7n8LEc+Ly14qp{&;PanPQo!6NVO#N61+B*^F4Fr0PWl}CeB5{TX{YIzSerF9 zQ#Q;H{(5qXt2ft?{}U#2^)2emS+t_WRGsx!hfm~Ah6gFRo0n$KRQIr}bzS3j@W^17ZyVri58>UbjCgosyaOp|MZ6~hZ zOJ-a6rOTv?=RyOMvTVxqwq(bOTwhgf-KLAhg13S%yT0Hs5jNm5`EZb#Lq$M7`;DZK zXz=68=4p`&3(_YU1qilJj*x$Q#Dj^$#(|Mptfat6#N&vetFYIKKvv;o55eOy0h0os jiWTH+Jj#&S@bQRXT*^;X@d%5=Rw?d~048Qf1_o;Yr0!Vm literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_language_bg_hover.gif b/ui/custom/custom1/images/custom1_language_bg_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec770413b9785870289018a30b416e36271438d8 GIT binary patch literal 921 zcmZ?wbhEHbOlJ^gxXQrLp)cQ|FV|@x-(etst2X3z9T0`yt_`_a6MVhUccQuK3SX0( zB>}f;f^XG?oC~ns5NdHL-sNJX)3sdR>semcvc0cmdG(kmZ3wmOF;?m~Rl1(zy~soV zc1>`!D2oOXZeEES}iulJJq#0O)K8hm z$kf%*IB{-s)1`bWJwtnzkeT`3KyPe0Lx!$1$!Vdo(|L*&{=4fZ~sv=%}Bd5sXMTQl-n?K)mJogp|7>^`7_KSy>tmSaoBaxATS_zE?`rDonc~`ETf1{V!`JV#^cG$? z7US*Cx<$b1bMFzsu(K>zI7L?-cp~7k`$v0Z>-vX>woS`k#G>XOtHt?6J|-$MA|{JX z!AZXC$b`d_R1K82omP|m+Z;2D#Px<$SxHiv4BM+t3}ause4G)F_B4j U8&?PxDOkBOi#9B95@4_f07?gZYXATM literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_language_icon.gif b/ui/custom/custom1/images/custom1_language_icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4ac50fc4f943183a3b645cdc50e422c78cbab4b GIT binary patch literal 571 zcmZ?wbhEHbnj&d^)|n~e&yb_4Idxed2!+7+iO=YFPMIB$ENes zdcHh)cy?0f$?p2c`*+-)UH{?1t%v)zy}o>QwU_1BH!p5)Ty=i>l&wjgAMW42wq)*_ z0NZ=pH>`BkySjMxg_#r2PwTqSQSfNrj<+{1J=nSR_WBi<8j|mAUUR&&{>JM0kM{3+ zv~T;%b0@yNdU1JT;m3z}4>ndjJ$mrX_Nk})o1dRJa&zs{!?ihYuAIL(XYz-;w=XT2 z_2$~8_qVRUxq9j4`IC93s@a=qGX~1K3Nx~CFmMLRa54z0Gq^GGDKdC#F~o*jic4^_Gc)NMF*5KdFj_Mi nGlVeMFnnUvo6xc1LxMA-h|a&>56czZCi6tH`7#P{FjxZs-=p$d literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_leftmenu_contentselected.gif b/ui/custom/custom1/images/custom1_leftmenu_contentselected.gif new file mode 100644 index 0000000000000000000000000000000000000000..5a631e83b8a52c27311734f23167d069fdd3dd1d GIT binary patch literal 183 zcmZ?wbhEHbWMdFzIKsfNZQHh+H*fCTx%0q*1KYQ6-?wky(W6KI|Np;d&z{SdFW%KgA~<~8|$4zw3oXh?CNP)RyjVllsI#T3W2LhB+L%1&QxV_>ib0Cguw ATmS$7 literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_leftmenu_expanded.gif b/ui/custom/custom1/images/custom1_leftmenu_expanded.gif new file mode 100644 index 0000000000000000000000000000000000000000..be340094672f55a670a850b7d64feac0307a6150 GIT binary patch literal 1584 zcmd^8`%lw%6#YUAQh64t>zGauwjdH^%1lv^f+BRHvWfB-YH<)nks%Lp*zfoI`L-Jr zMMMSW0u1N_`hLG3w6vuZl*yFIROUc4-J&xvjBb&{)%_d0Ik~@_oO{o`$;qPaq9m6P zplaw91oexUeL}2XgmJ`7feH*Nfk*@Tg_zL|4=4avit*(@r~zgVtQ|(hI$-j^TnUpS z!Ngj?m0$)ptargYDaMmwS_fH3Du9lmT^Wcnj$qIDl2-q`v6Y{WJa{2ev4%s7J7viRO^HXm6*(g z45|R5X@}H^a-~d}0oB-1j=Z$FW1rLjB<53CD@~#Y0__Qf1vQR-r5ZxjUf2+!7MR@d zx7;GW0!a0MCu3?Hh{Rl}w$+?#%1~L6lV?8G*ieZM<;pOL0q7jC(uzv;h{A#>tcXMh z)ON%;+R!7S>s+vE2$5S5jUB;Sv-M6`>p=N(Ol7MUXv^6h`($RsGz!ZtXbqa8vLRXr z(k(n9^jb0_ZC!ahIS^~TpFs>RMCYnEjW%?Pj>t?XS6;@Emr0F?NDDeSg`M0&W-Co) ztKmtR?DoCgBD&m!sJ(m5$hpQ0fu{Uq{T6`+D6FW?fpl_qe2ZP(WAx@hR$_HIpp=pG>*W08CHXAQw||gbEVRP$c)~xC{K=YL|9w*0qB2I z(f{E8yEWl$f13#?;0<)LRG3~)55_hgo)TV7EQzP3HWW9XEqfRlL!OSib-Xm28@=P9 z%ja&k`~AJjQb7{Ik4TDZ4%fP3JuUC1x89f?ew57)%h(=BShq7S^a?Gz#euPS*&Xqj z2h;0LjEr|>9{jbSu-137S&1B%{?i=;LrYO@nxwn(573B+cYCfQoS#$RyZ)p0FlS>VvXDvcWH0oSkIwcj3!%gk8=EPUM8fLw zSR%J&%@mn-@e*S`Ag=n^?087(a|JGt736SSmaZbOqPPDIIj?M=q~e11@1n7;QcDT` zVRX<>2;+oBe@Hx3n?6ALtO9#X{9Lil(Up}_v2B;y=vGzA0H*R6vx>|NPi7n7$)tX+3geaPHt3U45_#e z-~(coSopLgiQN(IS)Yz4?WZpIlk;=Z-Nf7|`>2AEV25xOiNF)nYr#CRy)&D})?Ess zLeNxk4Mf3Jfr;e%&uV_4tf4O6NP85dxw$hm^~H^>n2VYp)21zp6FE;Uo2T+_TaxZ< zjhIkR)7GTc-7E^+^Kv3%x3q3LXCu6Lr|3ya-L1^`tXqD`v;A2&b1px)r~YPPZ|bXi LV0|!^3T^urXNjBI literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_leftmenu_highlighted.gif b/ui/custom/custom1/images/custom1_leftmenu_highlighted.gif new file mode 100644 index 0000000000000000000000000000000000000000..e724225936728dd1615f92943034aabcdb1257c2 GIT binary patch literal 253 zcmZ?wbhEHb6l9QMIKsf-?d=^L99&RP(A?admX=msT^$`AT~Sfd*47puA0H7B5f&Df znVDHqQsV3D+tt;Tl$4a4n_FLB@9*y)7#Qg1?;jKt#DE(p{$v45>VQa)oeZp13JQHG zne#GMt;^YMRiJbJL(2V%*4rWXqxU5kIOs_AA89Q*nWH6oVMPg-X~g;)YfKNmt=b>c zQQ@Q4&G}+WRd3pk`yX~#JFUO{zNE44{QK9^4UJ9B4eV|09i45gJ-vPXJwlTvPnkN2 bdB)6HvuAM3o4;V;JpLt1mn~nS$Y2cs)@@!f literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_leftmenu_hover.gif b/ui/custom/custom1/images/custom1_leftmenu_hover.gif new file mode 100644 index 0000000000000000000000000000000000000000..74bb0bb96ad91ee01becd78194fbc9cf7df738a4 GIT binary patch literal 204 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 literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_mgmtconsole_logo.jpg b/ui/custom/custom1/images/custom1_mgmtconsole_logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6598db09dbe698d31c047e1b821cd259e5b3229e GIT binary patch literal 5608 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 literal 0 HcmV?d00001 diff --git a/ui/custom/custom1/images/custom1_midmenubg.gif b/ui/custom/custom1/images/custom1_midmenubg.gif new file mode 100644 index 0000000000000000000000000000000000000000..61c908f249310f76a7452f026aa7cf4dc8153959 GIT binary patch literal 476 zcmZ?wbhEHb}K&eMOt-~IaqwB^PBpHKb*)%<+HKmkzv z$pY4`10q3wVqp7upjE(tCB}ujVG@UfUgz}FPN!nxm>L?)PP2w6M76afc99(i<;0sG*6{BQBOMOFAS0fh-KNpt*OYh_fy$Ta1H}W%!@z3L* z!@P)j@v>!NbH&)%nb)pcx@OZlcCNMC6qhn9a_!o z7&_cgBo*C^w2)MO0+I(Hs9YwBN8|u+RL*AqLf^yp_C0+!($f+W^Z9@uunGVkkEf`p z$nADB7z~%orP1k`Os3Q6oSsz|7Z-1DZyy{Suvjb_jmBoP%gV}@mX^d~abshn)oOJ( z9OIL+j*d=+QbniJDHMv)Xf&J6GMQ|De}8#-nM$Q96bifDzP`RbI4l$l{1}z~luD(0 zdwZZ*va_?(*2b186k`*U8r>X!KrlaV;Bvb`5EKXmTU%SbUwFGV+l*T6a=Udp{fJ1+ z<#J0(O5`$md3m`=B$A9u1{Qb^2CT zt5&O<)o2$Nm-_qro12;K?VPTzE(W7XC=_zLxO_ez1VzAqfIWcytD_Hn_yj0q&b`xeGdMXTorpld zyuJ_cI|qk`g&bIXaPY0b=s4ot3((`xtEa%}nOQaIY+zti8WCFvF&dLpn%|~BG_S;{ z$Qm@#7afZBg*@|Gb2weZ^JmH<{3Ebxpnh=gW9R?)lU&AAg zMUuiANqAIjUo30^PfP`TFu1X%d(V*#aeV~>*c7Cy3ikAgGA!eDHYPOoNVxXmIUxl& zfx$HA@uUH$gu#?7)j|psi}Np~W_&f{yn><=vR)afc=)Bv_yTP#1gr)gNI(73*H%Fh zJ|U&qEw@h+?jwSVq{;B3hS9Y*u)@bJy@Uum25DMI8L60{rlJCJCA|a)C!3i*lFEDW O@;Z*1-kjtIT=@%6Lxhe1 literal 0 HcmV?d00001 diff --git a/ui/index.jsp b/ui/index.jsp index fd6677c2b85..9326576a920 100644 --- a/ui/index.jsp +++ b/ui/index.jsp @@ -12,6 +12,7 @@ + From b07162f30a838903152a3fab0522979eff132fc9 Mon Sep 17 00:00:00 2001 From: anthony Date: Thu, 6 Jan 2011 19:41:00 -0800 Subject: [PATCH 05/25] merge from 2.1.x deb87aa5e7f05569590abd4aa3dac4f11ab1cf84 correct definition --- .../com/cloud/hypervisor/xen/resource/CitrixResourceBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 011d5e8a605..513b9fad1a2 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -2604,7 +2604,7 @@ public abstract class CitrixResourceBase implements ServerResource { } } - void startVM(Connection conn, Host host, VM vm, String vmName) { + void startVM(Connection conn, Host host, VM vm, String vmName) throws XmlRpcException { try { vm.startOn(conn, host, false, true); } catch (Exception e) { From 274edf1478ef9f650e8db8d143904e92cfd65ee9 Mon Sep 17 00:00:00 2001 From: abhishek Date: Fri, 7 Jan 2011 10:33:11 -0800 Subject: [PATCH 06/25] fixing sec group rules creation, and also adding some description in commands. checking in so that ui work can begin. --- .../AuthorizeSecurityGroupIngressCmd.java | 28 ++++++------------- .../security/dao/SecurityGroupDaoImpl.java | 4 +-- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java b/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java index 008f4fe8a0d..e1da8de662c 100644 --- a/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java +++ b/api/src/com/cloud/api/commands/AuthorizeSecurityGroupIngressCmd.java @@ -40,7 +40,6 @@ import com.cloud.user.Account; import com.cloud.user.UserContext; import com.cloud.utils.StringUtils; -//FIXME - add description @Implementation(responseObject=IngressRuleResponse.class) @SuppressWarnings("rawtypes") public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(AuthorizeSecurityGroupIngressCmd.class.getName()); @@ -54,40 +53,31 @@ public class AuthorizeSecurityGroupIngressCmd extends BaseAsyncCmd { @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, description="TCP is default. UDP is the other supported protocol") private String protocol; - //FIXME - add description - @Parameter(name=ApiConstants.START_PORT, type=CommandType.INTEGER) + @Parameter(name=ApiConstants.START_PORT, type=CommandType.INTEGER, description="start port for this ingress rule") private Integer startPort; - //FIXME - add description - @Parameter(name=ApiConstants.END_PORT, type=CommandType.INTEGER) + @Parameter(name=ApiConstants.END_PORT, type=CommandType.INTEGER, description="end port for this ingress rule") private Integer endPort; - //FIXME - add description - @Parameter(name=ApiConstants.ICMP_TYPE, type=CommandType.INTEGER) + @Parameter(name=ApiConstants.ICMP_TYPE, type=CommandType.INTEGER, description="type of the icmp message being sent") private Integer icmpType; - //FIXME - add description - @Parameter(name=ApiConstants.ICMP_CODE, type=CommandType.INTEGER) + @Parameter(name=ApiConstants.ICMP_CODE, type=CommandType.INTEGER, description="error code for this icmp message") private Integer icmpCode; - //FIXME - add description - @Parameter(name=ApiConstants.SECURITY_GROUP_NAME, type=CommandType.STRING, required=true) + @Parameter(name=ApiConstants.SECURITY_GROUP_NAME, type=CommandType.STRING, required=true, description="the security group name") private String securityGroupName; - //FIXME - add description - @Parameter(name=ApiConstants.CIDR_LIST, type=CommandType.LIST, collectionType=CommandType.STRING) + @Parameter(name=ApiConstants.CIDR_LIST, type=CommandType.LIST, collectionType=CommandType.STRING, description="the cidr list associated") private List cidrList; - //FIXME - add description - @Parameter(name=ApiConstants.USER_SECURITY_GROUP_LIST, type=CommandType.MAP) + @Parameter(name=ApiConstants.USER_SECURITY_GROUP_LIST, type=CommandType.MAP, description="user to security group mapping") private Map userSecurityGroupList; - //FIXME - add description - @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING) + @Parameter(name=ApiConstants.ACCOUNT, type=CommandType.STRING, description="an optional account for the security group. Must be used with domainId.") private String accountName; - //FIXME - add description - @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG) + @Parameter(name=ApiConstants.DOMAIN_ID, type=CommandType.LONG, description="an optional domainId for the security group. If the account parameter is used, domainId must also be used.") private Long domainId; diff --git a/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java b/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java index 20e6880f14b..f4df776966e 100644 --- a/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java +++ b/server/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java @@ -40,7 +40,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase AccountIdNameSearch = createSearchBuilder(); AccountIdNameSearch.and("accountId", AccountIdNameSearch.entity().getAccountId(), SearchCriteria.Op.EQ); - AccountIdNameSearch.and("groupName", AccountIdNameSearch.entity().getName(), SearchCriteria.Op.EQ); + AccountIdNameSearch.and("name", AccountIdNameSearch.entity().getName(), SearchCriteria.Op.EQ); AccountIdNamesSearch = createSearchBuilder(); AccountIdNamesSearch.and("accountId", AccountIdNamesSearch.entity().getAccountId(), SearchCriteria.Op.EQ); @@ -74,7 +74,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase public SecurityGroupVO findByAccountAndName(Long accountId, String name) { SearchCriteria sc = AccountIdNameSearch.create(); sc.setParameters("accountId", accountId); - sc.setParameters("groupName", name); + sc.setParameters("name", name); return findOneIncludingRemovedBy(sc); } From 8284abedf5a21f49ee69295e03ea5015f68358c5 Mon Sep 17 00:00:00 2001 From: will Date: Fri, 7 Jan 2011 10:39:31 -0800 Subject: [PATCH 07/25] bug 7902: Fixed problem with updating secstorage.ssl.cert.domain as it was incorrect set to be validated as a boolean and also was set to be validated as an ip range. - Fixed error message returned when validating boolean to not return double-quotes as that breaks JSON. --- server/src/com/cloud/configuration/Config.java | 2 +- .../src/com/cloud/configuration/ConfigurationManagerImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index 57cfce0d2a8..e7f2becfbc7 100644 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -154,7 +154,7 @@ public enum Config { MaxTemplateAndIsoSize("Advanced", ManagementServer.class, Long.class, "max.template.iso.size", "50", "The maximum size for a downloaded template or ISO (in GB).", null), SecStorageAllowedInternalDownloadSites("Advanced", ManagementServer.class, String.class, "secstorage.allowed.internal.sites", null, "Comma separated list of cidrs internal to the datacenter that can host template download servers", null), SecStorageEncryptCopy("Advanced", ManagementServer.class, Boolean.class, "secstorage.encrypt.copy", "false", "Use SSL method used to encrypt copy traffic between zones", "true,false"), - SecStorageSecureCopyCert("Advanced", ManagementServer.class, Boolean.class, "secstorage.ssl.cert.domain", "realhostip.com", "SSL certificate used to encrypt copy traffic between zones", "realhostip.com"), + SecStorageSecureCopyCert("Advanced", ManagementServer.class, String.class, "secstorage.ssl.cert.domain", "realhostip.com", "SSL certificate used to encrypt copy traffic between zones", null), DirectAttachSecurityGroupsEnabled("Advanced", ManagementServer.class, Boolean.class, "direct.attach.security.groups.enabled", "false", "Ec2-style distributed firewall for direct-attach VMs", "true,false"), DirectAttachNetworkEnabled("Advanced", ManagementServer.class, Boolean.class, "direct.attach.network.externalIpAllocator.enabled", "false", "Direct-attach VMs using external DHCP server", "true,false"), DirectAttachNetworkExternalAPIURL("Advanced", ManagementServer.class, String.class, "direct.attach.network.externalIpAllocator.url", null, "Direct-attach VMs using external DHCP server (API url)", null), diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index 968f025a330..c5ad0ff51ae 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -285,7 +285,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (type.equals(Boolean.class)) { if (!(value.equals("true") || value.equals("false"))) { s_logger.error("Configuration variable " + name + " is expecting true or false in stead of " + value); - return "Please enter either \"true\" or \"false\"."; + return "Please enter either 'true' or 'false'."; } return null; } From d95c7a4adeb983747f31debfed190ef0a6217c5b Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Fri, 7 Jan 2011 10:50:52 -0800 Subject: [PATCH 08/25] hypervisor type is required, right now the parameter exception is thrown inside the resource svc --- api/src/com/cloud/api/commands/AddHostCmd.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/src/com/cloud/api/commands/AddHostCmd.java b/api/src/com/cloud/api/commands/AddHostCmd.java index a1f7b02754d..e73eb037864 100644 --- a/api/src/com/cloud/api/commands/AddHostCmd.java +++ b/api/src/com/cloud/api/commands/AddHostCmd.java @@ -63,7 +63,7 @@ public class AddHostCmd extends BaseCmd { @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.LONG, required=true, description="the Zone ID for the host") private Long zoneId; - @Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=false, description="hypervisor type of the host") + @Parameter(name=ApiConstants.HYPERVISOR, type=CommandType.STRING, required=true, description="hypervisor type of the host") private String hypervisor; From 789912de6a099ba8bc079e465742751bb74d721d Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 7 Jan 2011 10:47:45 -0800 Subject: [PATCH 09/25] Removed guestIpType parameter from listNetwork offerings command --- .../com/cloud/api/commands/ListNetworkOfferingsCmd.java | 9 +-------- .../cloud/configuration/ConfigurationManagerImpl.java | 4 ---- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java index 1864b4e06b9..64c726bd64f 100644 --- a/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java +++ b/api/src/com/cloud/api/commands/ListNetworkOfferingsCmd.java @@ -49,9 +49,6 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { @Parameter(name=ApiConstants.DISPLAY_TEXT, type=CommandType.STRING, description="list network offerings by display text") private String displayText; - @Parameter(name=ApiConstants.TYPE, type=CommandType.STRING, description="list by type of the network") - private String type; - @Parameter(name=ApiConstants.TRAFFIC_TYPE, type=CommandType.STRING, description="list by traffic type") private String trafficType; @@ -78,11 +75,7 @@ public class ListNetworkOfferingsCmd extends BaseListCmd { public String getDisplayText() { return displayText; } - - public String getType() { - return type; - } - + public String getTrafficType() { return trafficType; } diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index c5ad0ff51ae..8edd2c78c9e 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -2739,7 +2739,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura Object id = cmd.getId(); Object name = cmd.getNetworkOfferingName(); Object displayText = cmd.getDisplayText(); - Object type = cmd.getType(); Object trafficType = cmd.getTrafficType(); Object isDefault = cmd.getIsDefault(); Object specifyVlan = cmd.getSpecifyVlan(); @@ -2765,9 +2764,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager, Configura if (displayText != null) { sc.addAnd("displayText", SearchCriteria.Op.LIKE, "%" + displayText + "%"); } - if (type != null) { - sc.addAnd("guestIpType", SearchCriteria.Op.EQ, type); - } if (trafficType != null) { sc.addAnd("trafficType", SearchCriteria.Op.EQ, trafficType); From 1c29a5f8241835ee24aa4bb8f35c5f967adce9eb Mon Sep 17 00:00:00 2001 From: will Date: Fri, 7 Jan 2011 11:01:26 -0800 Subject: [PATCH 10/25] Listing only virtual network offering --- ui/scripts/cloud.core.init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js index 2710f480f3a..6380a64a7ef 100644 --- a/ui/scripts/cloud.core.init.js +++ b/ui/scripts/cloud.core.init.js @@ -163,7 +163,7 @@ var md5Hashed = true; //configuration bindAndListMidMenuItems($("#leftmenu_service_offering"), "listServiceOfferings", serviceOfferingGetSearchParams, "listserviceofferingsresponse", "serviceoffering", "jsp/serviceoffering.jsp", afterLoadServiceOfferingJSP, serviceOfferingToMidmenu, serviceOfferingToRightPanel, getMidmenuId, false); bindAndListMidMenuItems($("#leftmenu_disk_offering"), "listDiskOfferings", diskOfferingGetSearchParams, "listdiskofferingsresponse", "diskoffering", "jsp/diskoffering.jsp", afterLoadDiskOfferingJSP, diskOfferingToMidmenu, diskOfferingToRightPanel, getMidmenuId, false); - bindAndListMidMenuItems($("#leftmenu_network_offering"), "listNetworkOfferings&type=Virtual", networkOfferingGetSearchParams, "listnetworkofferingsresponse", "networkoffering", "jsp/networkoffering.jsp", afterLoadNetworkOfferingJSP, networkOfferingToMidmenu, networkOfferingToRightPanel, getMidmenuId, false); + bindAndListMidMenuItems($("#leftmenu_network_offering"), "listNetworkOfferings&traffictype=Guest", networkOfferingGetSearchParams, "listnetworkofferingsresponse", "networkoffering", "jsp/networkoffering.jsp", afterLoadNetworkOfferingJSP, networkOfferingToMidmenu, networkOfferingToRightPanel, getMidmenuId, false); } $("#leftmenu_global_setting").bind("click", function(event) { From e57a4bce001016c271baa70c06a9ee0a7f09cfa3 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 7 Jan 2011 11:09:06 -0800 Subject: [PATCH 11/25] bug 7744:create shared function clickItemInMultipleSelectionMidmenu(). --- ui/scripts/cloud.core.js | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/ui/scripts/cloud.core.js b/ui/scripts/cloud.core.js index a76998198da..d187a8c4b29 100644 --- a/ui/scripts/cloud.core.js +++ b/ui/scripts/cloud.core.js @@ -168,9 +168,13 @@ function handleMidMenuItemAfterDetailsTabAction($midmenuItem1, isSuccessful, aft $infoIcon.removeClass("error"); else $infoIcon.addClass("error"); - - if($midmenuItem1.attr("id") == selected_midmenu_id) - $midmenuItem1.click(); + + if($midmenuItem1.attr("id") == selected_midmenu_id) { + if($("#midmenu_container").find("#multiple_selection_sub_container").length == 0) //single-selection middle menu + $midmenuItem1.click(); + else //multiple-selection middle menu + clickItemInMultipleSelectionMidmenu($midmenuItem1); + } } //***** actions for a tab in right panel (end) ************************************************************************** @@ -907,7 +911,8 @@ function createMultipleSelectionSubContainer() { if($midmenuItem1.find("#content").hasClass("inaction") == false) { //only items not in action are allowed to be selected var id =$midmenuItem1.data("jsonObj").id; selectedItemsInMidMenu[id] = $midmenuItem1; - $midmenuItem1.find("#content").addClass("selected"); + $midmenuItem1.find("#content").addClass("selected"); //css of vmops + selected_midmenu_id = $midmenuItem1.attr("id"); } clearRightPanel(); var toRightPanelFn = $midmenuItem1.data("toRightPanelFn"); @@ -981,12 +986,7 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json $midmenuItem1.click(); } else { - $midmenuItem1.find("#content").addClass("selected"); - toRightPanelFn($midmenuItem1); - //$midmenuItem1.click(); //$midmenuItem1.click() is not working in multiple-selection middle menu - - $midmenuItem1.addClass("ui-selected"); //because instance page is using JQuery selectable widget to do multiple-selection - selectedItemsInMidMenu[items[i].id] = $midmenuItem1; //because instance page is using JQuery selectable widget to do multiple-selection + clickItemInMultipleSelectionMidmenu($midmenuItem1); } } } @@ -1003,6 +1003,19 @@ function listMidMenuItems2(commandString, getSearchParamsFn, jsonResponse1, json return count; } +function clickItemInMultipleSelectionMidmenu($midmenuItem1) { + $midmenuItem1.find("#content").addClass("selected"); //css of vmops + $midmenuItem1.addClass("ui-selected"); //css of JQuery selectable widget + + var toRightPanelFn = $midmenuItem1.data("toRightPanelFn"); + toRightPanelFn($midmenuItem1); + + var jsonObj = $midmenuItem1.data("jsonObj"); + selectedItemsInMidMenu[jsonObj.id] = $midmenuItem1; + + selected_midmenu_id = $midmenuItem1.attr("id"); +} + var currentLeftMenuId; var currentRightPanelJSP = null; function listMidMenuItems(commandString, getSearchParamsFn, jsonResponse1, jsonResponse2, rightPanelJSP, afterLoadRightPanelJSPFn, toMidmenuFn, toRightPanelFn, getMidmenuIdFn, isMultipleSelectionInMidMenu, leftmenuId, refreshDataBindingFn) { From 318a5c7d0c6af4e45ec704a68b6025b99e56e4ed Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 7 Jan 2011 11:58:13 -0800 Subject: [PATCH 12/25] IP Address page - fix a bug "networkObj is undefined" when login as user-role. --- ui/scripts/cloud.core.ipaddress.js | 110 +++++++++++++++++++---------- 1 file changed, 73 insertions(+), 37 deletions(-) diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js index c9b098e24c5..62d04619637 100644 --- a/ui/scripts/cloud.core.ipaddress.js +++ b/ui/scripts/cloud.core.ipaddress.js @@ -333,19 +333,39 @@ function ipToRightPanel($midmenuItem1) { if(ipObj.forvirtualnetwork == true) { //(public network) if(isIpManageable(ipObj.domainid, ipObj.account) == true) { //Port Forwarding tab - var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); - var portForwardingCapabilityObj = ipFindCapabilityByName("PortForwarding", firewallServiceObj); - if(firewallServiceObj != null && portForwardingCapabilityObj != null && portForwardingCapabilityObj.value == "true") - $("#tab_port_forwarding").show(); - else - $("#tab_port_forwarding").hide(); + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var portForwardingCapabilityObj = ipFindCapabilityByName("PortForwarding", firewallServiceObj); + if(portForwardingCapabilityObj != null) { + if(portForwardingCapabilityObj.value == "true") + $("#tab_port_forwarding").show(); + else + $("#tab_port_forwarding").hide(); + } + else { + $("#tab_port_forwarding").hide(); + } + } + else { + $("#tab_port_forwarding").hide(); + } + } + else { + $("#tab_port_forwarding").hide(); + } //Load Balancer tab - var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); - if(lbServiceObj != null) - $("#tab_load_balancer").show(); - else - $("#tab_load_balancer").hide(); + if(networkObj != null) { + var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); + if(lbServiceObj != null) + $("#tab_load_balancer").show(); + else + $("#tab_load_balancer").hide(); + } + else { + $("#tab_load_balancer").hide(); + } //VPN tab var vpnServiceObj = ipFindNetworkServiceByName("Vpn", networkObj); @@ -388,15 +408,20 @@ function ipJsonToPortForwardingTab() { $thisTab.find("#tab_container").hide(); $thisTab.find("#tab_spinning_wheel").show(); - var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); - var supportedProtocolsCapabilityObj = ipFindCapabilityByName("SupportedProtocols", firewallServiceObj); - if(supportedProtocolsCapabilityObj != null) { - var protocols = supportedProtocolsCapabilityObj.value.toUpperCase(); //e.g. "tcp,udp" => "TCP,UDP" - var array1 = protocols.split(","); - var $protocolField = $("#create_port_forwarding_row").find("#protocol").empty(); - for(var i=0; i"+array1[i]+"") + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var supportedProtocolsCapabilityObj = ipFindCapabilityByName("SupportedProtocols", firewallServiceObj); + if(supportedProtocolsCapabilityObj != null) { + var protocols = supportedProtocolsCapabilityObj.value.toUpperCase(); //e.g. "tcp,udp" => "TCP,UDP" + var array1 = protocols.split(","); + var $protocolField = $("#create_port_forwarding_row").find("#protocol").empty(); + for(var i=0; i"+array1[i]+"") + } + } } + refreshCreatePortForwardingRow(); $.ajax({ @@ -438,18 +463,23 @@ function ipJsonToLoadBalancerTab() { $thisTab.find("#tab_container").hide(); $thisTab.find("#tab_spinning_wheel").show(); - var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); - var supportedLbAlgorithmsCapabilityObj = ipFindCapabilityByName("SupportedLbAlgorithms", lbServiceObj); - if(lbServiceObj != null && supportedLbAlgorithmsCapabilityObj != null) { - var algorithms = supportedLbAlgorithmsCapabilityObj.value; //e.g. "roundrobin,leastconn,sourceip" - var array1 = algorithms.split(","); - var $algorithmField1 = $("#create_load_balancer_row").find("#algorithm_select").empty(); - var $algorithmField2 = $("#load_balancer_template").find("#row_container_edit").find("#algorithm_select").empty(); - for(var i=0; i"+array1[i]+""); - $algorithmField2.append(""); - } - } + if(networkObj != null) { + var lbServiceObj = ipFindNetworkServiceByName("Lb", networkObj); + if(lbServiceObj != null) { + var supportedLbAlgorithmsCapabilityObj = ipFindCapabilityByName("SupportedLbAlgorithms", lbServiceObj); + if(supportedLbAlgorithmsCapabilityObj != null) { + var algorithms = supportedLbAlgorithmsCapabilityObj.value; //e.g. "roundrobin,leastconn,sourceip" + var array1 = algorithms.split(","); + var $algorithmField1 = $("#create_load_balancer_row").find("#algorithm_select").empty(); + var $algorithmField2 = $("#load_balancer_template").find("#row_container_edit").find("#algorithm_select").empty(); + for(var i=0; i"+array1[i]+""); + $algorithmField2.append(""); + } + } + } + } + refreshCreateLoadBalancerRow(); $.ajax({ @@ -943,12 +973,18 @@ function ipJsonToDetailsTab() { buildActionLinkForTab("Disable Static NAT", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); noAvailableActions = false; } else { - if(ipObj.issourcenat != true) { - var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); - var staticNatCapabilityObj = ipFindCapabilityByName("StaticNat", firewallServiceObj); - if(firewallServiceObj != null && staticNatCapabilityObj != null && staticNatCapabilityObj.value == "true") - buildActionLinkForTab("Enable Static NAT", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); - + if(ipObj.issourcenat != true) { + if(networkObj != null) { + var firewallServiceObj = ipFindNetworkServiceByName("Firewall", networkObj); + if(firewallServiceObj != null) { + var staticNatCapabilityObj = ipFindCapabilityByName("StaticNat", firewallServiceObj); + if(staticNatCapabilityObj != null) { + if(staticNatCapabilityObj.value == "true") + buildActionLinkForTab("Enable Static NAT", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); + } + } + } + buildActionLinkForTab("Release IP", ipActionMap, $actionMenu, $midmenuItem1, $thisTab); noAvailableActions = false; } From 7843b30ff2bd75837291407b3cb9c21fbd39ccdd Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 7 Jan 2011 12:07:24 -0800 Subject: [PATCH 13/25] IP Address page - fix a bug "networkObj is undefined" when login as user-role. --- ui/scripts/cloud.core.ipaddress.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/scripts/cloud.core.ipaddress.js b/ui/scripts/cloud.core.ipaddress.js index 62d04619637..990e9e72644 100644 --- a/ui/scripts/cloud.core.ipaddress.js +++ b/ui/scripts/cloud.core.ipaddress.js @@ -1001,6 +1001,8 @@ function ipJsonToDetailsTab() { } function ipFindNetworkServiceByName(pName, networkObj) { + if(networkObj == null) + return null; for(var i=0; i Date: Wed, 5 Jan 2011 15:18:02 -0800 Subject: [PATCH 14/25] got rid of monitor --- .../cloud/agent/api/to/VirtualMachineTO.java | 31 ------------------- .../xen/resource/CitrixResourceBase.java | 21 ------------- 2 files changed, 52 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java index 9fda4e46446..0e2be2bc31d 100644 --- a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java +++ b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java @@ -38,7 +38,6 @@ public class VirtualMachineTO { String bootArgs; String[] bootupScripts; boolean rebootOnCrash; - Monitor monitor; VolumeTO[] disks; NicTO[] nics; @@ -70,14 +69,6 @@ public class VirtualMachineTO { return name; } - public Monitor getMonitor() { - return monitor; - } - - public void setMonitor(Monitor monitor) { - this.monitor = monitor; - } - public void setName(String name) { this.name = name; } @@ -187,26 +178,4 @@ public class VirtualMachineTO { public void setNics(NicTO[] nics) { this.nics = nics; } - - public static interface Monitor { - - } - - public static class SshMonitor implements Monitor { - String ip; - int port; - - public String getIp() { - return ip; - } - - public int getPort() { - return port; - } - - public SshMonitor(String ip, int port) { - this.ip = ip; - this.port = port; - } - } } diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 513b9fad1a2..d7aa0500dd9 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -148,8 +148,6 @@ import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.PortForwardingRuleTO; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.agent.api.to.VirtualMachineTO.Monitor; -import com.cloud.agent.api.to.VirtualMachineTO.SshMonitor; import com.cloud.agent.api.to.VolumeTO; import com.cloud.dc.Vlan; import com.cloud.exception.InternalErrorException; @@ -829,25 +827,6 @@ public abstract class CitrixResourceBase implements ServerResource { } } } - - Monitor monitor = vmSpec.getMonitor(); - if (monitor != null && monitor instanceof SshMonitor) { - SshMonitor sshMon = (SshMonitor)monitor; - String privateIp = sshMon.getIp(); - int cmdPort = sshMon.getPort(); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Ping command port, " + privateIp + ":" + cmdPort); - } - - String result = connect(conn, vmName, privateIp, cmdPort); - if (result != null) { - throw new CloudRuntimeException("Can not ping System vm " + vmName + "due to:" + result); - } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Ping command port succeeded for vm " + vmName); - } - } state = State.Running; return new StartAnswer(cmd); From 2e29f21e5a4dad1c7a28760d03f70e4e25482eb8 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 6 Jan 2011 11:29:10 -0800 Subject: [PATCH 15/25] changes for injectors --- api/src/com/cloud/event/ActionEvent.java | 22 +++ .../src/com/cloud/network/NetworkManager.java | 4 + .../com/cloud/network/NetworkManagerImpl.java | 166 +++++++++--------- server/src/com/cloud/vm/ItWorkVO.java | 58 ++++-- .../cloud/vm/VirtualMachineManagerImpl.java | 65 ++++++- .../utils/component/ComponentLocator.java | 1 + 6 files changed, 221 insertions(+), 95 deletions(-) create mode 100644 api/src/com/cloud/event/ActionEvent.java diff --git a/api/src/com/cloud/event/ActionEvent.java b/api/src/com/cloud/event/ActionEvent.java new file mode 100644 index 00000000000..658d2b014ad --- /dev/null +++ b/api/src/com/cloud/event/ActionEvent.java @@ -0,0 +1,22 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.event; + +public @interface ActionEvent { + +} diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index d8dd1982248..19cea4603bd 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -32,6 +32,7 @@ import com.cloud.network.Network.Capability; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; +import com.cloud.network.guru.NetworkGuru; import com.cloud.network.rules.FirewallRule; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offerings.NetworkOfferingVO; @@ -140,4 +141,7 @@ public interface NetworkManager extends NetworkService { List listPodVlans(long podId); + Network getBasicZoneDefaultPublicNetwork(long zoneId); + + Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 3addb3b067e..7d27a7f06b4 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -20,8 +20,6 @@ package com.cloud.network; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -36,11 +34,7 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import com.cloud.agent.AgentManager; -import com.cloud.agent.AgentManager.OnError; -import com.cloud.agent.api.Answer; import com.cloud.agent.api.to.NicTO; -import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; import com.cloud.api.BaseCmd; import com.cloud.api.commands.AssociateIPAddrCmd; @@ -75,12 +69,10 @@ import com.cloud.event.UsageEventVO; import com.cloud.event.dao.EventDao; import com.cloud.event.dao.UsageEventDao; import com.cloud.exception.AccountLimitException; -import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; @@ -92,12 +84,14 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; +<<<<<<< HEAD import com.cloud.network.dao.RemoteAccessVpnDao; +======= +>>>>>>> changes for injectors import com.cloud.network.element.NetworkElement; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRulesManager; -import com.cloud.network.router.VirtualNetworkApplianceManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; import com.cloud.network.rules.PortForwardingRuleVO; @@ -111,6 +105,10 @@ import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.Resource; import com.cloud.resource.Resource.ReservationStrategy; +<<<<<<< HEAD +======= +import com.cloud.service.ServiceOfferingVO; +>>>>>>> changes for injectors import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; @@ -165,7 +163,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject EventDao _eventDao = null; @Inject ConfigurationDao _configDao; @Inject UserVmDao _vmDao = null; - @Inject AgentManager _agentMgr; + @Inject ResourceLimitDao _limitDao = null; + @Inject CapacityDao _capacityDao = null; @Inject AlertManager _alertMgr; @Inject AccountManager _accountMgr; @Inject ConfigurationManager _configMgr; @@ -173,8 +172,6 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Inject NetworkOfferingDao _networkOfferingDao = null; @Inject NetworkDao _networksDao = null; @Inject NicDao _nicDao = null; - @Inject RemoteAccessVpnDao _remoteAccessVpnDao = null; - @Inject VirtualNetworkApplianceManager _routerMgr; @Inject RulesManager _rulesMgr; @Inject LoadBalancingRulesManager _lbMgr; @Inject UsageEventDao _usageEventDao; @@ -355,77 +352,77 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag @Override public boolean associateIP(final DomainRouterVO router, final List ipAddrList, final boolean add, long vmId) { - Commands cmds = new Commands(OnError.Continue); - boolean sourceNat = false; - Map> vlanIpMap = new HashMap>(); - for (final String ipAddress: ipAddrList) { - IPAddressVO ip = _ipAddressDao.findById(new Ip(ipAddress)); - - VlanVO vlan = _vlanDao.findById(ip.getVlanId()); - ArrayList ipList = vlanIpMap.get(vlan.getId()); - if (ipList == null) { - ipList = new ArrayList(); - } - ipList.add(ip); - vlanIpMap.put(vlan, ipList); - } - for (Map.Entry> vlanAndIp: vlanIpMap.entrySet()) { - boolean firstIP = true; - ArrayList ipList = vlanAndIp.getValue(); - Collections.sort(ipList, new Comparator() { - @Override - public int compare(IPAddressVO o1, IPAddressVO o2) { - return o1.getAddress().compareTo(o2.getAddress()); - } }); - - for (final IPAddressVO ip: ipList) { - sourceNat = ip.isSourceNat(); - VlanVO vlan = vlanAndIp.getKey(); - String vlanId = vlan.getVlanTag(); - String vlanGateway = vlan.getVlanGateway(); - String vlanNetmask = vlan.getVlanNetmask(); - - String vifMacAddress = null; - if (firstIP && add) { - String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(ip.getDataCenterId()); - vifMacAddress = macAddresses[1]; - } - String vmGuestAddress = null; - if(vmId!=0){ - vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); - } - - //cmds.addCommand(new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); - - firstIP = false; - } - } - - Answer[] answers = null; - try { - answers = _agentMgr.send(router.getHostId(), cmds); - } catch (final AgentUnavailableException e) { - s_logger.warn("Agent unavailable", e); - return false; - } catch (final OperationTimedoutException e) { - s_logger.warn("Timed Out", e); - return false; - } - - if (answers == null) { - return false; - } - - if (answers.length != ipAddrList.size()) { - return false; - } - - // FIXME: this used to be a loop for all answers, but then we always returned the - // first one in the array, so what should really be done here? - if (answers.length > 0) { - Answer ans = answers[0]; - return ans.getResult(); - } +// Commands cmds = new Commands(OnError.Continue); +// boolean sourceNat = false; +// Map> vlanIpMap = new HashMap>(); +// for (final String ipAddress: ipAddrList) { +// IPAddressVO ip = _ipAddressDao.findById(new Ip(ipAddress)); +// +// VlanVO vlan = _vlanDao.findById(ip.getVlanId()); +// ArrayList ipList = vlanIpMap.get(vlan.getId()); +// if (ipList == null) { +// ipList = new ArrayList(); +// } +// ipList.add(ip); +// vlanIpMap.put(vlan, ipList); +// } +// for (Map.Entry> vlanAndIp: vlanIpMap.entrySet()) { +// boolean firstIP = true; +// ArrayList ipList = vlanAndIp.getValue(); +// Collections.sort(ipList, new Comparator() { +// @Override +// public int compare(IPAddressVO o1, IPAddressVO o2) { +// return o1.getAddress().compareTo(o2.getAddress()); +// } }); +// +// for (final IPAddressVO ip: ipList) { +// sourceNat = ip.isSourceNat(); +// VlanVO vlan = vlanAndIp.getKey(); +// String vlanId = vlan.getVlanTag(); +// String vlanGateway = vlan.getVlanGateway(); +// String vlanNetmask = vlan.getVlanNetmask(); +// +// String vifMacAddress = null; +// if (firstIP && add) { +// String[] macAddresses = _dcDao.getNextAvailableMacAddressPair(ip.getDataCenterId()); +// vifMacAddress = macAddresses[1]; +// } +// String vmGuestAddress = null; +// if(vmId!=0){ +// vmGuestAddress = _vmDao.findById(vmId).getGuestIpAddress(); +// } +// +// //cmds.addCommand(new IPAssocCommand(router.getInstanceName(), router.getPrivateIpAddress(), ip.getAddress(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, vmGuestAddress)); +// +// firstIP = false; +// } +// } +// +// Answer[] answers = null; +// try { +// answers = _agentMgr.send(router.getHostId(), cmds); +// } catch (final AgentUnavailableException e) { +// s_logger.warn("Agent unavailable", e); +// return false; +// } catch (final OperationTimedoutException e) { +// s_logger.warn("Timed Out", e); +// return false; +// } +// +// if (answers == null) { +// return false; +// } +// +// if (answers.length != ipAddrList.size()) { +// return false; +// } +// +// // FIXME: this used to be a loop for all answers, but then we always returned the +// // first one in the array, so what should really be done here? +// if (answers.length > 0) { +// Answer ans = answers[0]; +// return ans.getResult(); +// } return true; } @@ -995,8 +992,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag return to; } + @Override @DB - protected Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + public Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { Transaction.currentTxn(); Pair implemented = new Pair(null, null); diff --git a/server/src/com/cloud/vm/ItWorkVO.java b/server/src/com/cloud/vm/ItWorkVO.java index a823c7be11b..c150a125851 100644 --- a/server/src/com/cloud/vm/ItWorkVO.java +++ b/server/src/com/cloud/vm/ItWorkVO.java @@ -36,9 +36,15 @@ public class ItWorkVO { Cleanup; } - enum State { - Working, - Cancelling, + enum ResourceType { + Volume, + Nic + } + + enum Step { + Prepare, + Start, + Started, } @Id @@ -58,21 +64,53 @@ public class ItWorkVO { String threadName; @Column(name="state") - State state; + Step step; @Column(name="cancel_taken") @Temporal(value=TemporalType.TIMESTAMP) Date taken; + @Column(name="instance_id") + long instanceId; + + public long getInstanceId() { + return instanceId; + } + + @Column(name="resource_id") + long resourceId; + + @Column(name="resource_type") + ResourceType resourceType; + + + public long getResourceId() { + return resourceId; + } + + public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + + public ResourceType getResourceType() { + return resourceType; + } + + public void setResourceType(ResourceType resourceType) { + this.resourceType = resourceType; + } + protected ItWorkVO() { } - protected ItWorkVO(String id, long managementServerId, Type type) { + protected ItWorkVO(String id, long managementServerId, Type type, long instanceId) { this.id = id; this.managementServerId = managementServerId; this.type = type; this.threadName = Thread.currentThread().getName(); - this.state = State.Working; + this.step = Step.Prepare; + this.instanceId = instanceId; + this.resourceType = null; } public String getId() { @@ -99,12 +137,12 @@ public class ItWorkVO { return threadName; } - public State getState() { - return state; + public Step getStep() { + return step; } - public void setState(State state) { - this.state = state; + public void setStep(Step state) { + this.step = state; } public Date getTaken() { diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 7f58a0c3bf6..81034be3feb 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -17,6 +17,7 @@ */ package com.cloud.vm; +import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -61,6 +62,10 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuru; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; +import com.cloud.network.element.NetworkElement; +import com.cloud.network.guru.NetworkGuru; +import com.cloud.resource.Resource; +import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -90,6 +95,7 @@ import com.cloud.vm.VirtualMachine.Event; import com.cloud.vm.VirtualMachine.State; import com.cloud.vm.dao.ConsoleProxyDao; import com.cloud.vm.dao.DomainRouterDao; +import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; @@ -115,6 +121,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster @Inject private ConsoleProxyDao _consoleDao; @Inject private SecondaryStorageVmDao _secondaryDao; @Inject private UsageEventDao _usageEventDao; + @Inject private NicDao _nicsDao; @Inject(adapter=DeploymentPlanner.class) private Adapters _planners; @@ -200,6 +207,58 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster return vm; } + protected void reserveNics(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { + List nics = _nicsDao.listBy(vmProfile.getId()); + for (NicVO nic : nics) { + Pair implemented = _networkMgr.implementNetwork(nic.getNetworkId(), dest, context); + NetworkGuru concierge = implemented.first(); + NetworkVO network = implemented.second(); + NicProfile profile = null; + if (nic.getReservationStrategy() == ReservationStrategy.Start) { + nic.setState(Resource.State.Reserving); + nic.setReservationId(context.getReservationId()); + _nicsDao.update(nic.getId(), nic); + URI broadcastUri = nic.getBroadcastUri(); + if (broadcastUri == null) { + network.getBroadcastUri(); + } + + URI isolationUri = nic.getIsolationUri(); + + profile = new NicProfile(nic, network, broadcastUri, isolationUri); + concierge.reserve(profile, network, vmProfile, dest, context); + nic.setIp4Address(profile.getIp4Address()); + nic.setIp6Address(profile.getIp6Address()); + nic.setMacAddress(profile.getMacAddress()); + nic.setIsolationUri(profile.getIsolationUri()); + nic.setBroadcastUri(profile.getBroadCastUri()); + nic.setReserver(concierge.getName()); + nic.setState(Resource.State.Reserved); + nic.setNetmask(profile.getNetmask()); + nic.setGateway(profile.getGateway()); + nic.setAddressFormat(profile.getFormat()); + _nicsDao.update(nic.getId(), nic); + } else { + profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); + } + + for (NetworkElement element : _networkElements) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Asking " + element.getName() + " to prepare for " + nic); + } + element.prepare(network, profile, vmProfile, dest, context); + } + + vmProfile.addNic(profile); + _networksDao.changeActiveNicsBy(network.getId(), 1); + } + } + + protected void prepareNics(VirtualMachineProfile vmProfile, DeployDestionation dest, ReservationContext context) { + + } + + @Override public T allocate(T vm, VMTemplateVO template, @@ -337,11 +396,15 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster @Override public T advanceStart(T vm, Map params, User caller, Account account, HypervisorType hyperType) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { State state = vm.getState(); - if (state == State.Starting || state == State.Running) { + if (state == State.Running) { s_logger.debug("VM is already started: " + vm); return vm; } + if (state == State.Starting) { + + } + if (state != State.Stopped) { s_logger.debug("VM " + vm + " is not in a state to be started: " + state); return null; diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index ce326a15752..453f3ae6085 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -90,6 +90,7 @@ public class ComponentLocator implements ComponentLocatorMBean { protected String _serverName; protected Object _component; protected HashMap, Class> _factories; + protected List _injectors; static { Runtime.getRuntime().addShutdownHook(new CleanupThread()); From e496a99c1c645f9361ac0383be6a934981701a9f Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 6 Jan 2011 15:06:55 -0800 Subject: [PATCH 16/25] added processing for events --- .../com/cloud/offering/NetworkOffering.java | 1 + .../DefaultComponentLibrary.java | 7 ++ .../cloud/vm/VirtualMachineManagerImpl.java | 99 +++++++++---------- setup/db/create-schema.sql | 3 + .../component/AnnotationInterceptor.java | 23 +++++ .../utils/component/ComponentLibrary.java | 2 + .../utils/component/ComponentLocator.java | 76 ++++++++++++-- .../com/cloud/utils/component/Injector.java | 19 ---- .../com/cloud/utils/db/DatabaseCallback.java | 50 +++++++++- 9 files changed, 199 insertions(+), 81 deletions(-) create mode 100644 utils/src/com/cloud/utils/component/AnnotationInterceptor.java delete mode 100644 utils/src/com/cloud/utils/component/Injector.java diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index 6a36b071370..9f4b70ba245 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -85,6 +85,7 @@ public interface NetworkOffering { Availability getAvailability(); + boolean isDnsService(); boolean isGatewayService(); diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index 04a13bfb1ee..d1a550a5f90 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -115,9 +115,11 @@ import com.cloud.user.dao.UserDaoImpl; import com.cloud.user.dao.UserStatisticsDaoImpl; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapter; +import com.cloud.utils.component.AnnotationInterceptor; import com.cloud.utils.component.ComponentLibrary; import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.component.Manager; +import com.cloud.utils.db.DatabaseCallback; import com.cloud.utils.db.GenericDao; import com.cloud.vm.ItWorkDaoImpl; import com.cloud.vm.UserVmManagerImpl; @@ -334,4 +336,9 @@ public class DefaultComponentLibrary implements ComponentLibrary { factories.put(EntityManager.class, EntityManagerImpl.class); return factories; } + + @Override + public void addInterceptors(List> interceptors) { + interceptors.add(new DatabaseCallback()); + } } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 81034be3feb..cda2c647325 100644 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -17,7 +17,6 @@ */ package com.cloud.vm; -import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -62,10 +61,6 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.hypervisor.HypervisorGuru; import com.cloud.network.NetworkManager; import com.cloud.network.NetworkVO; -import com.cloud.network.element.NetworkElement; -import com.cloud.network.guru.NetworkGuru; -import com.cloud.resource.Resource; -import com.cloud.resource.Resource.ReservationStrategy; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; @@ -208,53 +203,53 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster } protected void reserveNics(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { - List nics = _nicsDao.listBy(vmProfile.getId()); - for (NicVO nic : nics) { - Pair implemented = _networkMgr.implementNetwork(nic.getNetworkId(), dest, context); - NetworkGuru concierge = implemented.first(); - NetworkVO network = implemented.second(); - NicProfile profile = null; - if (nic.getReservationStrategy() == ReservationStrategy.Start) { - nic.setState(Resource.State.Reserving); - nic.setReservationId(context.getReservationId()); - _nicsDao.update(nic.getId(), nic); - URI broadcastUri = nic.getBroadcastUri(); - if (broadcastUri == null) { - network.getBroadcastUri(); - } - - URI isolationUri = nic.getIsolationUri(); - - profile = new NicProfile(nic, network, broadcastUri, isolationUri); - concierge.reserve(profile, network, vmProfile, dest, context); - nic.setIp4Address(profile.getIp4Address()); - nic.setIp6Address(profile.getIp6Address()); - nic.setMacAddress(profile.getMacAddress()); - nic.setIsolationUri(profile.getIsolationUri()); - nic.setBroadcastUri(profile.getBroadCastUri()); - nic.setReserver(concierge.getName()); - nic.setState(Resource.State.Reserved); - nic.setNetmask(profile.getNetmask()); - nic.setGateway(profile.getGateway()); - nic.setAddressFormat(profile.getFormat()); - _nicsDao.update(nic.getId(), nic); - } else { - profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); - } - - for (NetworkElement element : _networkElements) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Asking " + element.getName() + " to prepare for " + nic); - } - element.prepare(network, profile, vmProfile, dest, context); - } - - vmProfile.addNic(profile); - _networksDao.changeActiveNicsBy(network.getId(), 1); - } +// List nics = _nicsDao.listBy(vmProfile.getId()); +// for (NicVO nic : nics) { +// Pair implemented = _networkMgr.implementNetwork(nic.getNetworkId(), dest, context); +// NetworkGuru concierge = implemented.first(); +// NetworkVO network = implemented.second(); +// NicProfile profile = null; +// if (nic.getReservationStrategy() == ReservationStrategy.Start) { +// nic.setState(Resource.State.Reserving); +// nic.setReservationId(context.getReservationId()); +// _nicsDao.update(nic.getId(), nic); +// URI broadcastUri = nic.getBroadcastUri(); +// if (broadcastUri == null) { +// network.getBroadcastUri(); +// } +// +// URI isolationUri = nic.getIsolationUri(); +// +// profile = new NicProfile(nic, network, broadcastUri, isolationUri); +// concierge.reserve(profile, network, vmProfile, dest, context); +// nic.setIp4Address(profile.getIp4Address()); +// nic.setIp6Address(profile.getIp6Address()); +// nic.setMacAddress(profile.getMacAddress()); +// nic.setIsolationUri(profile.getIsolationUri()); +// nic.setBroadcastUri(profile.getBroadCastUri()); +// nic.setReserver(concierge.getName()); +// nic.setState(Resource.State.Reserved); +// nic.setNetmask(profile.getNetmask()); +// nic.setGateway(profile.getGateway()); +// nic.setAddressFormat(profile.getFormat()); +// _nicsDao.update(nic.getId(), nic); +// } else { +// profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri()); +// } +// +// for (NetworkElement element : _networkElements) { +// if (s_logger.isDebugEnabled()) { +// s_logger.debug("Asking " + element.getName() + " to prepare for " + nic); +// } +// element.prepare(network, profile, vmProfile, dest, context); +// } +// +// vmProfile.addNic(profile); +// _networksDao.changeActiveNicsBy(network.getId(), 1); +// } } - protected void prepareNics(VirtualMachineProfile vmProfile, DeployDestionation dest, ReservationContext context) { + protected void prepareNics(VirtualMachineProfile vmProfile, DeployDestination dest, ReservationContext context) { } @@ -416,7 +411,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster Journal journal = new Journal.LogJournal("Creating " + vm, s_logger); - ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, ItWorkVO.Type.Start); + ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, ItWorkVO.Type.Start, vm.getId()); work = _workDao.persist(work); ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account); @@ -626,7 +621,7 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Cluster stateTransitTo(vm, Event.OperationSucceeded, null); if (cleanup) { - ItWorkVO work = new ItWorkVO(reservationId, _nodeId, Type.Cleanup); + ItWorkVO work = new ItWorkVO(reservationId, _nodeId, Type.Cleanup, vm.getId()); _workDao.persist(work); } diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 253dee46224..eb22d1fd532 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -103,6 +103,9 @@ CREATE TABLE `cloud`.`op_it_work` ( `type` char(32) NOT NULL COMMENT 'type of work', `state` char(32) NOT NULL COMMENT 'state', `cancel_taken` timestamp COMMENT 'time it was taken over', + `instance_id` bigint unsigned NOT NULL COMMENT 'vm instance', + `resource_type` char(32) COMMENT 'type of resource being worked on', + `resource_id` bigint unsigned COMMENT 'resource id being worked on', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/utils/src/com/cloud/utils/component/AnnotationInterceptor.java b/utils/src/com/cloud/utils/component/AnnotationInterceptor.java new file mode 100644 index 00000000000..e614fcc6751 --- /dev/null +++ b/utils/src/com/cloud/utils/component/AnnotationInterceptor.java @@ -0,0 +1,23 @@ +/** + * + */ +package com.cloud.utils.component; + +import java.lang.reflect.AnnotatedElement; + +import net.sf.cglib.proxy.Callback; + +/** + * AnnotationIntercepter says it can intercept an annotation. + */ +public interface AnnotationInterceptor { + boolean needToIntercept(AnnotatedElement element); + + T interceptStart(AnnotatedElement element); + + void interceptComplete(AnnotatedElement element, T attach); + + void interceptException(AnnotatedElement element, T attach); + + Callback getCallback(); +} diff --git a/utils/src/com/cloud/utils/component/ComponentLibrary.java b/utils/src/com/cloud/utils/component/ComponentLibrary.java index f1b67e073c1..a0f0e8a3def 100644 --- a/utils/src/com/cloud/utils/component/ComponentLibrary.java +++ b/utils/src/com/cloud/utils/component/ComponentLibrary.java @@ -50,4 +50,6 @@ public interface ComponentLibrary { Map>> getAdapters(); Map, Class> getFactories(); + + void addInterceptors(List> interceptors); } diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 453f3ae6085..3390fe205e5 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.Serializable; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; @@ -48,6 +49,8 @@ import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.CallbackFilter; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.Factory; +import net.sf.cglib.proxy.MethodInterceptor; +import net.sf.cglib.proxy.MethodProxy; import net.sf.cglib.proxy.NoOp; import org.apache.log4j.Logger; @@ -59,8 +62,6 @@ import org.xml.sax.helpers.DefaultHandler; import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.db.DatabaseCallback; -import com.cloud.utils.db.DatabaseCallbackFilter; import com.cloud.utils.db.GenericDao; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.mgmt.JmxUtil; @@ -79,18 +80,18 @@ public class ComponentLocator implements ComponentLocatorMBean { protected static final ThreadLocal s_tl = new ThreadLocal(); protected static final ConcurrentHashMap, Singleton> s_singletons = new ConcurrentHashMap, Singleton>(111); protected static final HashMap s_locators = new HashMap(); - protected static final Callback[] s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback() }; - protected static final CallbackFilter s_callbackFilter = new DatabaseCallbackFilter(); protected static final HashMap, InjectInfo> s_factories = new HashMap, InjectInfo>(); protected static Boolean s_once = false; - + protected static Callback[] s_callbacks; + protected static CallbackFilter s_callbackFilter; + protected static final List> s_interceptors = new ArrayList>(); + protected HashMap> _adapterMap; protected HashMap> _managerMap; protected LinkedHashMap>> _daoMap; protected String _serverName; protected Object _component; protected HashMap, Class> _factories; - protected List _injectors; static { Runtime.getRuntime().addShutdownHook(new CleanupThread()); @@ -150,6 +151,9 @@ public class ComponentLocator implements ComponentLocatorMBean { _managerMap.putAll(library.getManagers()); adapters.putAll(library.getAdapters()); _factories.putAll(library.getFactories()); + synchronized(s_interceptors) { + library.addInterceptors(s_interceptors); + } } _daoMap.putAll(handler.daos); @@ -183,6 +187,17 @@ public class ComponentLocator implements ComponentLocatorMBean { s_logger.info("Skipping configuration using " + filename); return; } + + synchronized(s_interceptors) { + s_callbacks = new Callback[s_interceptors.size() + 2]; + int i = 0; + s_callbacks[i++] = NoOp.INSTANCE; + s_callbacks[i++] = new InterceptorDispatcher(); + for (AnnotationInterceptor interceptor : s_interceptors) { + s_callbacks[i++] = interceptor.getCallback(); + } + s_callbackFilter = new InterceptorFilter(); + } XmlHandler handler = result.first(); HashMap>> adapters = result.second(); @@ -830,7 +845,7 @@ public class ComponentLocator implements ComponentLocatorMBean { if (info.name == null) { throw new CloudRuntimeException("Missing name attribute for " + interphace.getName()); } - info.name = info.name + "-" + clazzName; + info.name = info.name; s_logger.debug("Looking for class " + clazzName); try { info.clazz = Class.forName(clazzName); @@ -1013,4 +1028,51 @@ public class ComponentLocator implements ComponentLocatorMBean { this.state = State.Instantiated; } } + + protected class InterceptorDispatcher implements MethodInterceptor { + + @Override + public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { + ArrayList, Object>> interceptors = new ArrayList, Object>>(); + for (AnnotationInterceptor interceptor : s_interceptors) { + if (interceptor.needToIntercept(method)) { + Object obj = interceptor.interceptStart(method); + interceptors.add(new Pair, Object>((AnnotationInterceptor)interceptor, obj)); + } + } + boolean success = false; + try { + Object obj = methodProxy.invokeSuper(object, args); + success = true; + return obj; + } finally { + for (Pair, Object> interceptor : interceptors) { + if (success) { + interceptor.first().interceptComplete(method, interceptor.second()); + } else { + interceptor.first().interceptException(method, interceptor.second()); + } + } + } + } + } + + protected static class InterceptorFilter implements CallbackFilter { + @Override + public int accept(Method method) { + int index = 0; + for (int i = 2; i < s_callbacks.length; i++) { + AnnotationInterceptor interceptor = (AnnotationInterceptor)s_callbacks[i]; + if (interceptor.needToIntercept(method)) { + if (index == 0) { + index = i; + } else { + return 1; + } + } + } + + return index; + } + } } diff --git a/utils/src/com/cloud/utils/component/Injector.java b/utils/src/com/cloud/utils/component/Injector.java deleted file mode 100644 index e278ab5ba08..00000000000 --- a/utils/src/com/cloud/utils/component/Injector.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * - */ -package com.cloud.utils.component; - -import java.lang.annotation.Annotation; -import java.lang.reflect.AnnotatedElement; - -/** - * Injector implements customized Injectors for ComponentLocator. - * - */ -public interface Injector { - /** - * Can this injector handle injecting into this type of class? - */ - boolean canInject(AnnotatedElement element, Annotation ann); - -} diff --git a/utils/src/com/cloud/utils/db/DatabaseCallback.java b/utils/src/com/cloud/utils/db/DatabaseCallback.java index 5587084c80d..623c1c1fda9 100644 --- a/utils/src/com/cloud/utils/db/DatabaseCallback.java +++ b/utils/src/com/cloud/utils/db/DatabaseCallback.java @@ -17,20 +17,64 @@ */ package com.cloud.utils.db; +import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; +import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; -public class DatabaseCallback implements MethodInterceptor { +import com.cloud.utils.component.AnnotationInterceptor; + +public class DatabaseCallback implements MethodInterceptor, AnnotationInterceptor { @Override public Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { - Transaction txn = Transaction.open(method.getName()); + Transaction txn = interceptStart(method); try { return methodProxy.invokeSuper(object, args); } finally { - txn.close(); + interceptComplete(method, txn); } } + + @Override + public boolean needToIntercept(AnnotatedElement element) { + DB db = element.getAnnotation(DB.class); + if (db != null) { + return db.txn(); + } + + Class clazz = element.getClass().getDeclaringClass(); + do { + db = clazz.getAnnotation(DB.class); + if (db != null) { + return db.txn(); + } + clazz = clazz.getSuperclass(); + } while (clazz != Object.class && clazz != null); + + return false; + } + + @Override + public Transaction interceptStart(AnnotatedElement element) { + return Transaction.open(((Method)element).getName()); + } + + @Override + public void interceptComplete(AnnotatedElement element, Transaction txn) { + txn.close(); + } + + @Override + public void interceptException(AnnotatedElement element, Transaction txn) { + txn.close(); + } + + @Override + public Callback getCallback() { + return this; + } + } From 4b360258ee73902ed37bfec99199c9193e0d5fd3 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 6 Jan 2011 15:25:56 -0800 Subject: [PATCH 17/25] allow multiple ways to intercept --- .../com/cloud/dc/dao/DataCenterDaoImpl.java | 8 +++---- .../utils/component/ComponentLocator.java | 22 +++++++++++-------- .../com/cloud/utils/db/DatabaseCallback.java | 9 ++++++-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java index 38728608fb6..4dd5ce8582d 100644 --- a/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/server/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -58,10 +58,10 @@ public class DataCenterDaoImpl extends GenericDaoBase implem protected SearchBuilder PublicZonesSearch; protected SearchBuilder ChildZonesSearch; - protected static final DataCenterIpAddressDaoImpl _ipAllocDao = ComponentLocator.inject(DataCenterIpAddressDaoImpl.class); - protected static final DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = ComponentLocator.inject(DataCenterLinkLocalIpAddressDaoImpl.class); - protected static final DataCenterVnetDaoImpl _vnetAllocDao = ComponentLocator.inject(DataCenterVnetDaoImpl.class); - protected static final PodVlanDaoImpl _podVlanAllocDao = ComponentLocator.inject(PodVlanDaoImpl.class); + protected final DataCenterIpAddressDaoImpl _ipAllocDao = ComponentLocator.inject(DataCenterIpAddressDaoImpl.class); + protected final DataCenterLinkLocalIpAddressDaoImpl _LinkLocalIpAllocDao = ComponentLocator.inject(DataCenterLinkLocalIpAddressDaoImpl.class); + protected final DataCenterVnetDaoImpl _vnetAllocDao = ComponentLocator.inject(DataCenterVnetDaoImpl.class); + protected final PodVlanDaoImpl _podVlanAllocDao = ComponentLocator.inject(PodVlanDaoImpl.class); protected long _prefix; protected Random _rand = new Random(System.currentTimeMillis()); protected TableGenerator _tgMacAddress; diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 3390fe205e5..95c81e1aeff 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -62,6 +62,8 @@ import org.xml.sax.helpers.DefaultHandler; import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.db.DatabaseCallback; +import com.cloud.utils.db.DatabaseCallbackFilter; import com.cloud.utils.db.GenericDao; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.mgmt.JmxUtil; @@ -82,8 +84,8 @@ public class ComponentLocator implements ComponentLocatorMBean { protected static final HashMap s_locators = new HashMap(); protected static final HashMap, InjectInfo> s_factories = new HashMap, InjectInfo>(); protected static Boolean s_once = false; - protected static Callback[] s_callbacks; - protected static CallbackFilter s_callbackFilter; + protected static Callback[] s_callbacks = new Callback[] { NoOp.INSTANCE, new DatabaseCallback()}; + protected static CallbackFilter s_callbackFilter = new DatabaseCallbackFilter(); protected static final List> s_interceptors = new ArrayList>(); protected HashMap> _adapterMap; @@ -189,14 +191,16 @@ public class ComponentLocator implements ComponentLocatorMBean { } synchronized(s_interceptors) { - s_callbacks = new Callback[s_interceptors.size() + 2]; - int i = 0; - s_callbacks[i++] = NoOp.INSTANCE; - s_callbacks[i++] = new InterceptorDispatcher(); - for (AnnotationInterceptor interceptor : s_interceptors) { - s_callbacks[i++] = interceptor.getCallback(); + if (s_interceptors.size() > 0) { + s_callbacks = new Callback[s_interceptors.size() + 2]; + int i = 0; + s_callbacks[i++] = NoOp.INSTANCE; + s_callbacks[i++] = new InterceptorDispatcher(); + for (AnnotationInterceptor interceptor : s_interceptors) { + s_callbacks[i++] = interceptor.getCallback(); + } + s_callbackFilter = new InterceptorFilter(); } - s_callbackFilter = new InterceptorFilter(); } XmlHandler handler = result.first(); diff --git a/utils/src/com/cloud/utils/db/DatabaseCallback.java b/utils/src/com/cloud/utils/db/DatabaseCallback.java index 623c1c1fda9..ba25e32b242 100644 --- a/utils/src/com/cloud/utils/db/DatabaseCallback.java +++ b/utils/src/com/cloud/utils/db/DatabaseCallback.java @@ -40,12 +40,17 @@ public class DatabaseCallback implements MethodInterceptor, AnnotationIntercepto @Override public boolean needToIntercept(AnnotatedElement element) { - DB db = element.getAnnotation(DB.class); + if (!(element instanceof Method)) { + return false; + + } + Method method = (Method)element; + DB db = method.getAnnotation(DB.class); if (db != null) { return db.txn(); } - Class clazz = element.getClass().getDeclaringClass(); + Class clazz = method.getDeclaringClass(); do { db = clazz.getAnnotation(DB.class); if (db != null) { From 6dc922408d04d88b0c9c45ead4f0d9fe7559da21 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 7 Jan 2011 13:41:00 -0800 Subject: [PATCH 18/25] unit test working --- api/src/com/cloud/event/ActionEvent.java | 1 - client/tomcatconf/components.xml.in | 1 + .../DefaultComponentLibrary.java | 6 --- .../utils/component/ComponentLibrary.java | 1 - .../utils/component/ComponentLocator.java | 44 ++++++++++++------- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/api/src/com/cloud/event/ActionEvent.java b/api/src/com/cloud/event/ActionEvent.java index 658d2b014ad..b890172ec77 100644 --- a/api/src/com/cloud/event/ActionEvent.java +++ b/api/src/com/cloud/event/ActionEvent.java @@ -18,5 +18,4 @@ package com.cloud.event; public @interface ActionEvent { - } diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in index f152f103fcd..5f1d7fd299e 100755 --- a/client/tomcatconf/components.xml.in +++ b/client/tomcatconf/components.xml.in @@ -23,6 +23,7 @@ documented, please contact the author. --> + diff --git a/server/src/com/cloud/configuration/DefaultComponentLibrary.java b/server/src/com/cloud/configuration/DefaultComponentLibrary.java index d1a550a5f90..d0c1b05bdd3 100644 --- a/server/src/com/cloud/configuration/DefaultComponentLibrary.java +++ b/server/src/com/cloud/configuration/DefaultComponentLibrary.java @@ -115,11 +115,9 @@ import com.cloud.user.dao.UserDaoImpl; import com.cloud.user.dao.UserStatisticsDaoImpl; import com.cloud.utils.Pair; import com.cloud.utils.component.Adapter; -import com.cloud.utils.component.AnnotationInterceptor; import com.cloud.utils.component.ComponentLibrary; import com.cloud.utils.component.ComponentLocator.ComponentInfo; import com.cloud.utils.component.Manager; -import com.cloud.utils.db.DatabaseCallback; import com.cloud.utils.db.GenericDao; import com.cloud.vm.ItWorkDaoImpl; import com.cloud.vm.UserVmManagerImpl; @@ -337,8 +335,4 @@ public class DefaultComponentLibrary implements ComponentLibrary { return factories; } - @Override - public void addInterceptors(List> interceptors) { - interceptors.add(new DatabaseCallback()); - } } diff --git a/utils/src/com/cloud/utils/component/ComponentLibrary.java b/utils/src/com/cloud/utils/component/ComponentLibrary.java index a0f0e8a3def..5ed4c9512e7 100644 --- a/utils/src/com/cloud/utils/component/ComponentLibrary.java +++ b/utils/src/com/cloud/utils/component/ComponentLibrary.java @@ -51,5 +51,4 @@ public interface ComponentLibrary { Map, Class> getFactories(); - void addInterceptors(List> interceptors); } diff --git a/utils/src/com/cloud/utils/component/ComponentLocator.java b/utils/src/com/cloud/utils/component/ComponentLocator.java index 95c81e1aeff..3bdaf05986a 100755 --- a/utils/src/com/cloud/utils/component/ComponentLocator.java +++ b/utils/src/com/cloud/utils/component/ComponentLocator.java @@ -153,9 +153,6 @@ public class ComponentLocator implements ComponentLocatorMBean { _managerMap.putAll(library.getManagers()); adapters.putAll(library.getAdapters()); _factories.putAll(library.getFactories()); - synchronized(s_interceptors) { - library.addInterceptors(s_interceptors); - } } _daoMap.putAll(handler.daos); @@ -190,19 +187,6 @@ public class ComponentLocator implements ComponentLocatorMBean { return; } - synchronized(s_interceptors) { - if (s_interceptors.size() > 0) { - s_callbacks = new Callback[s_interceptors.size() + 2]; - int i = 0; - s_callbacks[i++] = NoOp.INSTANCE; - s_callbacks[i++] = new InterceptorDispatcher(); - for (AnnotationInterceptor interceptor : s_interceptors) { - s_callbacks[i++] = interceptor.getCallback(); - } - s_callbackFilter = new InterceptorFilter(); - } - } - XmlHandler handler = result.first(); HashMap>> adapters = result.second(); try { @@ -869,6 +853,34 @@ public class ComponentLocator implements ComponentLocatorMBean { @Override public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { + if (qName.equals("interceptors") && s_interceptors.size() == 0) { + synchronized(s_interceptors){ + if (s_interceptors.size() == 0) { + String libraryName = getAttribute(atts, "library"); + try { + Class libraryClazz = Class.forName(libraryName); + InterceptorLibrary library = (InterceptorLibrary)libraryClazz.newInstance(); + library.addInterceptors(s_interceptors); + if (s_interceptors.size() > 0) { + s_callbacks = new Callback[s_interceptors.size() + 2]; + int i = 0; + s_callbacks[i++] = NoOp.INSTANCE; + s_callbacks[i++] = new InterceptorDispatcher(); + for (AnnotationInterceptor interceptor : s_interceptors) { + s_callbacks[i++] = interceptor.getCallback(); + } + s_callbackFilter = new InterceptorFilter(); + } + } catch (ClassNotFoundException e) { + throw new CloudRuntimeException("Unable to find " + libraryName, e); + } catch (InstantiationException e) { + throw new CloudRuntimeException("Unable to instantiate " + libraryName, e); + } catch (IllegalAccessException e) { + throw new CloudRuntimeException("Illegal access " + libraryName, e); + } + } + } + } if (!parse) { if (qName.equals(_serverName)) { parse = true; From 386d4a540d1513c5f5b3a321dc2b52a557a1a307 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 7 Jan 2011 13:46:20 -0800 Subject: [PATCH 19/25] merge changes --- server/src/com/cloud/network/NetworkManager.java | 2 -- server/src/com/cloud/network/NetworkManagerImpl.java | 12 ++---------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManager.java b/server/src/com/cloud/network/NetworkManager.java index 19cea4603bd..6d3896751de 100644 --- a/server/src/com/cloud/network/NetworkManager.java +++ b/server/src/com/cloud/network/NetworkManager.java @@ -141,7 +141,5 @@ public interface NetworkManager extends NetworkService { List listPodVlans(long podId); - Network getBasicZoneDefaultPublicNetwork(long zoneId); - Pair implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; } diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 7d27a7f06b4..6108150bac5 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -42,10 +42,12 @@ import com.cloud.api.commands.CreateNetworkCmd; import com.cloud.api.commands.DisassociateIPAddrCmd; import com.cloud.api.commands.ListNetworksCmd; import com.cloud.api.commands.RestartNetworkCmd; +import com.cloud.capacity.dao.CapacityDao; import com.cloud.configuration.Config; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ResourceCount.ResourceType; import com.cloud.configuration.dao.ConfigurationDao; +import com.cloud.configuration.dao.ResourceLimitDao; import com.cloud.dc.DataCenter; import com.cloud.dc.DataCenter.NetworkType; import com.cloud.dc.DataCenterVO; @@ -84,19 +86,13 @@ import com.cloud.network.Networks.TrafficType; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.IPAddressDao; import com.cloud.network.dao.NetworkDao; -<<<<<<< HEAD -import com.cloud.network.dao.RemoteAccessVpnDao; -======= ->>>>>>> changes for injectors import com.cloud.network.element.NetworkElement; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRulesManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.PortForwardingRule; -import com.cloud.network.rules.PortForwardingRuleVO; import com.cloud.network.rules.RulesManager; -import com.cloud.network.rules.dao.PortForwardingRulesDao; import com.cloud.network.vpn.RemoteAccessVpnElement; import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Availability; @@ -105,10 +101,6 @@ import com.cloud.offerings.NetworkOfferingVO; import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.resource.Resource; import com.cloud.resource.Resource.ReservationStrategy; -<<<<<<< HEAD -======= -import com.cloud.service.ServiceOfferingVO; ->>>>>>> changes for injectors import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.user.AccountVO; From be174f7f368e0779149fff753d627a2b0f04f11c Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 7 Jan 2011 13:29:11 -0800 Subject: [PATCH 20/25] correct checking answer --- server/src/com/cloud/agent/manager/AgentManagerImpl.java | 2 +- .../cloud/consoleproxy/AgentBasedConsoleProxyManager.java | 2 +- server/src/com/cloud/server/ManagementServerImpl.java | 2 +- server/src/com/cloud/storage/StorageManagerImpl.java | 8 +++----- .../storage/secondary/SecondaryStorageManagerImpl.java | 8 ++++---- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java index b908ae4d341..f0a50327f00 100755 --- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -1531,7 +1531,7 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, Long dcId = host.getDataCenterId(); ReadyCommand ready = new ReadyCommand(dcId); Answer answer = easySend(hostId, ready); - if (answer == null) { + if (answer == null || !answer.getResult()) { // this is tricky part for secondary storage // make it as disconnected, wait for secondary storage VM to be up // return the attache instead of null, even it is disconnectede diff --git a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java index c953144543c..e77fec8d2e4 100644 --- a/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java +++ b/server/src/com/cloud/consoleproxy/AgentBasedConsoleProxyManager.java @@ -91,7 +91,7 @@ public class AgentBasedConsoleProxyManager implements ConsoleProxyManager, Virtu return -1; } GetVncPortAnswer answer = (GetVncPortAnswer) _agentMgr.easySend(vm.getHostId(), new GetVncPortCommand(vm.getId(), vm.getName())); - return answer == null ? -1 : answer.getPort(); + return (answer == null || !answer.getResult()) ? -1 : answer.getPort(); } @Override diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 20944dcd134..8c042489443 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2729,7 +2729,7 @@ public class ManagementServerImpl implements ManagementServer { } GetVncPortAnswer answer = (GetVncPortAnswer) _agentMgr.easySend(vm.getHostId(), new GetVncPortCommand(vm.getId(), vm.getInstanceName())); - if(answer != null) { + if(answer != null && answer.getResult()) { return new Pair(answer.getAddress(), answer.getPort()); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 73c90d14731..74c5198cb4f 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -1477,11 +1477,9 @@ public class StorageManagerImpl implements StorageManager, StorageService, Manag DeleteStoragePoolCommand cmd = new DeleteStoragePoolCommand(sPool); final Answer answer = _agentMgr.easySend(host.getHostId(), cmd); - if (answer != null) { - if (answer.getResult() == true) { - deleteFlag = true; - break; - } + if (answer != null && answer.getResult()) { + deleteFlag = true; + break; } } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 4b47bb2df79..ace1022cd41 100644 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -315,7 +315,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V setupCmd.setCopyPassword(copyPasswd); setupCmd.setCopyUserName(TemplateConstants.DEFAULT_HTTP_AUTH_USER); Answer answer = _agentMgr.easySend(storageHost.getId(), setupCmd); - if (answer != null) { + if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully programmed http auth into " + secStorageVm.getName()); } @@ -359,7 +359,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V } } Answer answer = _agentMgr.easySend(storageHost.getId(), cpc); - if (answer != null) { + if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully programmed firewall rules into " + secStorageVm.getName()); } @@ -1083,7 +1083,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V final RebootCommand cmd = new RebootCommand(secStorageVm.getInstanceName()); final Answer answer = _agentMgr.easySend(secStorageVm.getHostId(), cmd); - if (answer != null) { + if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully reboot secondary storage vm " + secStorageVm.getName()); } @@ -1274,7 +1274,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V MigrateCommand cmd = new MigrateCommand(secStorageVm.getInstanceName(), host.getPrivateIpAddress(), false); Answer answer = _agentMgr.easySend(fromHost.getId(), cmd); - if (answer == null) { + if (answer == null || !answer.getResult()) { return false; } From 1044a99756b64fe1980f5f07db880454a07976d5 Mon Sep 17 00:00:00 2001 From: anthony Date: Fri, 7 Jan 2011 13:49:12 -0800 Subject: [PATCH 21/25] check answer --- .../src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 0b4819018b8..129cd3f90a2 100644 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -1531,7 +1531,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx final RebootCommand cmd = new RebootCommand(proxy.getInstanceName()); final Answer answer = _agentMgr.easySend(proxy.getHostId(), cmd); - if (answer != null) { + if (answer != null && answer.getResult()) { if (s_logger.isDebugEnabled()) { s_logger.debug("Successfully reboot console proxy " + proxy.getName()); } @@ -1708,7 +1708,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx MigrateCommand cmd = new MigrateCommand(proxy.getInstanceName(), host.getPrivateIpAddress(), false); Answer answer = _agentMgr.easySend(fromHost.getId(), cmd); - if (answer == null) { + if (answer == null || !answer.getResult()) { return false; } From a1bdec8fa1d5bb5c6d646375a6d8446e192764ca Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 7 Jan 2011 14:08:31 -0800 Subject: [PATCH 22/25] add missing libraries --- .../DefaultInterceptorLibrary.java | 32 +++++++++++++++++++ .../utils/component/InterceptorLibrary.java | 26 +++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 server/src/com/cloud/configuration/DefaultInterceptorLibrary.java create mode 100644 utils/src/com/cloud/utils/component/InterceptorLibrary.java diff --git a/server/src/com/cloud/configuration/DefaultInterceptorLibrary.java b/server/src/com/cloud/configuration/DefaultInterceptorLibrary.java new file mode 100644 index 00000000000..846f8d0533b --- /dev/null +++ b/server/src/com/cloud/configuration/DefaultInterceptorLibrary.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.configuration; + +import java.util.List; + +import com.cloud.utils.component.AnnotationInterceptor; +import com.cloud.utils.component.InterceptorLibrary; +import com.cloud.utils.db.DatabaseCallback; + +public class DefaultInterceptorLibrary implements InterceptorLibrary { + + @Override + public void addInterceptors(List> interceptors) { + interceptors.add(new DatabaseCallback()); + } +} diff --git a/utils/src/com/cloud/utils/component/InterceptorLibrary.java b/utils/src/com/cloud/utils/component/InterceptorLibrary.java new file mode 100644 index 00000000000..1da4ffd746b --- /dev/null +++ b/utils/src/com/cloud/utils/component/InterceptorLibrary.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2010 Cloud.com, Inc. All rights reserved. + * + * This software is licensed under the GNU General Public License v3 or later. + * + * It is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +package com.cloud.utils.component; + +import java.util.List; + +public interface InterceptorLibrary { + + void addInterceptors(List> interceptors); + +} From 335e81cc52971ffc7a9bda5d1ad79e4c95d488eb Mon Sep 17 00:00:00 2001 From: alena Date: Fri, 7 Jan 2011 14:03:29 -0800 Subject: [PATCH 23/25] Fixed listNetworks for regular user to return system network information --- server/src/com/cloud/network/NetworkManagerImpl.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 6108150bac5..6020d0efc0a 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1430,6 +1430,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag isSystem = false; } + //Account/domainId parameters and isSystem are mutually exclusive + if (isSystem && (accountName != null || domainId != null)) { + throw new InvalidParameterValueException("System network belongs to system, account and domainId parameters can't be specified"); + } + if (_accountMgr.isAdmin(account.getType())) { if (domainId != null) { if ((account != null) && !_domainDao.isChildDomain(account.getDomainId(), domainId)) { @@ -1492,7 +1497,8 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (type != null) { sc.addAnd("guestType", SearchCriteria.Op.EQ, type); } - if (account.getType() != Account.ACCOUNT_TYPE_ADMIN || (accountName != null && domainId != null)) { + + if (!isSystem && (account.getType() != Account.ACCOUNT_TYPE_ADMIN || (accountName != null && domainId != null))) { sc.addAnd("accountId", SearchCriteria.Op.EQ, accountId); } From 70241d78ecbca8964c770e623af53ffddd6e34e4 Mon Sep 17 00:00:00 2001 From: Chiradeep Vittal Date: Fri, 7 Jan 2011 14:28:18 -0800 Subject: [PATCH 24/25] bug 6694: trim excess fat from passed in parameters status 6694: resolved fixed --- .../api/commands/CreatePortForwardingRuleCmd.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java index 17bc361f43c..2686617a9fb 100644 --- a/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java +++ b/api/src/com/cloud/api/commands/CreatePortForwardingRuleCmd.java @@ -74,11 +74,11 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements @Override public String getProtocol() { - return protocol; + return protocol.trim(); } public String getPublicPort() { - return publicPort; + return publicPort.trim(); } @Override @@ -133,17 +133,17 @@ public class CreatePortForwardingRuleCmd extends BaseAsyncCreateCmd implements @Override public Ip getSourceIpAddress() { - return new Ip(ipAddress); + return new Ip(ipAddress.trim()); } @Override public int getSourcePortStart() { - return Integer.parseInt(publicPort); + return Integer.parseInt(publicPort.trim()); } @Override public int getSourcePortEnd() { - return Integer.parseInt(publicPort); + return Integer.parseInt(publicPort.trim()); } @Override From e6dd262657bb8f5e7798f9e73057f28936c12f18 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 7 Jan 2011 14:42:52 -0800 Subject: [PATCH 25/25] bug 6361: correct parameter name of API response. --- ui/scripts/cloud.core.securitygroup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/scripts/cloud.core.securitygroup.js b/ui/scripts/cloud.core.securitygroup.js index b1c8aa3d74b..a96682e480a 100644 --- a/ui/scripts/cloud.core.securitygroup.js +++ b/ui/scripts/cloud.core.securitygroup.js @@ -221,7 +221,7 @@ function securityGroupJsonToDetailsTab() { dataType: "json", async: false, success: function(json) { - var items = json.listsecurityGroupsresponse.securitygroup; + var items = json.listsecuritygroupsresponse.securitygroup; if(items != null && items.length > 0) { jsonObj = items[0]; $midmenuItem1.data("jsonObj", jsonObj); @@ -264,7 +264,7 @@ function securityGroupJsonToIngressRuleTab() { data: createURL("command=listSecurityGroups"+"&domainid="+securityGroupObj.domainid+"&account="+securityGroupObj.account+"&securitygroupname="+securityGroupObj.name), dataType: "json", success: function(json) { - var securityGroupObj = json.listsecurityGroupsresponse.securitygroup[0]; + var securityGroupObj = json.listsecuritygroupsresponse.securitygroup[0]; var items = securityGroupObj.ingressrule; var $container = $thisTab.find("#tab_container").empty(); if (items != null && items.length > 0) {