/// <summary> /// Add the VMSubnet that corresponds the newly created vBridge on ODL. /// </summary> /// <param name="vmnetworkInfo">VM Network info.</param> /// <param name="vbr">Newly created vBridge.</param> /// <param name="vmnetwork">VM network that correspond the VTN in which vBridge is created.</param> /// <param name="logicalNetworkDefinitionId">Logical network definition Id.</param> private void AddVMSubnet(VMNetworkInfo vmnetworkInfo, Vbridge vbr, VMNetwork vmnetwork, Guid?logicalNetworkDefinitionId) { List <string> ipsubnets = new List <string>(); vmnetwork.VMSubnets.ToList().Where(item => item.Description.Contains("/")).ToList().ForEach(sub => sub.IPSubnets.ToList().ForEach(ipsub => ipsubnets.Add(ipsub.Subnet))); string ipsubnet = this.CreateUniqueIPSubnet(ipsubnets); VMSubnet vmsubnet = VSEMVMSubnetManagement.CreateVbrVmNetworkDefinition(vmnetworkInfo.VMNetworkID, null, new IPSubnet[] { new IPSubnet { AddressFamily = AddressFamily.IPv4, Subnet = ipsubnet, Id = Guid.NewGuid(), LastModifiedTimeStamp = DateTime.Now, SupportsDHCP = true } }, vbr.Name, logicalNetworkDefinitionId, vbr.Name, vbr.VlanId); vmsubnet.Description = vmsubnet.Description + " (" + ipsubnet + ")"; Array.Resize(ref vmnetwork.VMSubnets, vmnetwork.VMSubnets.Length + 1); vmnetwork.VMSubnets[vmnetwork.VMSubnets.Length - 1] = vmsubnet; vmnetworkInfo.VMSubnetInfo.Add(new VMSubnetInfo { VBridgeName = vbr.Name, VMSubnetVlanId = string.IsNullOrEmpty(vmnetworkInfo.VMNetworkName) ? 0 : vbr.VlanId, VMSubnetID = vmsubnet.Id, VMSubnetName = string.IsNullOrEmpty(vmnetworkInfo.VMNetworkName) ? string.Empty : vbr.Name, CreatedFrom = "ODL", VBridgeVlanId = vbr.VlanId }); }
/// <summary> /// Compare the VTN. /// </summary> /// <param name="vtn">VTN to compare.</param> /// <param name="vmnetworkInfo">Corresponding VM network info.</param> /// <returns>Indicates whether VTN is synchronized or not.</returns> public bool CompareVTN(Vtn vtn, VMNetworkInfo vmnetworkInfo) { bool needRefresh = false; List <Vbridge> vbridges = new List <Vbridge>(); foreach (Vbridge vbr in vtn.Vbridges) { var vmsubnetInfo = vmnetworkInfo.VMSubnetInfo.FirstOrDefault(vmsubnet => vmsubnet.VBridgeName.Equals(vbr.Name)); if (vmsubnetInfo != null) { if (vmsubnetInfo.VBridgeVlanId != vbr.VlanId) { needRefresh = true; } } else { needRefresh = true; } } foreach (var subnetInfo in vmnetworkInfo.VMSubnetInfo) { Vbridge vbr = vtn.Vbridges.FirstOrDefault(odlItem => odlItem.Name.CompareTo(subnetInfo.VBridgeName) == 0); if (vbr == null) { needRefresh = true; } } return(needRefresh); }
/// <summary> /// Checks the status of vBridge on ODL. /// </summary> /// <param name="vtnName">Name of parent VTN.</param> /// <param name="vbrName">Name of parent vBridge.</param> /// <returns>VLAN ID. /// -2 if VTN is deleted. /// -1 if vBridge is deleted. /// </returns> public int CheckVbridgeStatus(string vtnName, string vbrName) { int status = -2; Vtn vtns = this.ReadVTNObjects(vtnName).FirstOrDefault(); if (vtns != null) { Vbridge vbridge = vtns.Vbridges.FirstOrDefault(vbr => vbr.Name.CompareTo(vbrName) == 0); if (vbridge != null) { long vlanID = vbridge.VlanId; if (vlanID != 0) { status = Convert.ToInt32(vlanID); } else { status = -1; } } else { status = -1; } } else { status = -2; } return(status); }
/// <summary> /// This method is responsible for making the connection with ODL through /// http request and retrieve the list of VTNs. /// </summary> /// <param name="readVTN">Vtn name.</param> /// <returns>Extracts list of vtns from the response and return.</returns> public List <Vtn> ReadVTNObjects(string readVTN) { var JavaScriptSerializer = new JavaScriptSerializer(); JavaScriptSerializer.MaxJsonLength = int.MaxValue; ODLVSEMETW.EventWriteStartODLLibrary( MethodBase.GetCurrentMethod().Name, string.Empty); List <Vtn> vtns = new List <Vtn>(); List <string> vtnNames = this.GetVtnList(); if (!string.IsNullOrEmpty(readVTN)) { vtnNames.RemoveAll(vtn => vtn.CompareTo(readVTN) != 0); } foreach (string vtnName in vtnNames) { var vtn = new Vtn(this.Base_uri, this.Credential) { Name = vtnName }; List <string> vbrNames = this.GetVbridgesListforVtn(vtnName); foreach (string vbrName in vbrNames) { long vlanID = this.GetVLANIDforVbridge(vtnName, vbrName); if (vlanID != 0) { var vbr = new Vbridge(this.Base_uri, this.Credential) { Name = vbrName, VlanId = vlanID }; vtn.Vbridges.Add(vbr); } } if (vtn.Vbridges.Count() > 0) { vtns.Add(vtn); } } string output = "\"vtns\":" + JavaScriptSerializer.Serialize(vtns.Select(vtn => vtn.Name)); ODLVSEMETW.EventWriteEndODLLibrary(MethodBase.GetCurrentMethod().Name, output); return(vtns); }
/// <summary> /// Compare the VTN. /// </summary> /// <param name="logicalNetworkDefinitionId">Logfical network definition ID.</param> /// <param name="vmnetwork">Corresponding VM network.</param> /// <param name="vtn">VTN to compare.</param> /// <param name="vmnetworkInfo">Corresponding VM network info.</param> /// <param name="txnMng">Transaction manager instance.</param> /// <param name="VtnHostName">Host name of the VTNCoordinator.</param> /// <returns>Indicateds the need to refresh the network service.</returns> public bool SyncVTN(Guid?logicalNetworkDefinitionId, VMNetwork vmnetwork, Vtn vtn, VMNetworkInfo vmnetworkInfo, TransactionManager txnMng, string VtnHostName) { bool needRefresh = false; foreach (Vbridge vbr in vtn.Vbridges) { var vmsubnetInfo = vmnetworkInfo.VMSubnetInfo.FirstOrDefault(vmsubnet => vmsubnet.VBridgeName.Equals(vbr.Name)); if (vmsubnetInfo != null) { if (vmsubnetInfo.VBridgeVlanId != vbr.VlanId && !string.IsNullOrEmpty(vmsubnetInfo.VMSubnetName)) { string vlanRange = CheckVlanRange(vmnetworkInfo, txnMng, VtnHostName, vmsubnetInfo); if (vlanRange.CompareTo(string.Empty) == 0) { vmsubnetInfo.Description = string.Format("VLAN ID of this VM Subnet is changed from {0} to {1} on ODL. VM attached to this VM Subnet prior to this change (i.e, with VLAN ID {0}), will not be operable now.", vmsubnetInfo.VMSubnetVlanId, vbr.VlanId); vmsubnetInfo.VMSubnetVlanId = vbr.VlanId; var vmsubnet = vmnetwork.VMSubnets.FirstOrDefault(subnet => subnet.Id.Equals(vmsubnetInfo.VMSubnetID)); vmsubnet.SegmentId.PrimarySegmentIdentifier = Convert.ToUInt32(vbr.VlanId); needRefresh = true; } else { vmsubnetInfo.Description = string.Format("VLAN ID of this VM Subnet is changed from {0} to {1} on ODL. But {1} does not lie in the specified range '{2}'. VM attached to this VM Subnet will not be operable now.", vmsubnetInfo.VMSubnetVlanId, vbr.VlanId, vlanRange); } } vmsubnetInfo.VBridgeVlanId = vbr.VlanId; } else { this.AddVMSubnet(vmnetworkInfo, vbr, vmnetwork, logicalNetworkDefinitionId); needRefresh = true; } } foreach (var subnetInfo in vmnetworkInfo.VMSubnetInfo) { Vbridge vbr = vtn.Vbridges.FirstOrDefault(odlItem => odlItem.Name.CompareTo(subnetInfo.VBridgeName) == 0); if (vbr == null) { RemoveVMSubnetSync(null, subnetInfo.VMSubnetID, vmnetwork, vmnetworkInfo); needRefresh = true; } } return(needRefresh); }
/// <summary> /// This function is responsible to synchronize the network configuration between ODL and SCVMM. /// </summary> /// <param name="vtns">List of VTNs on ODL.</param> /// <param name="vMNetworkConfig">VMNetwork.config file instance.</param> private void CompareVMNetworkObjects(List <Vtn> vtns, VMNetworkConfig vMNetworkConfig) { foreach (var networkInfo in vMNetworkConfig.VMNetwork.VMNetworkMappingInformation.VMNetworkInfo) { Vtn vtn = vtns.FirstOrDefault(odlItem => odlItem.Name.CompareTo(networkInfo.VTNName) == 0); if (vtn == null) { RemoveVMNetworkSync(vMNetworkConfig, networkInfo); } else { foreach (var subnetInfo in networkInfo.VMSubnetInfo) { Vbridge vbr = vtn.Vbridges.FirstOrDefault(odlItem => odlItem.Name.CompareTo(subnetInfo.VBridgeName) == 0); if (vbr == null) { RemoveVMSubnetSync(vMNetworkConfig, subnetInfo.VMSubnetID, null, null); } } } } }