/// <summary>
 /// Returns metrics definitions for a given iscsiserver
 /// </summary>
 /// <param name="iscsiServer"></param>
 /// <param name="deviceName"></param>
 /// <returns></returns>
 public static IEnumerable <MetricDefinition> GetMetricsDefinition(
     this ISCSIServer iscsiServer,
     string deviceName)
 {
     return(iscsiServer.Client.IscsiServers.ListMetricDefinition(
                deviceName,
                iscsiServer.Name,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName));
 }
        public void TestCreateOrUpdateIscsiServer()
        {
            try
            {
                //Check if atleast a device is registered to the manager.
                var devices = Helpers.CheckAndGetDevicesByStatus(this, DeviceStatus.ReadyToSetup, 1);

                Assert.True(devices != null && devices.FirstOrDefault() != null,
                            "No devices were found to be registered in the manger:" + this.ManagerName);

                // Get the first device
                Device device = devices.FirstOrDefault();

                var sacCreated = TestUtilities.GetStorageAccountCredential(
                    this.Client,
                    TestConstants.DefaultSacName,
                    this.ResourceGroupName,
                    this.ManagerName);

                var storageDomain = TestUtilities.GetStorageDomain(
                    TestConstants.DefaultStorageDomainIscsiServerNamePrefix + device.Name,
                    sacCreated.Id,
                    this.Client,
                    this.ResourceGroupName,
                    this.ManagerName);

                Assert.True(
                    storageDomain != null,
                    $"StorageDomain not found: {storageDomain.Name}");

                // Create BackupScheduleGroup
                var bsg = TestUtilities.GetBackupScheduleGroup(
                    device.Name,
                    TestConstants.DefaultBackupSchGroupName,
                    this.Client,
                    this.ResourceGroupName,
                    this.ManagerName);

                // Create IscsiServer
                var iscsiServer = new ISCSIServer(
                    this.Client,
                    this.ResourceGroupName,
                    this.ManagerName,
                    device.Name);
                iscsiServer.Initialize(storageDomain.Id, bsg.Id);
                var iscsiServerCreated = iscsiServer.CreateOrUpdate(device.Name);

                iscsiServerCreated.Description = "Updated desc of the iscsiServer";
                iscsiServerCreated.CreateOrUpdate(iscsiServer.Name);
            }
            catch (Exception e)
            {
                Assert.Null(e);
            }
        }
        public static void StartCommand(string[] args)
        {
            if (m_server == null)
            {
                if (m_targets.Count > 0)
                {
                    KeyValuePairList <string, string> parameters = ParseParameters(args, 1);
                    if (!VerifyParameters(parameters, "port", "log"))
                    {
                        Console.WriteLine();
                        Console.WriteLine("Invalid parameter");
                        HelpStart();
                        return;
                    }

                    int port = DefaultISCSIPort;
                    if (parameters.ContainsKey("port"))
                    {
                        port = Conversion.ToInt32(parameters.ValueOf("port"), DefaultISCSIPort);
                    }
                    string logFile = String.Empty;
                    if (parameters.ContainsKey("log"))
                    {
                        logFile = parameters.ValueOf("log");
                    }
                    m_server = new ISCSIServer(m_targets, port, logFile);
                    try
                    {
                        ISCSIServer.Log("Starting Server");
                    }
                    catch (IOException)
                    {
                        Console.WriteLine("Could not append to log file");
                        return;
                    }

                    try
                    {
                        m_server.Start();
                        Console.WriteLine("Server started, listening on port {0}", port);
                    }
                    catch (SocketException)
                    {
                        Console.WriteLine("Could not start iSCSI server");
                        m_server.Stop();
                        m_server = null;
                    }
                }
                else
                {
                    Console.WriteLine("No disks have been attached");
                }
            }
        }
예제 #4
0
        /// <summary>
        /// Returns chap settings for the given device
        /// </summary>
        /// <param name="iscsiServer"></param>
        /// <param name="deviceName"></param>
        /// <returns></returns>
        public static IEnumerable <ChapSettings> GetChapSettings(
            this ISCSIServer iscsiServer,
            string deviceName)
        {
            var chapSettings = iscsiServer.Client.ChapSettings.ListByDevice(
                deviceName,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            return(chapSettings);
        }
 /// <summary>
 /// Returns metrics for a given iscsiserver
 /// </summary>
 /// <param name="iscsiServer"></param>
 /// <param name="deviceName"></param>
 /// <param name="odataQuery"></param>
 /// <returns></returns>
 public static IEnumerable <Metrics> GetMetrics(
     this ISCSIServer iscsiServer,
     string deviceName,
     ODataQuery <MetricFilter> odataQuery)
 {
     return(iscsiServer.Client.IscsiServers.ListMetrics(
                deviceName,
                iscsiServer.Name,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName,
                odataQuery));
 }
 public static void StopCommand(string[] args)
 {
     if (m_server != null)
     {
         m_server.Stop();
         m_server = null;
         Console.WriteLine("iSCSI target is stopping");
     }
     else
     {
         Console.WriteLine("iSCSI target has not been started");
     }
 }
        /// <summary>
        /// Triggers clone operation on a iscsiserver for given backupset
        /// </summary>
        /// <param name="backupSet"></param>
        /// <param name="deviceName"></param>
        /// <param name="isciServer"></param>
        /// <param name="backupElementName"></param>
        /// <param name="endPointName"></param>
        public static void Clone(
            this Backup backupSet,
            string deviceName,
            ISCSIServer isciServer,
            string backupElementName,
            string endPointName)
        {
            var device = backupSet.Client.Devices.Get(
                deviceName,
                backupSet.ResourceGroupName,
                backupSet.ManagerName);

            Assert.True(
                device != null,
                "no matching device found with name:" + deviceName);

            Assert.True(
                isciServer != null,
                "iscsiServer param is null");

            var restoreIscsiDisk = new ISCSIDisk(
                backupSet.Client,
                backupSet.ResourceGroupName,
                backupSet.ManagerName,
                endPointName);

            restoreIscsiDisk.Initialize(DataPolicy.Tiered);
            restoreIscsiDisk.Description = "Restore Disk ";

            var cloneRequest = new CloneRequest()
            {
                NewEndpointName     = endPointName,
                TargetAccessPointId = isciServer.Id,
                TargetDeviceId      = device.Id,
                Disk = restoreIscsiDisk
            };

            backupSet.Client.Backups.Clone(
                device.Name.GetDoubleEncoded(),
                backupSet.Name.GetDoubleEncoded(),
                backupElementName,
                cloneRequest,
                backupSet.ResourceGroupName,
                backupSet.ManagerName);
        }
        /// <summary>
        /// Returns disks from a given iscsiserver on a device
        /// </summary>
        /// <param name="iscsiServer"></param>
        /// <param name="deviceName"></param>
        /// <returns></returns>
        public static IEnumerable <ISCSIDisk> GetIscsiDisks(
            this ISCSIServer iscsiServer,
            string deviceName)
        {
            var iscsiDisks = iscsiServer.Client.IscsiDisks.ListByIscsiServer(
                deviceName.GetDoubleEncoded(),
                iscsiServer.Name.GetDoubleEncoded(),
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            if (iscsiDisks == null || !iscsiDisks.Any())
            {
                // Create a IscsiDisk with Tiered data policy
                var iscsiDisktoCreate = new ISCSIDisk(
                    iscsiServer.Client,
                    iscsiServer.ResourceGroupName,
                    iscsiServer.ManagerName,
                    TestConstants.DefaultTieredIscsiDiskName);
                iscsiDisktoCreate.Initialize(DataPolicy.Tiered);

                var iscsiDisk = iscsiDisktoCreate.CreateOrUpdate(
                    iscsiServer.Name,
                    iscsiServer.Name);
            }

            iscsiDisks = iscsiServer.Client.IscsiDisks.ListByIscsiServer(
                deviceName.GetDoubleEncoded(),
                iscsiServer.Name.GetDoubleEncoded(),
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            foreach (var iscsiDisk in iscsiDisks)
            {
                iscsiDisk.SetBaseResourceValues(
                    iscsiServer.Client,
                    iscsiServer.ResourceGroupName,
                    iscsiServer.ManagerName);
            }

            return(iscsiDisks);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="iscsiServer"></param>
        /// <returns></returns>
        public static Backup BackupNow(this ISCSIServer iscsiServer)
        {
            var    startTime  = DateTime.UtcNow;
            string deviceName = iscsiServer.Name;

            iscsiServer.Client.IscsiServers.BackupNow(
                deviceName.GetDoubleEncoded(),
                iscsiServer.Name.GetDoubleEncoded(),
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            var endTime = DateTime.UtcNow;

            // Query for a backup
            Expression <Func <BackupFilter, bool> > filter =
                backupFilter => backupFilter.InitiatedBy == InitiatedBy.Manual;

            var backupSets = iscsiServer.Client.Backups.ListByDevice(
                deviceName,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName,
                new ODataQuery <BackupFilter>(filter));

            Assert.True(backupSets != null && backupSets.Count() > 0,
                        "No backups found for iscsiserver:" + iscsiServer.Name);

            var backupElements = backupSets.First().Elements;

            Assert.True(backupElements != null && backupElements.Count() > 0,
                        "Backups found, however no backup elements were found.");

            foreach (var bs in backupSets)
            {
                bs.SetBaseResourceValues(
                    iscsiServer.Client,
                    iscsiServer.ResourceGroupName,
                    iscsiServer.ManagerName);
            }

            return(backupSets.FirstOrDefault());
        }
        /// <summary>
        /// Initlaizes a given iscsi server instance
        /// </summary>
        /// <param name="iscsiServer"></param>
        /// <param name="storageDomainId"></param>
        /// <param name="backupSchGroupId"></param>
        public static void Initialize(
            this ISCSIServer iscsiServer,
            string storageDomainId,
            string backupSchGroupId)
        {
            iscsiServer.StorageDomainId       = storageDomainId;
            iscsiServer.BackupScheduleGroupId = backupSchGroupId;
            iscsiServer.Description           = "Demo ISCSIServer for SDK Test";
            iscsiServer.ChapId        = "";
            iscsiServer.ReverseChapId = "";

            var chaps = iscsiServer.Client.ChapSettings.ListByDevice(
                iscsiServer.Name,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            if (chaps != null && chaps.Any())
            {
                iscsiServer.ChapId        = chaps.First().Id;
                iscsiServer.ReverseChapId = chaps.First().Id;
            }
        }
        /// <summary>
        /// Creates or updates a given iscsiserver
        /// </summary>
        /// <param name="iscsiServer"></param>
        /// <param name="deviceName"></param>
        /// <returns></returns>
        public static ISCSIServer CreateOrUpdate(
            this ISCSIServer iscsiServer,
            string deviceName)
        {
            iscsiServer.Client.IscsiServers.CreateOrUpdate(
                deviceName.GetDoubleEncoded(),
                iscsiServer.Name.GetDoubleEncoded(),
                iscsiServer,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            var iscsiServerCreated = iscsiServer.Client.IscsiServers.Get(
                deviceName,
                iscsiServer.Name,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            iscsiServerCreated.SetBaseResourceValues(
                iscsiServer.Client,
                iscsiServer.ResourceGroupName,
                iscsiServer.ManagerName);

            return(iscsiServerCreated);
        }
예제 #12
0
        private static void ReadConfig()
        {
            if (!File.Exists(CONFIG_FILE))
            {
                Console.WriteLine($"{CONFIG_FILE} not found, starting in interactive mode");
                return;
            }

            var config = JsonConvert.DeserializeObject <Config>(File.ReadAllText(CONFIG_FILE));

            if (config.Targets == null || config.Targets.Length == 0)
            {
                Console.WriteLine($"No targets configured, starting in interactive mode");
                return;
            }

            var targets = new List <ISCSITarget>();

            foreach (var targetConfig in config.Targets)
            {
                Console.WriteLine("Adding target '{0}'", targetConfig.Name);
                var disks = new List <Disk>();

                foreach (var diskConfig in targetConfig.Disks)
                {
                    Disk disk;
                    var  parameters = diskConfig.Parameters as JObject;
                    switch (diskConfig.Kind)
                    {
                    case DiskKind.Raw:
                        Console.WriteLine("  Adding Raw disk image '{0}'. Filename: '{1}'",
                                          diskConfig.Name, parameters["File"].Value <string>());
                        disk = DiskImage.GetDiskImage(parameters["File"].Value <string>());
                        break;

                    case DiskKind.External:
                        Console.WriteLine("  Adding External disk '{0}'", diskConfig.Name);
                        var type    = Type.GetType(parameters["Type"].Value <string>());
                        var extDisk = Activator.CreateInstance(type) as ExternalDisk;
                        extDisk.SetParameters(parameters);
                        disk = extDisk;
                        break;

                    default:
                        throw new NotImplementedException();
                    }
                    if (disk is DiskImage)
                    {
                        bool isLocked = ((DiskImage)disk).ExclusiveLock();
                        if (!isLocked)
                        {
                            Console.WriteLine("Error: Cannot lock the disk image for exclusive access");
                            return;
                        }
                    }
                    disks.Add(disk);
                }
                targets.Add(new ISCSITarget(targetConfig.Name, disks));
            }
            m_server                 = new ISCSIServer(targets, config.Port, config.Logging?.File);
            ISCSIServer.LogLevel     = config.Logging.Level;
            ISCSIServer.LogToConsole = config.Logging.LogToConsole;
            m_server.Start();
            Console.WriteLine("Server started, listening on port {0}", config.Port);
        }
 /// <summary>
 /// Creates or updates the iscsi server.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='deviceName'>
 /// The device name.
 /// </param>
 /// <param name='iscsiServerName'>
 /// The iscsi server name.
 /// </param>
 /// <param name='iscsiServer'>
 /// The iscsi server.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The resource group name
 /// </param>
 /// <param name='managerName'>
 /// The manager name
 /// </param>
 /// <param name='cancellationToken'>
 /// The cancellation token.
 /// </param>
 public static async Task <ISCSIServer> BeginCreateOrUpdateAsync(this IIscsiServersOperations operations, string deviceName, string iscsiServerName, ISCSIServer iscsiServer, string resourceGroupName, string managerName, CancellationToken cancellationToken = default(CancellationToken))
 {
     using (var _result = await operations.BeginCreateOrUpdateWithHttpMessagesAsync(deviceName, iscsiServerName, iscsiServer, resourceGroupName, managerName, null, cancellationToken).ConfigureAwait(false))
     {
         return(_result.Body);
     }
 }
 /// <summary>
 /// Creates or updates the iscsi server.
 /// </summary>
 /// <param name='operations'>
 /// The operations group for this extension method.
 /// </param>
 /// <param name='deviceName'>
 /// The device name.
 /// </param>
 /// <param name='iscsiServerName'>
 /// The iscsi server name.
 /// </param>
 /// <param name='iscsiServer'>
 /// The iscsi server.
 /// </param>
 /// <param name='resourceGroupName'>
 /// The resource group name
 /// </param>
 /// <param name='managerName'>
 /// The manager name
 /// </param>
 public static ISCSIServer BeginCreateOrUpdate(this IIscsiServersOperations operations, string deviceName, string iscsiServerName, ISCSIServer iscsiServer, string resourceGroupName, string managerName)
 {
     return(operations.BeginCreateOrUpdateAsync(deviceName, iscsiServerName, iscsiServer, resourceGroupName, managerName).GetAwaiter().GetResult());
 }