This is an automated email from the ASF dual-hosted git repository. rafael pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push: new b08f9e0 [CLOUDSTACK-10301] Allow updating the network ACL list name and Description (#2462) b08f9e0 is described below commit b08f9e053ff301d59dc81283704be37dc1871905 Author: Rafael Weingärtner <rafaelweingart...@gmail.com> AuthorDate: Tue Apr 10 08:46:52 2018 -0300 [CLOUDSTACK-10301] Allow updating the network ACL list name and Description (#2462) * [CLOUDSTACK-10301] Allow updating the network ACL list name and description * Fixes suggested by Daan --- .../com/cloud/network/vpc/NetworkACLService.java | 5 +- .../user/network/UpdateNetworkACLListCmd.java | 22 ++++- .../java/com/cloud/network/vpc/NetworkACLVO.java | 8 ++ .../cloud/network/vpc/NetworkACLServiceImpl.java | 25 ++++-- .../network/vpc/NetworkACLServiceImplTest.java | 94 +++++++++++++++++++--- ui/l10n/ar.js | 1 + ui/l10n/ca.js | 1 + ui/l10n/de_DE.js | 1 + ui/l10n/en.js | 1 + ui/l10n/es.js | 1 + ui/l10n/fr_FR.js | 1 + ui/l10n/hu.js | 1 + ui/l10n/it_IT.js | 1 + ui/l10n/ja_JP.js | 1 + ui/l10n/ko_KR.js | 1 + ui/l10n/nb_NO.js | 1 + ui/l10n/nl_NL.js | 1 + ui/l10n/pl.js | 1 + ui/l10n/pt_BR.js | 1 + ui/l10n/ru_RU.js | 1 + ui/l10n/zh_CN.js | 1 + ui/scripts/ui/widgets/detailView.js | 2 +- ui/scripts/vpc.js | 35 +++++++- 23 files changed, 180 insertions(+), 27 deletions(-) diff --git a/api/src/main/java/com/cloud/network/vpc/NetworkACLService.java b/api/src/main/java/com/cloud/network/vpc/NetworkACLService.java index dd7c862..378b15c 100644 --- a/api/src/main/java/com/cloud/network/vpc/NetworkACLService.java +++ b/api/src/main/java/com/cloud/network/vpc/NetworkACLService.java @@ -22,6 +22,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkACLListsCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkACLsCmd; import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLItemCmd; +import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLListCmd; import com.cloud.exception.ResourceUnavailableException; import com.cloud.utils.Pair; @@ -38,7 +39,7 @@ public interface NetworkACLService { NetworkACL getNetworkACL(long id); /** - * List NetworkACLs by Id/Name/Network or Vpc it belongs to + * List NetworkACLs by Id/Name/Network or VPC it belongs to */ Pair<List<? extends NetworkACL>, Integer> listNetworkACLs(ListNetworkACLListsCmd cmd); @@ -87,6 +88,6 @@ public interface NetworkACLService { */ boolean replaceNetworkACLonPrivateGw(long aclId, long privateGatewayId) throws ResourceUnavailableException; - NetworkACL updateNetworkACL(Long id, String customId, Boolean forDisplay); + NetworkACL updateNetworkACL(UpdateNetworkACLListCmd updateNetworkACLListCmd); } diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java index aa1f557..22eaf21 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkACLListCmd.java @@ -31,8 +31,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.vpc.NetworkACL; import com.cloud.user.Account; -@APICommand(name = "updateNetworkACLList", description = "Updates network ACL list", responseObject = SuccessResponse.class, since = "4.4", - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = "updateNetworkACLList", description = "Updates network ACL list", responseObject = SuccessResponse.class, since = "4.4", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class UpdateNetworkACLListCmd extends BaseAsyncCustomIdCmd { public static final Logger s_logger = Logger.getLogger(UpdateNetworkACLListCmd.class.getName()); private static final String s_name = "updatenetworkacllistresponse"; @@ -44,9 +43,16 @@ public class UpdateNetworkACLListCmd extends BaseAsyncCustomIdCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = NetworkACLResponse.class, required = true, description = "the ID of the network ACL") private Long id; - @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the list to the end user or not", since = "4.4", authorized = {RoleType.Admin}) + @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the list to the end user or not", since = "4.4", authorized = { + RoleType.Admin}) private Boolean display; + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "Name of the network ACL list") + private String name; + + @Parameter(name = ApiConstants.DESCRIPTION, type = CommandType.STRING, description = "Description of the network ACL list") + private String description; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -85,7 +91,7 @@ public class UpdateNetworkACLListCmd extends BaseAsyncCustomIdCmd { @Override public void execute() throws ResourceUnavailableException { - NetworkACL acl = _networkACLService.updateNetworkACL(id, this.getCustomId(), getDisplay()); + NetworkACL acl = _networkACLService.updateNetworkACL(this); NetworkACLResponse aclResponse = _responseGenerator.createNetworkACLResponse(acl); setResponseObject(aclResponse); aclResponse.setResponseName(getCommandName()); @@ -97,4 +103,12 @@ public class UpdateNetworkACLListCmd extends BaseAsyncCustomIdCmd { _uuidMgr.checkUuid(this.getCustomId(), NetworkACL.class); } } + + public String getDescription() { + return description; + } + + public String getName() { + return name; + } } diff --git a/engine/schema/src/main/java/com/cloud/network/vpc/NetworkACLVO.java b/engine/schema/src/main/java/com/cloud/network/vpc/NetworkACLVO.java index fb6a239..4eaa2b5 100644 --- a/engine/schema/src/main/java/com/cloud/network/vpc/NetworkACLVO.java +++ b/engine/schema/src/main/java/com/cloud/network/vpc/NetworkACLVO.java @@ -101,4 +101,12 @@ public class NetworkACLVO implements NetworkACL { public boolean isDisplay() { return display; } + + public void setDescription(String description) { + this.description = description; + } + + public void setName(String name) { + this.name = name; + } } diff --git a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java index 5369ffa..18d3f8d 100644 --- a/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/NetworkACLServiceImpl.java @@ -28,6 +28,7 @@ import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkACLListsCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkACLsCmd; import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLItemCmd; +import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLListCmd; import org.apache.cloudstack.context.CallContext; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -907,20 +908,30 @@ public class NetworkACLServiceImpl extends ManagerBase implements NetworkACLServ @Override @ActionEvent(eventType = EventTypes.EVENT_NETWORK_ACL_UPDATE, eventDescription = "updating network acl", async = true) - public NetworkACL updateNetworkACL(final Long id, final String customId, final Boolean forDisplay) { - final NetworkACLVO acl = _networkACLDao.findById(id); - final Vpc vpc = _entityMgr.findById(Vpc.class, acl.getVpcId()); - final Account caller = CallContext.current().getCallingAccount(); + public NetworkACL updateNetworkACL(UpdateNetworkACLListCmd updateNetworkACLListCmd) { + Long id = updateNetworkACLListCmd.getId(); + NetworkACLVO acl = _networkACLDao.findById(id); + Vpc vpc = _entityMgr.findById(Vpc.class, acl.getVpcId()); + + Account caller = CallContext.current().getCallingAccount(); _accountMgr.checkAccess(caller, null, true, vpc); - if (customId != null) { + String name = updateNetworkACLListCmd.getName(); + if (StringUtils.isNotBlank(name)) { + acl.setName(name); + } + String description = updateNetworkACLListCmd.getDescription(); + if (StringUtils.isNotBlank(description)) { + acl.setDescription(description); + } + String customId = updateNetworkACLListCmd.getCustomId(); + if (StringUtils.isNotBlank(customId)) { acl.setUuid(customId); } - + Boolean forDisplay = updateNetworkACLListCmd.getDisplay(); if (forDisplay != null) { acl.setDisplay(forDisplay); } - _networkACLDao.update(id, acl); return _networkACLDao.findById(id); } diff --git a/server/src/test/java/com/cloud/network/vpc/NetworkACLServiceImplTest.java b/server/src/test/java/com/cloud/network/vpc/NetworkACLServiceImplTest.java index ed8602b..540a104 100644 --- a/server/src/test/java/com/cloud/network/vpc/NetworkACLServiceImplTest.java +++ b/server/src/test/java/com/cloud/network/vpc/NetworkACLServiceImplTest.java @@ -23,6 +23,7 @@ import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.user.network.CreateNetworkACLCmd; import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLItemCmd; +import org.apache.cloudstack.api.command.user.network.UpdateNetworkACLListCmd; import org.apache.cloudstack.context.CallContext; import org.junit.Assert; import org.junit.Before; @@ -46,12 +47,14 @@ import com.cloud.network.NetworkModel; import com.cloud.network.dao.NetworkVO; import com.cloud.network.vpc.NetworkACLItem.Action; import com.cloud.network.vpc.NetworkACLItem.TrafficType; +import com.cloud.network.vpc.dao.NetworkACLDao; import com.cloud.user.Account; import com.cloud.user.AccountManager; import com.cloud.utils.db.EntityManager; import com.cloud.utils.exception.CloudRuntimeException; @RunWith(PowerMockRunner.class) +@PrepareForTest(CallContext.class) public class NetworkACLServiceImplTest { @Spy @@ -64,9 +67,11 @@ public class NetworkACLServiceImplTest { @Mock private NetworkACLItemDao networkAclItemDaoMock; @Mock - private EntityManager EntityManagerMock; + private EntityManager entityManagerMock; @Mock - private AccountManager AccountManager; + private AccountManager accountManagerMock; + @Mock + private NetworkACLDao networkAclDaoMock; @Mock private CreateNetworkACLCmd createNetworkAclCmdMock; @@ -78,13 +83,22 @@ public class NetworkACLServiceImplTest { private NetworkACL networkAclMock; @Mock private NetworkACLItemVO networkAclItemVoMock; + @Mock + private NetworkACLVO networkACLVOMock; + @Mock + private UpdateNetworkACLListCmd updateNetworkACLListCmdMock; private Long networkAclMockId = 1L; private Long networkOfferingMockId = 2L; private Long networkMockVpcMockId = 3L; + private long networkAclListId = 1l; @Before public void befoteTest() { + PowerMockito.mockStatic(CallContext.class); + PowerMockito.when(CallContext.current()).thenReturn(Mockito.mock(CallContext.class)); + + Mockito.when(networkAclDaoMock.findById(networkAclListId)).thenReturn(networkACLVOMock); Mockito.when(createNetworkAclCmdMock.getNetworkId()).thenReturn(1L); Mockito.when(createNetworkAclCmdMock.getProtocol()).thenReturn("tcp"); @@ -215,7 +229,7 @@ public class NetworkACLServiceImplTest { @Test(expected = InvalidParameterValueException.class) public void createAclListForNetworkAndReturnAclListIdTestServicesSupportedByNetworkOfferingButVpcNotFound() { Mockito.doReturn(true).when(networkModelMock).areServicesSupportedByNetworkOffering(networkOfferingMockId, Network.Service.NetworkACL); - Mockito.doReturn(null).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(null).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); networkAclServiceImpl.createAclListForNetworkAndReturnAclListId(createNetworkAclCmdMock, networkMock); } @@ -223,7 +237,7 @@ public class NetworkACLServiceImplTest { @Test(expected = CloudRuntimeException.class) public void createAclListForNetworkAndReturnAclListIdTestCreateNetworkAclReturnsNull() { Mockito.doReturn(true).when(networkModelMock).areServicesSupportedByNetworkOffering(networkOfferingMockId, Network.Service.NetworkACL); - Mockito.doReturn(Mockito.mock(Vpc.class)).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(Mockito.mock(Vpc.class)).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); Mockito.doReturn(null).when(networkAclManager).createNetworkACL(Mockito.anyString(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyBoolean()); networkAclServiceImpl.createAclListForNetworkAndReturnAclListId(createNetworkAclCmdMock, networkMock); @@ -232,7 +246,7 @@ public class NetworkACLServiceImplTest { @Test(expected = CloudRuntimeException.class) public void createAclListForNetworkAndReturnAclListIdTestAclNetworkIsCreatedButNotApplied() throws ResourceUnavailableException { Mockito.doReturn(true).when(networkModelMock).areServicesSupportedByNetworkOffering(networkOfferingMockId, Network.Service.NetworkACL); - Mockito.doReturn(Mockito.mock(Vpc.class)).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(Mockito.mock(Vpc.class)).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); Mockito.doReturn(Mockito.mock(NetworkACL.class)).when(networkAclManager).createNetworkACL(Mockito.anyString(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyBoolean()); Mockito.doReturn(false).when(networkAclManager).replaceNetworkACL(Mockito.any(NetworkACL.class), Mockito.any(NetworkVO.class)); @@ -246,7 +260,7 @@ public class NetworkACLServiceImplTest { @Test(expected = CloudRuntimeException.class) public void createAclListForNetworkAndReturnAclListIdTestAclNetworkIsCreatedButNotAppliedWithException() throws ResourceUnavailableException { Mockito.doReturn(true).when(networkModelMock).areServicesSupportedByNetworkOffering(networkOfferingMockId, Network.Service.NetworkACL); - Mockito.doReturn(Mockito.mock(Vpc.class)).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(Mockito.mock(Vpc.class)).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); Mockito.doReturn(Mockito.mock(NetworkACL.class)).when(networkAclManager).createNetworkACL(Mockito.anyString(), Mockito.anyString(), Mockito.anyLong(), Mockito.anyBoolean()); Mockito.doThrow(ResourceUnavailableException.class).when(networkAclManager).replaceNetworkACL(Mockito.any(NetworkACL.class), Mockito.any(NetworkVO.class)); @@ -261,7 +275,7 @@ public class NetworkACLServiceImplTest { @Test public void createAclListForNetworkAndReturnAclListIdTestAclIsCreatedAndAppliedWithSuccess() throws ResourceUnavailableException { Mockito.doReturn(true).when(networkModelMock).areServicesSupportedByNetworkOffering(networkOfferingMockId, Network.Service.NetworkACL); - Mockito.doReturn(Mockito.mock(Vpc.class)).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(Mockito.mock(Vpc.class)).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); NetworkACL networkAclMock = Mockito.mock(NetworkACL.class); Long expectedNetworkAclId = 5L; @@ -339,7 +353,7 @@ public class NetworkACLServiceImplTest { @Test(expected = InvalidParameterValueException.class) public void validateNetworkAclTestAclNotDefaulWithoutVpc() { Mockito.when(networkAclMock.getId()).thenReturn(3L); - Mockito.doReturn(null).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doReturn(null).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); ; networkAclServiceImpl.validateNetworkAcl(networkAclMock); @@ -357,13 +371,13 @@ public class NetworkACLServiceImplTest { Mockito.when(networkAclMock.getId()).thenReturn(3L); Mockito.when(networkAclMock.getVpcId()).thenReturn(networkMockVpcMockId); - Mockito.doReturn(Mockito.mock(Vpc.class)).when(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); - Mockito.doNothing().when(AccountManager).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); + Mockito.doReturn(Mockito.mock(Vpc.class)).when(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.doNothing().when(accountManagerMock).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); networkAclServiceImpl.validateNetworkAcl(networkAclMock); - Mockito.verify(EntityManagerMock).findById(Vpc.class, networkMockVpcMockId); - Mockito.verify(AccountManager).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); + Mockito.verify(entityManagerMock).findById(Vpc.class, networkMockVpcMockId); + Mockito.verify(accountManagerMock).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); PowerMockito.verifyStatic(); CallContext.current(); @@ -808,4 +822,60 @@ public class NetworkACLServiceImplTest { Mockito.verify(networkAclServiceImpl).validateAndCreateNetworkAclRuleAction("deny"); } + @Test + @PrepareForTest(CallContext.class) + public void updateNetworkACLTestParametersNotNull() { + String name = "name"; + String description = "desc"; + String customId = "customId"; + + Mockito.when(updateNetworkACLListCmdMock.getName()).thenReturn(name); + Mockito.when(updateNetworkACLListCmdMock.getDescription()).thenReturn(description); + Mockito.when(updateNetworkACLListCmdMock.getCustomId()).thenReturn(customId); + Mockito.when(updateNetworkACLListCmdMock.getId()).thenReturn(networkAclListId); + Mockito.when(updateNetworkACLListCmdMock.getDisplay()).thenReturn(false); + + networkAclServiceImpl.updateNetworkACL(updateNetworkACLListCmdMock); + + InOrder inOrder = Mockito.inOrder(networkAclDaoMock, entityManagerMock, entityManagerMock, accountManagerMock, networkACLVOMock); + + inOrder.verify(networkAclDaoMock).findById(networkAclListId); + inOrder.verify(entityManagerMock).findById(Mockito.eq(Vpc.class), Mockito.anyLong()); + inOrder.verify(accountManagerMock).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); + + inOrder.verify(networkACLVOMock).setName(name); + inOrder.verify(networkACLVOMock).setDescription(description); + inOrder.verify(networkACLVOMock).setUuid(customId); + inOrder.verify(networkACLVOMock).setDisplay(false); + + inOrder.verify(networkAclDaoMock).update(networkAclListId, networkACLVOMock); + inOrder.verify(networkAclDaoMock).findById(networkAclListId); + } + + @Test + @PrepareForTest(CallContext.class) + public void updateNetworkACLTestParametersWithNullValues() { + Mockito.when(updateNetworkACLListCmdMock.getName()).thenReturn(null); + Mockito.when(updateNetworkACLListCmdMock.getDescription()).thenReturn(null); + Mockito.when(updateNetworkACLListCmdMock.getCustomId()).thenReturn(null); + Mockito.when(updateNetworkACLListCmdMock.getId()).thenReturn(networkAclListId); + Mockito.when(updateNetworkACLListCmdMock.getDisplay()).thenReturn(null); + + networkAclServiceImpl.updateNetworkACL(updateNetworkACLListCmdMock); + + InOrder inOrder = Mockito.inOrder(networkAclDaoMock, entityManagerMock, entityManagerMock, accountManagerMock, networkACLVOMock); + + inOrder.verify(networkAclDaoMock).findById(networkAclListId); + inOrder.verify(entityManagerMock).findById(Mockito.eq(Vpc.class), Mockito.anyLong()); + inOrder.verify(accountManagerMock).checkAccess(Mockito.any(Account.class), Mockito.isNull(AccessType.class), Mockito.eq(true), Mockito.any(Vpc.class)); + + Mockito.verify(networkACLVOMock, Mockito.times(0)).setName(null); + inOrder.verify(networkACLVOMock, Mockito.times(0)).setDescription(null); + inOrder.verify(networkACLVOMock, Mockito.times(0)).setUuid(null); + inOrder.verify(networkACLVOMock, Mockito.times(0)).setDisplay(false); + + inOrder.verify(networkAclDaoMock).update(networkAclListId, networkACLVOMock); + inOrder.verify(networkAclDaoMock).findById(networkAclListId); + } + } diff --git a/ui/l10n/ar.js b/ui/l10n/ar.js index db0dab0..c8129b1 100644 --- a/ui/l10n/ar.js +++ b/ui/l10n/ar.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "إضافة حسابات", "label.add.accounts.to": "إضافة حسابات إلى", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Add new affinity group", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/ca.js b/ui/l10n/ca.js index 5d98467..5f4f55b 100644 --- a/ui/l10n/ca.js +++ b/ui/l10n/ca.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Afegir comptes", "label.add.accounts.to": "Afegir comptes a", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Add new affinity group", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/de_DE.js b/ui/l10n/de_DE.js index 4decf80..382f7c4 100644 --- a/ui/l10n/de_DE.js +++ b/ui/l10n/de_DE.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Konten hinzufügen", "label.add.accounts.to": "Konten hinzufügen zu", "label.add.acl.list": "ACL-Liste hinzufügen", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Neue Affinitätsgruppe hinzufügen", "label.add.baremetal.dhcp.device": "Baremetal DHCP-Gerät hinzufügen", "label.add.baremetal.rack.configuration": "Baremetal Rackkonfiguration hinzufügen", diff --git a/ui/l10n/en.js b/ui/l10n/en.js index ae7ca7b..342e883 100644 --- a/ui/l10n/en.js +++ b/ui/l10n/en.js @@ -320,6 +320,7 @@ var dictionary = { "label.add.accounts":"Add accounts", "label.add.accounts.to":"Add accounts to", "label.add.acl.list":"Add ACL List", +"label.edit.acl.list": "Edit ACL List", "label.add.affinity.group":"Add new affinity group", "label.add.baremetal.dhcp.device":"Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration":"Add Baremetal Rack Configuration", diff --git a/ui/l10n/es.js b/ui/l10n/es.js index cbdf787..2f4727f 100644 --- a/ui/l10n/es.js +++ b/ui/l10n/es.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Agregar Cuentas", "label.add.accounts.to": "Agregar Cuentas a", "label.add.acl.list": "Agregar Lista ACL", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Agregar un nuevo grupo de afinidad", "label.add.baremetal.dhcp.device": "Agregar dispositivo DHCP Baremetal", "label.add.baremetal.rack.configuration": "Agregar Configuración de Rack Baremetal", diff --git a/ui/l10n/fr_FR.js b/ui/l10n/fr_FR.js index 42f93c0..be31c1c 100644 --- a/ui/l10n/fr_FR.js +++ b/ui/l10n/fr_FR.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Ajouter des comptes", "label.add.accounts.to": "Ajouter des comptes sur", "label.add.acl.list": "Ajouter Liste ACL", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Ajouter nouveau groupe d'affinité", "label.add.baremetal.dhcp.device": "Ajouter un DHCP Baremetal", "label.add.baremetal.rack.configuration": "Ajouter Configuration Rack Baremetal", diff --git a/ui/l10n/hu.js b/ui/l10n/hu.js index 41edd47..8337b5a 100644 --- a/ui/l10n/hu.js +++ b/ui/l10n/hu.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Számlák felvétele", "label.add.accounts.to": "Számla felvétele:", "label.add.acl.list": "ACL lista felvétele", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Új affinítási csoport felvétele", "label.add.baremetal.dhcp.device": "Baremetal DHCP eszköz felvétele", "label.add.baremetal.rack.configuration": "Baremetal rack konfiguráció felvétele", diff --git a/ui/l10n/it_IT.js b/ui/l10n/it_IT.js index 30d0b32..a54f177 100644 --- a/ui/l10n/it_IT.js +++ b/ui/l10n/it_IT.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Aggiungere utenti", "label.add.accounts.to": "Aggiungere utenti a", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Aggiungere un nuovo gruppo di affinità", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/ja_JP.js b/ui/l10n/ja_JP.js index 24f99e7..d02b62c 100644 --- a/ui/l10n/ja_JP.js +++ b/ui/l10n/ja_JP.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "アカウントの追加", "label.add.accounts.to": "アカウントの追加先:", "label.add.acl.list": "ACL 一覧の追加", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "新しいアフィニティ グループの追加", "label.add.baremetal.dhcp.device": "ベアメタル DHCP デバイスの追加", "label.add.baremetal.rack.configuration": "ベアメタルラック設定の追加", diff --git a/ui/l10n/ko_KR.js b/ui/l10n/ko_KR.js index 19d80fb..731ccac 100644 --- a/ui/l10n/ko_KR.js +++ b/ui/l10n/ko_KR.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "계정 정보 추가", "label.add.accounts.to": "계정 정보 추가:", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Add new affinity group", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/nb_NO.js b/ui/l10n/nb_NO.js index 6adc995..7785ea8 100644 --- a/ui/l10n/nb_NO.js +++ b/ui/l10n/nb_NO.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Legg til kontoer", "label.add.accounts.to": "Legg kontoer til", "label.add.acl.list": "Legg til ACL liste", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Legg til affinitetsgruppe", "label.add.baremetal.dhcp.device": "Legg Til Barmetall DHCP Enhet", "label.add.baremetal.rack.configuration": "Legg Til Barmetall Rack Konfigurering", diff --git a/ui/l10n/nl_NL.js b/ui/l10n/nl_NL.js index f460214..1b3fd0e 100644 --- a/ui/l10n/nl_NL.js +++ b/ui/l10n/nl_NL.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Voeg accounts toe", "label.add.accounts.to": "Voeg accounts toe aan", "label.add.acl.list": "voeg een ACL lijst toe", + "label.edit.acl.list": "Verander een ACL lijst", "label.add.affinity.group": "Nieuwe affinity groep toevoegen", "label.add.baremetal.dhcp.device": "Voeg Baremetal DHCP Apparaat toe", "label.add.baremetal.rack.configuration": "voeg baremetal rek configuratie toe", diff --git a/ui/l10n/pl.js b/ui/l10n/pl.js index 0d89f1e..6cb486b 100644 --- a/ui/l10n/pl.js +++ b/ui/l10n/pl.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Dodaj konta", "label.add.accounts.to": "Dodaj konto do", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Add new affinity group", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/pt_BR.js b/ui/l10n/pt_BR.js index 52066c3..04d129c 100644 --- a/ui/l10n/pt_BR.js +++ b/ui/l10n/pt_BR.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Adicionar contas", "label.add.accounts.to": "Adicionar contas para", "label.add.acl.list": "Adiciona Lista ACL", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Adicionar um grupo de afinidade", "label.add.baremetal.dhcp.device": "Adiciona Dispositivo DHCP Baremetal", "label.add.baremetal.rack.configuration": "Adicionar Configuração de Rack de Baremetal", diff --git a/ui/l10n/ru_RU.js b/ui/l10n/ru_RU.js index b297b40..5d3d3de 100644 --- a/ui/l10n/ru_RU.js +++ b/ui/l10n/ru_RU.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "Добавить учётные записи", "label.add.accounts.to": "Добавить учётные записи", "label.add.acl.list": "Add ACL List", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "Добавить новую affinity group", "label.add.baremetal.dhcp.device": "Add Baremetal DHCP Device", "label.add.baremetal.rack.configuration": "Add Baremetal Rack Configuration", diff --git a/ui/l10n/zh_CN.js b/ui/l10n/zh_CN.js index c6965c6..e733b44 100644 --- a/ui/l10n/zh_CN.js +++ b/ui/l10n/zh_CN.js @@ -318,6 +318,7 @@ var dictionary = { "label.add.accounts": "添加帐户", "label.add.accounts.to": "添加帐户至", "label.add.acl.list": "添加 ACL 列表", + "label.edit.acl.list": "Edit ACL List", "label.add.affinity.group": "添加新关联性组", "label.add.baremetal.dhcp.device": "添加裸机 DHCP 设备", "label.add.baremetal.rack.configuration": "添加 Baremetal Rack 配置", diff --git a/ui/scripts/ui/widgets/detailView.js b/ui/scripts/ui/widgets/detailView.js index 2ce72a2..350ee83 100644 --- a/ui/scripts/ui/widgets/detailView.js +++ b/ui/scripts/ui/widgets/detailView.js @@ -606,7 +606,7 @@ } else { $loading.appendTo($detailView); cloudStack.ui.notifications.add( - $.extend(true, {}, action.notification, notificationArgs), + $.extend(true, {}, notificationArgs, action.notification), function(args) { replaceListViewItem($detailView, data); diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js index 7eb589e..d7980c9 100644 --- a/ui/scripts/vpc.js +++ b/ui/scripts/vpc.js @@ -1330,6 +1330,37 @@ notification: { poll: pollAsyncJobResult } + }, + edit: { + label: 'label.edit.acl.list', + action: function(args) { + var data = args.data; + data.id = args.context.aclLists[0].id; + $.ajax({ + url: createURL('updateNetworkACLList'), + type: "POST", + data: data, + success: function(json) { + var jid = json.updatenetworkacllistresponse.jobid; + args.response.success({ + _custom: { + jobId: jid, + getUpdatedItem: function() { + $(window).trigger('cloudStack.fullRefresh'); + jQuery('div[id=breadcrumbs] ul:visible li span').last().html(data.name); + } + } + }); + }, + error: function(json) { + args.response.error(parseXMLHttpResponse(json)); + } + }); + }, + notification: { + poll: pollAsyncJobResult, + desc: 'label.edit.acl.list' + } } }, @@ -1342,7 +1373,8 @@ isEditable: true }, description: { - label: 'label.description' + label: 'label.description', + isEditable: true }, id: { label: 'label.id' @@ -1357,6 +1389,7 @@ var allowedActions = []; if (items.vpcid != null) { allowedActions.push("remove"); + allowedActions.push("edit"); } return allowedActions; } -- To stop receiving notification emails like this one, please contact raf...@apache.org.