protected override void Run()
        {
            Description = String.Format(Messages.ACTION_GET_DISK_SPACE_REQUIREMENTS_DESCRIPTION, Host.Name);

            string result;

            // get required disk space
            long requiredDiskSpace = updateSize;

            try
            {
                var args = new Dictionary <string, string>();
                args.Add("size", updateSize.ToString());

                result            = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_required_space", args);
                requiredDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_required_space on {0} failed with {1}", Host.Name, failure.Message);
                requiredDiskSpace = 0;
            }

            // get available disk space
            long availableDiskSpace = 0;

            try
            {
                result             = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_avail_host_disk_space", new Dictionary <string, string>());
                availableDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_avail_host_disk_space on {0} failed with {1}", Host.Name, failure.Message);
            }

            // get reclaimable disk space (excluding current patch)
            long reclaimableDiskSpace = 0;

            try
            {
                var args = new Dictionary <string, string>();
                if (currentPatch != null)
                {
                    args.Add("exclude", currentPatch.uuid);
                }
                result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
                reclaimableDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
            }

            var operation = Actions.DiskSpaceRequirements.OperationTypes.upload;

            DiskSpaceRequirements = new DiskSpaceRequirements(operation, Host, updateName, requiredDiskSpace, availableDiskSpace, reclaimableDiskSpace);

            log.WarnFormat("Cleanup message: \r\n{0}", DiskSpaceRequirements.GetSpaceRequirementsMessage());
        }
 protected override void Run()
 {
     SafeToExit  = false;
     Description = String.Format(Messages.ACTION_CHECK_DISK_SPACE_DESCRIPTION, Host.Name);
     if (!IsEnoughDiskSpace())
     {
         DiskSpaceRequirements diskSpaceRequirements = null;
         var getDiskSpaceRequirementsAction          = new GetDiskSpaceRequirementsAction(Host, fileName, fileSize, true);
         try
         {
             getDiskSpaceRequirementsAction.RunExternal(Session);
             diskSpaceRequirements = getDiskSpaceRequirementsAction.DiskSpaceRequirements;
         }
         catch (Failure failure)
         {
             log.WarnFormat("Getting disk space requirements on {0} failed with: {1}", Host.Name, failure.Message);
         }
         Exception = new NotEnoughSpaceException(Host.Name, fileName, diskSpaceRequirements);
     }
 }
 public NotEnoughSpaceException(string host, string fileName, DiskSpaceRequirements diskSpaceRequirements)
 {
     this.host             = host;
     this.fileName         = fileName;
     DiskSpaceRequirements = diskSpaceRequirements;
 }
        private void TryUploading()
        {
            // reset progress bar and action progress description
            UpdateActionProgress(null);

            // Check if we can upload the patches to the masters if it is necessary.
            // This check is only available for Cream or greater hosts.
            // If we can upload (i.e. there is enough disk space) then start the upload.
            // Otherwise display error.
            canUpload = true;
            diskSpaceRequirements = null;
            var diskSpaceActions = new List<AsyncAction>();
            foreach (Host master in SelectedMasters.Where(master => Helpers.CreamOrGreater(master.Connection)))
            {
                AsyncAction action = null;
                switch (SelectedUpdateType)
                {
                    case UpdateType.NewRetail:
                        if (CanUploadUpdateOnHost(SelectedNewPatchPath, master))
                            action = new CheckDiskSpaceForPatchUploadAction(master, SelectedNewPatchPath, true);
                        break;
                    case UpdateType.Existing:
                        if (SelectedExistingPatch != null && !PatchExistsOnPool(SelectedExistingPatch, master))
                            action = new CheckDiskSpaceForPatchUploadAction(master, SelectedExistingPatch, true);
                        break;
                }

                if (action != null)
                {
                    action.Changed += delegate
                    {
                        Program.Invoke(Program.MainWindow, () => UpdateActionDescription(action));
                    };
                    diskSpaceActions.Add(action);
                }
            }

            if (diskSpaceActions.Count == 0)
            {
                StartUploading();
                return;
            }

            using (var multipleAction = new MultipleAction(Connection, "", "", "", diskSpaceActions, true, true, true))
            {
                multipleAction.Completed += delegate
                {
                    Program.Invoke(Program.MainWindow, () =>
                    {
                        if (multipleAction.Exception is NotEnoughSpaceException)
                        {
                            canUpload = false;
                            diskSpaceRequirements = (multipleAction.Exception as NotEnoughSpaceException).DiskSpaceRequirements;
                        }
                        UpdateButtons();
                        OnPageUpdated();
                        if (canUpload)
                            StartUploading();
                    });
                };
                multipleAction.RunAsync();
            }
        }
        protected override void Run()
        {
            Description = String.Format(Messages.ACTION_GET_DISK_SPACE_REQUIREMENTS_DESCRIPTION, Host.Name);

            long requiredDiskSpace = updateSize;
            string result;

            // get available disk space
            long availableDiskSpace = 0;
            try
            {
                result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_avail_host_disk_space", new Dictionary<string, string>());
                availableDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_avail_host_disk_space on {0} failed with {1}", Host.Name, failure.Message);
            }

            // get reclaimable disk space (excluding current patch)
            long reclaimableDiskSpace = 0;
            try
            {
                var args = new Dictionary<string, string>();
                if (currentPatch != null)
                    args.Add("exclude", currentPatch.uuid);
                 result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
                 reclaimableDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
            }

            var operation = Actions.DiskSpaceRequirements.OperationTypes.upload;

            DiskSpaceRequirements = new DiskSpaceRequirements(operation, Host, updateName, requiredDiskSpace, availableDiskSpace, reclaimableDiskSpace);

            log.WarnFormat("Cleanup message: \r\n{0}", DiskSpaceRequirements.GetSpaceRequirementsMessage());
        }
Пример #6
0
        private Problem FindProblem(string errorcode, string found, string required)
        {
            long requiredSpace = 0;
            long foundSpace = 0;
            long reclaimableDiskSpace = 0;

            DiskSpaceRequirements diskSpaceReq;

            switch (errorcode)
            {
                case "UPDATE_PRECHECK_FAILED_WRONG_SERVER_VERSION":
                    return new WrongServerVersion(this, Host);

                case "UPDATE_PRECHECK_FAILED_CONFLICT_PRESENT":
                    return new ConflictingUpdatePresent(this, found, Host);

                case "UPDATE_PRECHECK_FAILED_PREREQUISITE_MISSING":
                    return new PrerequisiteUpdateMissing(this, found, Host);

                case "PATCH_PRECHECK_FAILED_WRONG_SERVER_VERSION":
                    return new WrongServerVersion(this, required, Host);

                case "PATCH_PRECHECK_FAILED_OUT_OF_SPACE":
                    System.Diagnostics.Trace.Assert(Helpers.CreamOrGreater(Host.Connection));  // If not Cream or greater, we shouldn't get this error

                    long.TryParse(found, out foundSpace);
                    long.TryParse(required, out requiredSpace);
                    // get reclaimable disk space (excluding current patch)
                    try
                    {
                        var args = new Dictionary<string, string> { { "exclude", Patch.uuid } };
                        var resultReclaimable = Host.call_plugin(Host.Connection.Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
                        reclaimableDiskSpace = Convert.ToInt64(resultReclaimable);
                    }
                    catch (Failure failure)
                    {
                        log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
                    }

                    diskSpaceReq = new DiskSpaceRequirements(DiskSpaceRequirements.OperationTypes.install, Host, Patch.Name, requiredSpace, foundSpace, reclaimableDiskSpace);

                    return new HostOutOfSpaceProblem(this, Host, Patch, diskSpaceReq);

                case "UPDATE_PRECHECK_FAILED_OUT_OF_SPACE":
                    System.Diagnostics.Trace.Assert(Helpers.ElyOrGreater(Host.Connection));  // If not Ely or greater, we shouldn't get this error
                    long.TryParse(found, out foundSpace);
                    long.TryParse(required, out requiredSpace);

                    diskSpaceReq = new DiskSpaceRequirements(DiskSpaceRequirements.OperationTypes.install, Host, Update.Name, requiredSpace, foundSpace, 0);

                    return new HostOutOfSpaceProblem(this, Host, Update, diskSpaceReq);

                case "OUT_OF_SPACE":
                    if (Helpers.CreamOrGreater(Host.Connection))
                    {
                        var action = new GetDiskSpaceRequirementsAction(Host, Patch, true);
                        try
                        {
                            action.RunExternal(action.Session);
                        }
                        catch
                        {
                            log.WarnFormat("Could not get disk space requirements");
                        }
                        if (action.Succeeded)
                            return new HostOutOfSpaceProblem(this, Host, Patch, action.DiskSpaceRequirements);
                    }
                    break;
            }
            return null;
        }
 public NotEnoughSpaceException(string host, string fileName, DiskSpaceRequirements diskSpaceRequirements)
 {
     this.host = host;
     this.fileName = fileName;
     DiskSpaceRequirements = diskSpaceRequirements;
 }
 public HostOutOfSpaceProblem(Check check, Host host, Pool_patch patch, DiskSpaceRequirements diskSpaceReq)
     : base(check,  host)
 {
     this.patch = patch;
     this.diskSpaceReq = diskSpaceReq;
 }
Пример #9
0
        protected override void Run()
        {
            Description = String.Format(Messages.ACTION_GET_DISK_SPACE_REQUIREMENTS_DESCRIPTION, Host.Name);

            string result;

            // get required disk space
            long requiredDiskSpace = updateSize;

            if (!Helpers.ElyOrGreater(Host))  // for ElyOrGreater we don't need to call get_required_space, because it will always return updateSize
            {
                try
                {
                    var args = new Dictionary <string, string>();
                    args.Add("size", updateSize.ToString());

                    result            = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_required_space", args);
                    requiredDiskSpace = Convert.ToInt64(result);
                }
                catch (Failure failure)
                {
                    log.WarnFormat("Plugin call disk-space.get_required_space on {0} failed with {1}", Host.Name, failure.Message);
                    requiredDiskSpace = 0;
                }
            }

            // get available disk space
            long availableDiskSpace = 0;

            try
            {
                result             = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_avail_host_disk_space", new Dictionary <string, string>());
                availableDiskSpace = Convert.ToInt64(result);
            }
            catch (Failure failure)
            {
                log.WarnFormat("Plugin call disk-space.get_avail_host_disk_space on {0} failed with {1}", Host.Name, failure.Message);
            }

            // get reclaimable disk space (excluding current patch)
            long reclaimableDiskSpace = 0;

            if (availableDiskSpace < requiredDiskSpace && !Helpers.ElyOrGreater(Host))  // for ElyOrGreater we shouldn't call get_reclaimable_disk_space
            {
                try
                {
                    var args = new Dictionary <string, string>();
                    if (currentPatch != null)
                    {
                        args.Add("exclude", currentPatch.uuid);
                    }
                    result = Host.call_plugin(Session, Host.opaque_ref, "disk-space", "get_reclaimable_disk_space", args);
                    reclaimableDiskSpace = Convert.ToInt64(result);
                }
                catch (Failure failure)
                {
                    log.WarnFormat("Plugin call disk-space.get_reclaimable_disk_space on {0} failed with {1}", Host.Name, failure.Message);
                }
            }

            DiskSpaceRequirements = new DiskSpaceRequirements(operation, Host, updateName, requiredDiskSpace, availableDiskSpace, reclaimableDiskSpace);

            if (availableDiskSpace < requiredDiskSpace)
            {
                log.WarnFormat("Cleanup message: \r\n{0}", DiskSpaceRequirements.GetSpaceRequirementsMessage());
            }
        }
Пример #10
0
 public HostOutOfSpaceProblem(Check check, Host host, DiskSpaceRequirements diskSpaceReq)
     : base(check, host)
 {
     this.diskSpaceReq = diskSpaceReq;
 }
Пример #11
0
 public HostOutOfSpaceProblem(Check check, Host host, Pool_update update, DiskSpaceRequirements diskSpaceReq)
     : base(check, host)
 {
     this.update = update;
     this.diskSpaceReq = diskSpaceReq;
 }