diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 9054ab4a66e..bc26a47ae71 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -46,6 +46,7 @@ import com.cloud.network.Network; import com.cloud.network.Network.GuestType; import com.cloud.offering.NetworkOffering; import com.cloud.utils.net.NetUtils; +import org.apache.commons.lang3.StringUtils; @APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {Network.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -61,7 +62,7 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = true, description = "the name of the network") private String name; - @Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, required = true, description = "the display text of the network") + @Parameter(name = ApiConstants.DISPLAY_TEXT, type = CommandType.STRING, description = "the display text of the network") private String displayText; @Parameter(name = ApiConstants.NETWORK_OFFERING_ID, @@ -221,7 +222,7 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { } public String getDisplayText() { - return displayText; + return StringUtils.isEmpty(displayText) ? name : displayText; } public String getNetworkDomain() { diff --git a/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java b/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java index d7810dba28b..6a2aadd151c 100644 --- a/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java +++ b/api/src/test/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmdTest.java @@ -100,12 +100,19 @@ public class CreateNetworkCmdTest extends TestCase { Assert.assertEquals(cmd.getNetworkName(), netName); } - public void testGetDisplayText() { + public void testGetDisplayTextWhenNotEmpty() { String description = "Isolated Network"; ReflectionTestUtils.setField(cmd, "displayText", description); Assert.assertEquals(cmd.getDisplayText(), description); } + public void testGetDisplayTextWhenEmpty() { + String description = null; + String netName = "net-isolated"; + ReflectionTestUtils.setField(cmd, "name", netName); + Assert.assertEquals(cmd.getDisplayText(), netName); + } + public void testGetNetworkDomain() { String netDomain = "cs1cloud.internal"; ReflectionTestUtils.setField(cmd, "networkDomain", netDomain); diff --git a/test/integration/smoke/test_create_network.py b/test/integration/smoke/test_create_network.py index c1b7d93d89c..4d1760d4c14 100644 --- a/test/integration/smoke/test_create_network.py +++ b/test/integration/smoke/test_create_network.py @@ -289,3 +289,84 @@ class TestNetworkManagement(cloudstackTestCase): ) self.cleanup.append(self.network_offering) + + @attr(tags=["adeancedsg", "Simulator"], required_hardware="false") + def test_03_create_network_with_empty_displayText(self): + """Create Shared network with empty displayText + and verify value of displayText after network + is being created. + """ + # Update the global setting to true + Configurations.update(self.apiclient, + name="allow.duplicate.networkname", + value="true" + ) + + # Create network offering + self.network_offering = NetworkOffering.create( + self.apiclient, + self.testdata["network_offering_shared"] + ) + self.cleanup.append( self.network_offering) + + NetworkOffering.update( + self.network_offering, + self.apiclient, + id=self.network_offering.id, + state="enabled" + ) + + physical_network, vlan = get_free_vlan(self.apiclient, self.zone.id) + self.testdata["shared_network_sg"]["physicalnetworkid"] = physical_network.id + + random_subnet_number = random.randrange(100, 199) + self.testdata["shared_network_sg"]["specifyVlan"] = 'True' + self.testdata["shared_network_sg"]["specifyIpRanges"] = 'True' + self.testdata["shared_network_sg"]["name"] = "Shared-Network-SG-Test-vlan-1" + self.testdata["shared_network_sg"]["displayText"] = '' + self.testdata["shared_network_sg"]["vlan"] = "vlan://" + str(random_subnet_number) + self.testdata["shared_network_sg"]["startip"] = "192.168." + str(random_subnet_number) + ".1" + self.testdata["shared_network_sg"]["endip"] = "192.168." + str(random_subnet_number) + ".10" + self.testdata["shared_network_sg"]["gateway"] = "192.168." + str(random_subnet_number) + ".254" + self.testdata["shared_network_sg"]["netmask"] = "255.255.255.0" + self.testdata["shared_network_sg"]["acltype"] = "account" + + # Create the first network with empty displayText + network1 = Network.create( + self.apiclient, + self.testdata["shared_network_sg"], + networkofferingid=self.network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + + self.cleanup.append(network1) + + self.assertEqual( + network1.displayText, + self.testdata["shared_network_sg"]["name"], + msg="displayText does not match name" + ) + + self.testdata["shared_network_sg"]["displayText"] = 'test' + + #Create the second network with non-empty displayText + network2 = Network.create( + self.apiclient, + self.testdata["shared_network_sg"], + networkofferingid=self.network_offering.id, + zoneid=self.zone.id, + accountid=self.account.name, + domainid=self.account.domainid + ) + + self.cleanup.append(network2) + + self.assertNotEqual( + network2.displayText, + self.testdata["shared_network_sg"]["name"], + msg="displayText and name are equal" + ) + + return diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 8c5e7080fa4..36d5e7cf516 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -394,7 +394,6 @@ export default { this.form = reactive({}) this.rules = reactive({ name: [{ required: true, message: this.$t('message.error.name') }], - displaytext: [{ required: true, message: this.$t('message.error.display.text') }], zoneid: [{ type: 'number', required: true, message: this.$t('message.error.select') }], networkofferingid: [{ type: 'number', required: true, message: this.$t('message.error.select') }], vpcid: [{ required: true, message: this.$t('message.error.select') }] diff --git a/ui/src/views/network/CreateL2NetworkForm.vue b/ui/src/views/network/CreateL2NetworkForm.vue index 82a9a0a8943..6b9e479df54 100644 --- a/ui/src/views/network/CreateL2NetworkForm.vue +++ b/ui/src/views/network/CreateL2NetworkForm.vue @@ -266,7 +266,6 @@ export default { }) this.rules = reactive({ name: [{ required: true, message: this.$t('message.error.name') }], - displaytext: [{ required: true, message: this.$t('message.error.display.text') }], zoneid: [{ required: true, message: this.$t('message.error.select') }], networkofferingid: [{ required: true, message: this.$t('message.error.select') }], vlanid: [{ required: true, message: this.$t('message.please.enter.value') }] diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue index 87a3375f3db..380ced770f8 100644 --- a/ui/src/views/network/CreateSharedNetworkForm.vue +++ b/ui/src/views/network/CreateSharedNetworkForm.vue @@ -590,7 +590,6 @@ export default { }) this.rules = reactive({ name: [{ required: true, message: this.$t('message.error.name') }], - displaytext: [{ required: true, message: this.$t('message.error.display.text') }], zoneid: [{ type: 'number', required: true, message: this.$t('message.error.select') }], vlan: [{ required: true, message: this.$t('message.please.enter.value') }], networkofferingid: [{ type: 'number', required: true, message: this.$t('message.error.select') }],