private void OpenDatabaseActionCompleted(ActionBase sender)
        {
            VdiOpenDatabaseAction senderAction = (VdiOpenDatabaseAction)sender;

            senderAction.Completed -= OpenDatabaseActionCompleted;

            log.DebugFormat("Metadata database open ({0}). Now start recovering", senderAction.Vdi.Name());

            metadataSession = senderAction.MetadataSession;
            if (metadataSession == null)
            {
                return;
            }

            // assign metadata session to all recover actions
            List <AsyncAction> recoverSubActions = new List <AsyncAction>();

            foreach (var action in actions[senderAction.Vdi])
            {
                if (action is DrRecoverAction)
                {
                    ((DrRecoverAction)action).MetadataSession = metadataSession;
                    recoverSubActions.Add(action);
                }
            }

            multipleRecoverAction = new MultipleAction(Connection,
                                                       String.Format(Messages.DR_WIZARD_RECOVERPAGE_RECOVER_FROM, senderAction.Vdi.Name()),
                                                       String.Format(Messages.DR_WIZARD_RECOVERPAGE_RECOVERING_FROM, senderAction.Vdi.Name()),
                                                       Messages.COMPLETED,
                                                       recoverSubActions);
            multipleRecoverAction.Completed += MultipleRecoverActionCompleted;
            multipleRecoverAction.RunAsync();
        }
Beispiel #2
0
        private void okButton_Click(object sender, EventArgs e)
        {
            List <AsyncAction> actions = GetActions();

            if (actions.Count == 0)
            {
                return;
            }

            var multipleAction = new MultipleAction(
                connection,
                string.Format(Messages.UPDATE_PROPERTIES, Helpers.GetName(connection).Ellipsise(50)),
                Messages.UPDATING_PROPERTIES,
                Messages.UPDATED_PROPERTIES,
                actions, true);

            multipleAction.RunAsync();
        }
Beispiel #3
0
        private void StartUploading()
        {
            // reset progress bar and action progress description
            UpdateActionProgress(null);

            // start the upload
            var actions = uploadActions.Values.Where(a => a != null).ToList();

            if (actions.Count == 0)
            {
                return;
            }

            using (var multipleAction = new MultipleAction(Connection, Messages.UPLOAD_PATCH_TITLE, Messages.UPLOAD_PATCH_DESCRIPTION, Messages.UPLOAD_PATCH_END_DESCRIPTION, actions, true, true, true))
            {
                multipleAction.Completed += multipleAction_Completed;
                multipleAction.RunAsync();
            }
        }
Beispiel #4
0
        private bool SaveChanges()
        {
            if (!HasChanged())
            {
                return(false);
            }

            var mem = memorySpinner.Value;

            DialogResult dialogResult;

            using (var dlg = new ThreeButtonDialog(
                       new ThreeButtonDialog.Details(SystemIcons.Warning, Messages.CONFIRM_CHANGE_CONTROL_DOMAIN_MEMORY, Messages.XENCENTER),
                       ThreeButtonDialog.ButtonYes,
                       ThreeButtonDialog.ButtonNo))
            {
                dialogResult = dlg.ShowDialog(this);
            }

            if (DialogResult.Yes != dialogResult)
            {
                return(false);
            }

            var actions = new List <AsyncAction>();
            var action  = new ChangeControlDomainMemoryAction(host, (long)mem, false);

            actions.Add(action);

            actions.Add(new RebootHostAction(host, AddHostToPoolCommand.NtolDialog));

            var multipleAction = new MultipleAction(connection,
                                                    string.Format(Messages.ACTION_CHANGE_CONTROL_DOMAIN_MEMORY, host.Name),
                                                    string.Format(Messages.ACTION_CHANGE_CONTROL_DOMAIN_MEMORY, host.Name),
                                                    Messages.COMPLETED, actions, true, false, true);

            multipleAction.RunAsync();
            return(true);
        }
Beispiel #5
0
        public override void PageLoaded(PageLoadedDirection direction)
        {
            base.PageLoaded(direction);

            if (_thisPageHasBeenCompleted)
            {
                actionsWorker = null;
                return;
            }

            if (!IsAutomaticMode)
            {
                textBoxLog.Text = ManualTextInstructions;

                List <AsyncAction> actions = new List <AsyncAction>();

                if (SelectedUpdateType == UpdateType.ISO && PoolUpdate != null)
                {
                    //Ely or greater: iso update format
                    foreach (var server in SelectedServers)
                    {
                        actions.Add(new ApplyUpdateAction(PoolUpdate, server));
                    }
                }
                else
                {
                    //legacy mode
                    if (SelectedUpdateType != UpdateType.ISO)
                    {
                        foreach (var server in SelectedServers)
                        {
                            actions.Add(new ApplyPatchAction(Patch, server));
                        }
                    }
                    else
                    {
                        actions.Add(new InstallSupplementalPackAction(SuppPackVdis, false));
                    }
                }

                if (RemoveUpdateFile && SelectedUpdateType != UpdateType.ISO)
                {
                    foreach (Pool pool in SelectedPools)
                    {
                        actions.Add(new PoolPatchCleanAction(pool, Patch, false));
                    }
                }

                using (var multipleAction = new MultipleAction(Connection, "", "", "", actions, true, true, true))
                {
                    multipleAction.Changed   += action_Changed;
                    multipleAction.Completed += action_Completed;
                    multipleAction.RunAsync();
                }
                return;
            }

            _nextEnabled = false;
            OnPageUpdated();

            List <PlanAction> planActions = new List <PlanAction>();

            foreach (Pool pool in SelectedPools)
            {
                var  poolHosts = new List <Host>(pool.Connection.Cache.Hosts);
                Host master    = SelectedServers.Find(host => host.IsMaster() && poolHosts.Contains(host));

                //For Ely or greater: ISO updates only
                if (SelectedUpdateType == UpdateType.ISO && Helpers.ElyOrGreater(pool.Connection)) //updates for Ely (or higher) are always ISO
                {
                    var poolUpdates = new List <Pool_update>(pool.Connection.Cache.Pool_updates);
                    var poolUpdate  = poolUpdates.FirstOrDefault(u => u != null && string.Equals(u.uuid, PoolUpdate.uuid, StringComparison.OrdinalIgnoreCase));

                    //master first
                    if (master != null && !poolUpdate.AppliedOn(master))
                    {
                        planActions.AddRange(CompilePoolUpdateActionList(master, poolUpdate));
                    }

                    //other hosts
                    foreach (var host in SelectedServers.Where(s => poolHosts.Contains(s) && !s.IsMaster() && !poolUpdate.AppliedOn(s)).ToList())
                    {
                        planActions.AddRange(CompilePoolUpdateActionList(host, poolUpdate));
                    }
                }
                // Legacy (pre-Ely) case: either ISO for supplemental packs (Pool_patch == null) or patch (Pool_patch != null)
                else
                {
                    Pool_patch poolPatch = null;

                    if (SelectedUpdateType != UpdateType.ISO)
                    {
                        List <Pool_patch> poolPatches = new List <Pool_patch>(pool.Connection.Cache.Pool_patches);

                        poolPatch = poolPatches.Find(delegate(Pool_patch otherPatch)
                        {
                            if (Patch != null)
                            {
                                return(string.Equals(otherPatch.uuid, Patch.uuid, StringComparison.OrdinalIgnoreCase));
                            }
                            return(false);
                        });
                    }

                    //master first
                    if (master != null && (poolPatch == null || poolPatch.AppliedOn(master) == DateTime.MaxValue))
                    {
                        planActions.AddRange(CompileActionList(master, poolPatch));
                    }

                    foreach (Host server in SelectedServers)
                    {
                        if (poolHosts.Contains(server))
                        {
                            if (!server.IsMaster())
                            {
                                // check patch isn't already applied here
                                if (poolPatch == null || poolPatch.AppliedOn(server) == DateTime.MaxValue)
                                {
                                    planActions.AddRange(CompileActionList(server, poolPatch));
                                }
                            }
                        }
                    }

                    if (RemoveUpdateFile)
                    {
                        planActions.Add(new RemoveUpdateFile(pool, poolPatch));
                    }
                }
            } //end pool in foreach

            planActions.Add(new UnwindProblemsAction(ProblemsResolvedPreCheck));

            actionsWorker         = new BackgroundWorker();
            actionsWorker.DoWork += new DoWorkEventHandler(PatchingWizardAutomaticPatchWork);
            actionsWorker.WorkerReportsProgress      = true;
            actionsWorker.ProgressChanged           += new ProgressChangedEventHandler(actionsWorker_ProgressChanged);
            actionsWorker.RunWorkerCompleted        += new RunWorkerCompletedEventHandler(actionsWorker_RunWorkerCompleted);
            actionsWorker.WorkerSupportsCancellation = true;
            actionsWorker.RunWorkerAsync(planActions);
        }
Beispiel #6
0
        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) && !Helpers.ElyOrGreater(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();
            }
        }
        public override void PageLoaded(PageLoadedDirection direction)
        {
            base.PageLoaded(direction);

            if (_thisPageHasBeenCompleted)
            {
                actionManualMode = null;
                actionsWorker    = null;
                return;
            }

            if (!IsAutomaticMode)
            {
                textBoxLog.Text = ManualTextInstructions;

                List <AsyncAction> actions = new List <AsyncAction>();
                if (SelectedUpdateType != UpdateType.NewSuppPack)
                {
                    actionManualMode = new ApplyPatchAction(new List <Pool_patch> {
                        Patch
                    }, SelectedServers);
                }
                else
                {
                    actionManualMode = new InstallSupplementalPackAction(SuppPackVdis, false);
                }

                actions.Add(actionManualMode);
                if (RemoveUpdateFile && SelectedUpdateType != UpdateType.NewSuppPack)
                {
                    foreach (Pool pool in SelectedPools)
                    {
                        actions.Add(new PoolPatchCleanAction(pool, Patch, false));
                    }
                }

                using (var multipleAction = new MultipleAction(Connection, "", "", "", actions, true, true, true))
                {
                    multipleAction.Changed   += action_Changed;
                    multipleAction.Completed += action_Completed;
                    multipleAction.RunAsync();
                }
                return;
            }

            _nextEnabled = false;
            OnPageUpdated();

            List <PlanAction> planActions = new List <PlanAction>();

            foreach (Pool pool in SelectedPools)
            {
                Pool_patch poolPatch = null;
                if (SelectedUpdateType != UpdateType.NewSuppPack)
                {
                    List <Pool_patch> poolPatches = new List <Pool_patch>(pool.Connection.Cache.Pool_patches);
                    poolPatch = poolPatches.Find(delegate(Pool_patch otherPatch)
                    {
                        if (Patch != null)
                        {
                            return(string.Equals(otherPatch.uuid, Patch.uuid, StringComparison.OrdinalIgnoreCase));
                        }
                        return(false);
                    });
                }

                List <Host> poolHosts = new List <Host>(pool.Connection.Cache.Hosts);
                Host        master    = SelectedServers.Find(host => host.IsMaster() && poolHosts.Contains(host));
                if (master != null && (poolPatch == null || poolPatch.AppliedOn(master) == DateTime.MaxValue))
                {
                    planActions.AddRange(CompileActionList(master, poolPatch));
                }
                foreach (Host server in SelectedServers)
                {
                    if (poolHosts.Contains(server))
                    {
                        if (!server.IsMaster())
                        {
                            // check patch isn't already applied here
                            if (poolPatch == null || poolPatch.AppliedOn(server) == DateTime.MaxValue)
                            {
                                planActions.AddRange(CompileActionList(server, poolPatch));
                            }
                        }
                    }
                }
                if (RemoveUpdateFile)
                {
                    planActions.Add(new RemoveUpdateFile(pool, poolPatch));
                }
            }
            planActions.Add(new UnwindProblemsAction(ProblemsResolvedPreCheck));

            actionsWorker         = new BackgroundWorker();
            actionsWorker.DoWork += new DoWorkEventHandler(PatchingWizardAutomaticPatchWork);
            actionsWorker.WorkerReportsProgress      = true;
            actionsWorker.ProgressChanged           += new ProgressChangedEventHandler(actionsWorker_ProgressChanged);
            actionsWorker.RunWorkerCompleted        += new RunWorkerCompletedEventHandler(actionsWorker_RunWorkerCompleted);
            actionsWorker.WorkerSupportsCancellation = true;
            actionsWorker.RunWorkerAsync(planActions);
        }
Beispiel #8
0
        public void RunCreate(SelectedItem selection)
        {
            //判断是否有足够空间创建输入数量的虚拟机
            VM                   temp   = selection.XenObject as VM;
            List <VBD>           vbds   = selection.Connection.ResolveAll <VBD>(temp.VBDs);
            List <VDI>           vdis   = new List <VDI>();
            Dictionary <VDI, SR> vdi_sr = new Dictionary <VDI, SR>();

            if (Number > 0)
            {
                //取所有的vdi
                foreach (VBD vbd in vbds)
                {
                    if (selection.Connection.Resolve <VDI>(vbd.VDI) != null)
                    {
                        vdis.Add(selection.Connection.Resolve <VDI>(vbd.VDI));
                    }
                }
                //用Dictionary保存每个vdi对应的sr,vdi-sr
                foreach (VDI vdi in vdis)
                {
                    vdi_sr.Add(vdi, selection.Connection.Resolve <SR>(vdi.SR));
                }
                //用List保存所有相同SR的vdi,计算出能创建的最多个数后保存到Dictionary中,然后清空List
                long                 allvdisize       = 0;
                long                 free_sr_size     = 0;
                long                 storage_overhead = 0;
                List <VDI>           samevdis         = new List <VDI>();
                Dictionary <SR, int> sr_vdinum        = new Dictionary <SR, int>();
                for (int i = 0; i < vdis.Count; i++)
                {
                    for (int j = i; j < vdis.Count; j++)
                    {
                        if (vdi_sr[vdis[i]] == vdi_sr[vdis[j]])
                        {
                            samevdis.Add(vdis[j]);
                        }
                    }
                    foreach (VDI vdi in samevdis)
                    {
                        allvdisize += vdi.virtual_size;
                    }
                    foreach (VDI vdi in selection.Connection.ResolveAll <VDI>(vdi_sr[samevdis[0]].VDIs))
                    {
                        storage_overhead += vdi.virtual_size;
                    }
                    free_sr_size = vdi_sr[samevdis[0]].FreeSpace;
                    sr_vdinum.Add(vdi_sr[samevdis[0]], Convert.ToInt32(free_sr_size / allvdisize));
                    foreach (VDI vdi in samevdis)
                    {
                        vdi_sr.Remove(vdi);
                        vdis.Remove(vdi);
                    }
                    samevdis.Clear();
                    i = -1;
                }
                if (Number > sr_vdinum.Values.Min())
                {
                    new NotEnoughStorageWarningDialog().ShowDialog();
                    return;
                }
            }
            List <AsyncAction> actions = new List <AsyncAction>();

            for (int i = 0; i < Number; i++)
            {
                var createAction = new CreateVMFastAction(selection.Connection, selection.XenObject as VM);
//                createAction.Completed += createAction_Completed;
                actions.Add(createAction);
            }
            MultipleAction multiAction = new MultipleAction(selectedItem.Connection, Messages.INSTANT_CREATE_VMS, Messages.INSTANT_CREATE_VMS_START, Messages.INSTANT_CREATE_VMS_FINISH, actions);

            multiAction.RunAsync();
        }