Пример #1
0
        /// <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
            });
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        /// <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);
        }
Пример #6
0
 /// <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);
                 }
             }
         }
     }
 }