コード例 #1
0
        /// <summary>
        /// Create default LogicalNetwork and add to configuration.
        /// </summary>
        /// <param name="logicalNetworkConfig">FabricNetworkConfig instance.</param>
        public void CreateHNVLogicalNetwork(LogicalNetworkConfig logicalNetworkConfig)
        {
            // Verify arguments.
            if (logicalNetworkConfig == null)
            {
                return;
            }

            if (logicalNetworkConfig.GetLogicalNetworkById(HNVODLConstants.LOGICAL_NETWORK.LOGICALNETWORK_ID) != null)
            {
                // If exists, nothing to do.
                return;
            }

            ODLVSEMETW.EventWriteGetHNVLogicalNetworkNotFound(MethodBase.GetCurrentMethod().Name,
                                                              string.Format("Create LogicalNetwork that Guid is {0}", HNVODLConstants.LOGICAL_NETWORK.LOGICALNETWORK_ID));

            // Create LogicalNetwork instance.
            var logicalNetwork = new LogicalNetwork()
            {
                AreLogicalNetworkDefinitionsIsolated =
                    HNVODLConstants.LOGICAL_NETWORK.ARE_LOGICALNETWORK_DEFINITIONS_ISOLATED,
                Description               = HNVODLConstants.LOGICAL_NETWORK.DESCRIPTION,
                Id                        = HNVODLConstants.LOGICAL_NETWORK.LOGICALNETWORK_ID,
                LastModifiedTimeStamp     = DateTime.Now,
                LogicalNetworkDefinitions = new LogicalNetworkDefinition[1],
                Name                      = string.Format(HNVODLConstants.LOGICAL_NETWORK.NAME, this.VtnHostName)
            };

            logicalNetwork.LogicalNetworkDefinitions[0] = this.CreateDefaultLogicalNetworkDefinition();

            // Add created logical network to the configuration.
            logicalNetworkConfig.LogicalNetworks.Add(logicalNetwork);
        }
コード例 #2
0
        /// <summary>
        /// Update the existing logical network.
        /// </summary>
        /// <param name="txnMng">Transaction manager.</param>
        /// <param name="logicalNetwork">Updated logical network.</param>
        public void UpdateLogicalNetwork(TransactionManager txnMng, LogicalNetwork logicalNetwork)
        {
            var logicalNetworkConfig = new LogicalNetworkConfig(this.VtnHostName);

            txnMng.SetConfigManager(logicalNetworkConfig, TransactionManager.OpenMode.WriteMode);

            int target;

            target = logicalNetworkConfig.ReplaceLogicalNetwork(logicalNetwork);
            if (target == -1)
            {
                ODLVSEMETW.EventWriteGetHNVLogicalNetworkNotFound(MethodBase.GetCurrentMethod().Name,
                                                                  string.Format("LogicalNetwork name is {0}", logicalNetwork.Name));
            }
        }
コード例 #3
0
        /// <summary>
        /// Verify whether the specified VMNetwork is HNV resource or not.
        /// </summary>
        /// <param name="vmnetwork">VMNetwork instance.</param>
        /// <returns>True if HNV resource, else false.</returns>
        public bool IsHNVVMNetwork(VMNetwork vmnetwork)
        {
            if (vmnetwork == null)
            {
                return(false);
            }

            // Create txn and read configuration.
            var txnMng = new TransactionManager();

            txnMng.StartTransaction();
            var logicalNetworkConfig = new LogicalNetworkConfig(this.VtnHostName);

            txnMng.SetConfigManager(logicalNetworkConfig, TransactionManager.OpenMode.ReadMode);

            bool ret;

            // Get LogicalNetowork that Guid equals vmnetwork.LogicalNetwork.
            LogicalNetwork logicalnetwork = logicalNetworkConfig.GetLogicalNetworkById(vmnetwork.LogicalNetwork);

            if (logicalnetwork == null)
            {
                ret = false;
                goto txnEnd;
            }

            var hnvLogicalNetworkManagement = new HNVLogicalNetworkManagement(this.VtnHostName);

            ret = hnvLogicalNetworkManagement.IsHNVLogicalNetwork(logicalnetwork);

            if (ret == false)
            {
                ODLVSEMETW.EventWriteNotHNVVMNetwork(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format("VMNetwork name is {0}", vmnetwork.Name));
            }
txnEnd:
            txnMng.EndTransaction(TransactionManager.Operation.None);
            return(ret);
        }
コード例 #4
0
        /// <summary>
        /// This method is responsible to synchronize the network configuration between ODL and SCVMM.
        /// </summary>
        /// <param name="txnMng">TransactionManager instance.</param>
        public void SynchronizeVTNObjects(TransactionManager txnMng)
        {
            var JavaScriptSerializer = new JavaScriptSerializer();

            JavaScriptSerializer.MaxJsonLength = int.MaxValue;
            StringBuilder json = new StringBuilder("\"txnMng\":" + JavaScriptSerializer.Serialize(txnMng));

            ODLVSEMETW.EventWriteStartLibrary(MethodBase.GetCurrentMethod().Name,
                                              json.ToString());
            if (txnMng == null)
            {
                ODLVSEMETW.EventWriteArgumentError(
                    MethodBase.GetCurrentMethod().DeclaringType.Name.ToString(),
                    MethodBase.GetCurrentMethod().Name,
                    "The parameter 'transaction' is null or invalid.");
                throw new ArgumentException("The parameter 'transaction' is null or invalid.");
            }
            Controller odl  = new Controller(this.ConnectionString, this.Credential);
            List <Vtn> vtns = odl.ReadVTNObjects(string.Empty);

            ODLVSEMETW.EventWriteReturnODLLibrary("Return from ODL Library.", string.Empty);

            string VtnHostName = this.ConnectionString;

            if (VtnHostName.StartsWith(@"https://", StringComparison.Ordinal))
            {
                VtnHostName = VtnHostName.Substring(8);
            }

            VtnHostName = VtnHostName.Split('.', ':').First();
            var vMNetworkConfig = new VMNetworkConfig(VtnHostName);

            try {
                txnMng.SetConfigManager(vMNetworkConfig, TransactionManager.OpenMode.WriteMode);
            } catch (Exception ex) {
                ODLVSEMETW.EventWriteConfigManagerFileIOError(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format(CultureInfo.CurrentCulture,
                                  "VMNetwork.config {0}\n{1}",
                                  configFileIOErrorValidationMessage,
                                  ex.Message));
                ODLVSEMETW.EventWriteEndLibrary(MethodBase.GetCurrentMethod().Name, string.Empty);
                throw new InvalidOperationException(
                          string.Format(CultureInfo.CurrentCulture,
                                        "VMNetwork.config {0}",
                                        configFileIOErrorValidationMessage));
            }
            var logicalNetworkConfig = new LogicalNetworkConfig(VtnHostName);

            try {
                txnMng.SetConfigManager(logicalNetworkConfig, TransactionManager.OpenMode.ReadMode);
            } catch (Exception ex) {
                ODLVSEMETW.EventWriteConfigManagerFileIOError(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format(CultureInfo.CurrentCulture,
                                  "LogicalNetwork.config {0}\n{1}",
                                  configFileIOErrorValidationMessage,
                                  ex.Message));
                ODLVSEMETW.EventWriteEndLibrary(MethodBase.GetCurrentMethod().Name, string.Empty);
                throw new InvalidOperationException(
                          string.Format(CultureInfo.CurrentCulture,
                                        "LogicalNetwork.config {0}",
                                        configFileIOErrorValidationMessage));
            } string logicalNetworkName = VSEMODLConstants.LOGICAL_NETWORK_NAME;
            logicalNetworkName += VtnHostName;
            var logicalNetwork = logicalNetworkConfig.LogicalNetworks.FirstOrDefault(logicalnw => logicalnw.Name.Equals(logicalNetworkName));

            if (logicalNetwork == null)
            {
                ODLVSEMETW.EventWriteGetFabricNetworkDefinitionError(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format(CultureInfo.CurrentCulture,
                                  "Logical network '{0}' not found.",
                                  logicalNetworkName));
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
                                                                  "Logical network definition '{0}' not found.",
                                                                  logicalNetworkName));
            }
            Guid logicalNetworkId           = logicalNetwork.Id;
            Guid logicalNetworkDefinitionId = logicalNetwork.LogicalNetworkDefinitions.First().Id;

            ////for creation.
            this.CompareVTNObjects(vtns, vMNetworkConfig, logicalNetworkId, logicalNetworkDefinitionId, txnMng, VtnHostName);
            ////for removal.
            this.CompareVMNetworkObjects(vtns, vMNetworkConfig);
            vMNetworkConfig.VMNetwork.VMNetworkMappingInformation.LastModifiedTimeStamp =
                DateTime.Now;
        }
コード例 #5
0
        /// <summary>
        /// Create a new VM network with specified parameters using VTN on demand.
        /// </summary>
        /// <param name="txnMng">Transaction manager.</param>
        /// <param name="vMSubnetName">Name of VM Subnet to create.</param>
        /// <param name="vMNetworkName">Name of VM network to create.</param>
        /// <param name="maxNumberOfPorts">Maximum number of ports.</param>
        /// <param name="ipSubnets">IP pools to use.</param>
        /// <param name="logicalNetworkDefinitionId">ID of logical network definition
        /// to associate with.</param>
        /// <param name="connection">VSEM connection.</param>
        /// <param name="vtnName">VTN name.</param>
        /// <returns>VM network if successful, else null.</returns>
        public VMNetwork CreateVMNetwork(TransactionManager txnMng,
                                         string vMSubnetName,
                                         string vMNetworkName,
                                         long?maxNumberOfPorts,
                                         IPSubnet[] ipSubnets,
                                         Guid logicalNetworkDefinitionId,
                                         VSEMConnection connection,
                                         out string vtnName)
        {
            var JavaScriptSerializer = new JavaScriptSerializer();

            JavaScriptSerializer.MaxJsonLength = int.MaxValue;
            StringBuilder json = new StringBuilder("\"txnMng\":" + JavaScriptSerializer.Serialize(txnMng));

            json.Append(" \"ipSubnets\":" + JavaScriptSerializer.Serialize(ipSubnets));
            json.Append("\"maxNumberOfPorts\":\"" + maxNumberOfPorts + "\"");
            json.Append("\"vMNetworkName\":\"" + vMNetworkName + "\"");
            json.Append("\"vMSubnetName\":\"" + vMSubnetName + "\"");
            json.Append("\"logicalNetworkDefinitionId\":\"" + logicalNetworkDefinitionId + "\"");
            ODLVSEMETW.EventWriteStartLibrary(MethodBase.GetCurrentMethod().Name,
                                              json.ToString());
            if (txnMng == null)
            {
                ODLVSEMETW.EventWriteArgumentError(
                    MethodBase.GetCurrentMethod().DeclaringType.Name.ToString(),
                    MethodBase.GetCurrentMethod().Name,
                    "The parameter 'transaction' is null or invalid.");
                throw new ArgumentException("The parameter 'transaction' is null or invalid.");
            }

            if (string.IsNullOrEmpty(vMNetworkName))
            {
                ODLVSEMETW.EventWriteArgumentError(
                    MethodBase.GetCurrentMethod().DeclaringType.Name.ToString(),
                    MethodBase.GetCurrentMethod().Name,
                    "The parameter 'vMNetworkName' is null or invalid.");
                throw new ArgumentException("The parameter 'vMNetworkName' is null or invalid.");
            }
            if (logicalNetworkDefinitionId == Guid.Empty)
            {
                ODLVSEMETW.EventWriteArgumentError(
                    MethodBase.GetCurrentMethod().DeclaringType.Name.ToString(),
                    MethodBase.GetCurrentMethod().Name,
                    "The parameter 'logicalNetworkDefinitionId' is null or invalid.");
                throw new ArgumentException(
                          "The parameter 'logicalNetworkDefinitionId' is null or invalid.");
            }
            if (connection == null)
            {
                ODLVSEMETW.EventWriteArgumentError(
                    MethodBase.GetCurrentMethod().DeclaringType.Name.ToString(),
                    MethodBase.GetCurrentMethod().Name,
                    "The parameter 'connection' is null or invalid.");
                throw new ArgumentException("The parameter 'connection' is null or invalid.");
            }

            string VtnHostName = this.ConnectionString;

            if (VtnHostName.StartsWith(@"https://", StringComparison.Ordinal))
            {
                VtnHostName = VtnHostName.Substring(8);
            }

            VtnHostName = VtnHostName.Split('.', ':').First();

            var vMNetworkConfig = new VMNetworkConfig(VtnHostName);

            txnMng.SetConfigManager(vMNetworkConfig, TransactionManager.OpenMode.WriteMode);

            var LogicalNetworkConfig = new LogicalNetworkConfig(VtnHostName);

            txnMng.SetConfigManager(LogicalNetworkConfig, TransactionManager.OpenMode.ReadMode);
            if (LogicalNetworkConfig.LogicalNetworks.Count == 0)
            {
                ODLVSEMETW.EventWriteConfigManagerFileIOError(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format(CultureInfo.CurrentCulture,
                                  "LogicalNetwork.config {0}",
                                  configFileIOErrorValidationMessage));
                throw new InvalidOperationException(
                          string.Format(CultureInfo.CurrentCulture,
                                        "LogicalNetwork.config {0}",
                                        configFileIOErrorValidationMessage));
            }

            var logicalNetName = VSEMODLConstants.LOGICAL_NETWORK_NAME;

            logicalNetName += VtnHostName;
            var fabricNwDef = LogicalNetworkConfig.LogicalNetworks.First(
                log => log.Name.Equals(logicalNetName)).LogicalNetworkDefinitions.FirstOrDefault(
                fabnw => fabnw.Id == logicalNetworkDefinitionId);

            if (fabricNwDef == null)
            {
                ODLVSEMETW.EventWriteGetFabricNetworkDefinitionError(
                    MethodBase.GetCurrentMethod().Name,
                    string.Format(CultureInfo.CurrentCulture,
                                  "Logical network definition '{0}' not found.",
                                  logicalNetworkDefinitionId.ToString("B")));
                throw new ArgumentException(string.Format(CultureInfo.CurrentCulture,
                                                          "Logical network definition '{0}' not found.",
                                                          logicalNetworkDefinitionId.ToString("B")));
            }

            ODLVSEMETW.EventWriteReturnLibrary(string.Format(CultureInfo.CurrentCulture,
                                                             "VSEMLogicalNetworkDefinition is retrieved by ID: {0}",
                                                             logicalNetworkDefinitionId.ToString("B")),
                                               string.Empty);

            if (!fabricNwDef.SupportsVMNetworkProvisioning)
            {
                ODLVSEMETW.EventWriteSupportsVMNetworkProvisioningError(
                    "Logical network does not support VM network creation.",
                    string.Empty);
                throw new InvalidOperationException(
                          "Logical network does not support VM network creation.");
            }

            vtnName = this.CreateUniqueNameForVTN(vMNetworkName);

            Vtn vtn = new Vtn(this.ConnectionString, this.Credential);

            vtn.AddVtn(vtnName);

            ODLVSEMETW.EventWriteReturnODLLibrary(string.Format(CultureInfo.CurrentCulture,
                                                                "VTN '{0}' is created",
                                                                vtnName),
                                                  string.Empty);

            VMNetwork vmNet = CreateVtnVmNetwork(vMNetworkName);

            vmNet.LogicalNetwork = fabricNwDef.LogicalNetworkId;
            if (vmNet == null)
            {
                ODLVSEMETW.EventWriteProcessFailedVMNetworkError(
                    MethodBase.GetCurrentMethod().Name,
                    "Failed to create VM Network.");
                throw new InvalidOperationException("Failed to create VM Network.");
            }
            ODLVSEMETW.EventWriteSuccessVmNetwork(MethodBase.GetCurrentMethod().Name,
                                                  "VM Network Successfully Created.");

            // Create the VM Subnet
            vMNetworkConfig.VMNetwork.VmNetworks.Add(vmNet);
            if (vMNetworkConfig.VMNetwork.VMNetworkMappingInformation.VMNetworkInfo == null)
            {
                vMNetworkConfig.VMNetwork.VMNetworkMappingInformation.VMNetworkInfo =
                    new List <VMNetworkInfo>();
            }

            vMNetworkConfig.VMNetwork.VMNetworkMappingInformation.VMNetworkInfo.Add(
                new VMNetworkInfo {
                VMNetworkID           = vmNet.Id,
                VMNetworkName         = vmNet.Name,
                VTNName               = vtnName,
                VMSubnetInfo          = new List <VMSubnetInfo>(),
                CreatedFrom           = "SCVMM",
                VMNetworkOriginalName = vmNet.Name
            });

            var vsemvmnetworkDefinition = new VSEMVMSubnetManagement(
                this.ConnectionString, this.Credential);

            ODLVSEMETW.EventWriteCreateVMsubNetwork(MethodBase.GetCurrentMethod().Name,
                                                    "VM Sub Network creation process started.");
            string   vbrName      = string.Empty;
            VMSubnet vmNetworkDef =
                vsemvmnetworkDefinition.CreateVMNetworkDefinitionforVtn(
                    txnMng,
                    LogicalNetworkConfig,
                    vMNetworkConfig,
                    vMSubnetName,
                    vmNet.Id,
                    maxNumberOfPorts,
                    ipSubnets,
                    logicalNetworkDefinitionId,
                    connection,
                    out vtnName,
                    out vbrName);

            Controller odl = new Controller(this.ConnectionString, this.Credential);

            odl.UpdateStartupConfiguration();
            string output = "\"vmNet\":" + JavaScriptSerializer.Serialize(vmNet);

            ODLVSEMETW.EventWriteReturnODLLibrary("Return from ODL Library.", output);

            ODLVSEMETW.EventWriteEndLibrary(MethodBase.GetCurrentMethod().Name,
                                            output);
            return(vmNet);
        }