@@ -4407,14 +4407,24 @@ public Vlan createVlanAndPublicIpRange(final CreateVlanIpRangeCmd cmd) throws In
44074407 String endIP = cmd .getEndIp ();
44084408 final String newVlanGateway = cmd .getGateway ();
44094409 final String newVlanNetmask = cmd .getNetmask ();
4410+ Long networkId = cmd .getNetworkID ();
4411+ Long physicalNetworkId = cmd .getPhysicalNetworkId ();
4412+
4413+ // Verify that network exists
4414+ Network network = getNetwork (networkId );
4415+ if (network != null ) {
4416+ zoneId = network .getDataCenterId ();
4417+ physicalNetworkId = network .getPhysicalNetworkId ();
4418+ }
4419+
44104420 String vlanId = cmd .getVlan ();
4421+ vlanId = verifyAndUpdateVlanId (vlanId , network );
4422+
44114423 // TODO decide if we should be forgiving or demand a valid and complete URI
44124424 if (!(vlanId == null || "" .equals (vlanId ) || vlanId .startsWith (BroadcastDomainType .Vlan .scheme ()))) {
44134425 vlanId = BroadcastDomainType .Vlan .toUri (vlanId ).toString ();
44144426 }
44154427 final Boolean forVirtualNetwork = cmd .isForVirtualNetwork ();
4416- Long networkId = cmd .getNetworkID ();
4417- Long physicalNetworkId = cmd .getPhysicalNetworkId ();
44184428 final String accountName = cmd .getAccountName ();
44194429 final Long projectId = cmd .getProjectId ();
44204430 final Long domainId = cmd .getDomainId ();
@@ -4487,18 +4497,6 @@ public Vlan createVlanAndPublicIpRange(final CreateVlanIpRangeCmd cmd) throws In
44874497 }
44884498 }
44894499
4490- // Verify that network exists
4491- Network network = null ;
4492- if (networkId != null ) {
4493- network = _networkDao .findById (networkId );
4494- if (network == null ) {
4495- throw new InvalidParameterValueException ("Unable to find network by id " + networkId );
4496- } else {
4497- zoneId = network .getDataCenterId ();
4498- physicalNetworkId = network .getPhysicalNetworkId ();
4499- }
4500- }
4501-
45024500 // Verify that zone exists
45034501 final DataCenterVO zone = _zoneDao .findById (zoneId );
45044502 if (zone == null ) {
@@ -4639,6 +4637,32 @@ public Vlan createVlanAndPublicIpRange(final CreateVlanIpRangeCmd cmd) throws In
46394637 ip6Cidr , domain , vlanOwner , network , sameSubnet );
46404638 }
46414639
4640+ private Network getNetwork (Long networkId ) {
4641+ if (networkId == null ) {
4642+ return null ;
4643+ }
4644+
4645+ Network network = _networkDao .findById (networkId );
4646+ if (network == null ) {
4647+ throw new InvalidParameterValueException ("Unable to find network by id " + networkId );
4648+ }
4649+
4650+ return network ;
4651+ }
4652+
4653+ private String verifyAndUpdateVlanId (String vlanId , Network network ) {
4654+ if (!StringUtils .isBlank (vlanId )) {
4655+ return vlanId ;
4656+ }
4657+
4658+ if (network == null || network .getTrafficType () != TrafficType .Guest ) {
4659+ return Vlan .UNTAGGED ;
4660+ }
4661+
4662+ boolean connectivityWithoutVlan = isConnectivityWithoutVlan (network );
4663+ return getNetworkVlanId (network , connectivityWithoutVlan );
4664+ }
4665+
46424666 private Vlan commitVlan (final Long zoneId , final Long podId , final String startIP , final String endIP , final String newVlanGatewayFinal , final String newVlanNetmaskFinal ,
46434667 final String vlanId , final Boolean forVirtualNetwork , final Boolean forSystemVms , final Long networkId , final Long physicalNetworkId , final String startIPv6 , final String endIPv6 ,
46444668 final String ip6Gateway , final String ip6Cidr , final Domain domain , final Account vlanOwner , final Network network , final Pair <Boolean , Pair <String , String >> sameSubnet ) {
@@ -4847,28 +4871,8 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId,
48474871 // same as network's vlan
48484872 // 2) if vlan is missing, default it to the guest network's vlan
48494873 if (network .getTrafficType () == TrafficType .Guest ) {
4850- String networkVlanId = null ;
4851- boolean connectivityWithoutVlan = false ;
4852- if (_networkModel .areServicesSupportedInNetwork (network .getId (), Service .Connectivity )) {
4853- Map <Capability , String > connectivityCapabilities = _networkModel .getNetworkServiceCapabilities (network .getId (), Service .Connectivity );
4854- connectivityWithoutVlan = MapUtils .isNotEmpty (connectivityCapabilities ) && connectivityCapabilities .containsKey (Capability .NoVlan );
4855- }
4856-
4857- final URI uri = network .getBroadcastUri ();
4858- if (connectivityWithoutVlan ) {
4859- networkVlanId = network .getBroadcastDomainType ().toUri (network .getUuid ()).toString ();
4860- } else if (uri != null ) {
4861- // Do not search for the VLAN tag when the network doesn't support VLAN
4862- if (uri .toString ().startsWith ("vlan" )) {
4863- final String [] vlan = uri .toString ().split ("vlan:\\ /\\ /" );
4864- networkVlanId = vlan [1 ];
4865- // For pvlan
4866- if (network .getBroadcastDomainType () != BroadcastDomainType .Vlan ) {
4867- networkVlanId = networkVlanId .split ("-" )[0 ];
4868- }
4869- }
4870- }
4871-
4874+ boolean connectivityWithoutVlan = isConnectivityWithoutVlan (network );
4875+ String networkVlanId = getNetworkVlanId (network , connectivityWithoutVlan );
48724876 if (vlanId != null && !connectivityWithoutVlan ) {
48734877 // if vlan is specified, throw an error if it's not equal to
48744878 // network's vlanId
@@ -5000,6 +5004,36 @@ public Vlan createVlanAndPublicIpRange(final long zoneId, final long networkId,
50005004 return vlan ;
50015005 }
50025006
5007+ private boolean isConnectivityWithoutVlan (Network network ) {
5008+ boolean connectivityWithoutVlan = false ;
5009+ if (_networkModel .areServicesSupportedInNetwork (network .getId (), Service .Connectivity )) {
5010+ Map <Capability , String > connectivityCapabilities = _networkModel .getNetworkServiceCapabilities (network .getId (), Service .Connectivity );
5011+ connectivityWithoutVlan = MapUtils .isNotEmpty (connectivityCapabilities ) && connectivityCapabilities .containsKey (Capability .NoVlan );
5012+ }
5013+ return connectivityWithoutVlan ;
5014+ }
5015+
5016+ private String getNetworkVlanId (Network network , boolean connectivityWithoutVlan ) {
5017+ String networkVlanId = null ;
5018+ if (connectivityWithoutVlan ) {
5019+ return network .getBroadcastDomainType ().toUri (network .getUuid ()).toString ();
5020+ }
5021+
5022+ final URI uri = network .getBroadcastUri ();
5023+ if (uri != null ) {
5024+ // Do not search for the VLAN tag when the network doesn't support VLAN
5025+ if (uri .toString ().startsWith ("vlan" )) {
5026+ final String [] vlan = uri .toString ().split ("vlan:\\ /\\ /" );
5027+ networkVlanId = vlan [1 ];
5028+ // For pvlan
5029+ if (network .getBroadcastDomainType () != BroadcastDomainType .Vlan ) {
5030+ networkVlanId = networkVlanId .split ("-" )[0 ];
5031+ }
5032+ }
5033+ }
5034+ return networkVlanId ;
5035+ }
5036+
50035037 private void checkZoneVlanIpOverlap (DataCenterVO zone , Network network , String newCidr , String vlanId , String vlanGateway , String vlanNetmask , String startIP , String endIP ) {
50045038 // Throw an exception if this subnet overlaps with subnet on other VLAN,
50055039 // if this is ip range extension, gateway, network mask should be same and ip range should not overlap
0 commit comments