From 2d6d3ffa6c8b80490c878806c9f5f7efa648efea Mon Sep 17 00:00:00 2001 From: James Hilliard Date: Fri, 17 Feb 2017 02:22:05 -0500 Subject: [PATCH] (feat) add Reinstall VM to instances --- app/Http/Controllers/InstanceController.php | 11 +++++++ app/Listeners/Cloudstack/CheckJobStatus.php | 28 +++++++++++------ app/Listeners/Cloudstack/RecordActivity.php | 6 +++- app/Mail/VMRestored.php | 35 +++++++++++++++++++++ resources/views/emails/vmRestored.blade.php | 7 +++++ resources/views/instance/show.blade.php | 6 ++++ routes/web.php | 1 + 7 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 app/Mail/VMRestored.php create mode 100644 resources/views/emails/vmRestored.blade.php diff --git a/app/Http/Controllers/InstanceController.php b/app/Http/Controllers/InstanceController.php index 0cc8fa0..8d6fe91 100644 --- a/app/Http/Controllers/InstanceController.php +++ b/app/Http/Controllers/InstanceController.php @@ -298,4 +298,15 @@ public function resetPassword($id) return redirect()->route('progress', [$response->jobid]); } + + public function reinstallVirtualMachine($id) + { + // Reinstall Virtual Machine + $response = $this->acs->restoreVirtualMachine(['virtualmachineid' => $id]); + + // Command is async + event(new NewAsyncJob($response->jobid, Auth::User()->id, HttpRequest::server('REMOTE_ADDR'))); + + return redirect()->route('progress', [$response->jobid]); + } } diff --git a/app/Listeners/Cloudstack/CheckJobStatus.php b/app/Listeners/Cloudstack/CheckJobStatus.php index 4c2b38a..a64ca9d 100644 --- a/app/Listeners/Cloudstack/CheckJobStatus.php +++ b/app/Listeners/Cloudstack/CheckJobStatus.php @@ -6,6 +6,7 @@ use App\Events\Cloudstack\JobFinished; use App\Events\Cloudstack\NewAsyncJob; use App\Mail\VMPasswordChanged; +use App\Mail\VMRestored; use App\User; use Cloudstack\CloudStackClient; use Illuminate\Queue\InteractsWithQueue; @@ -43,16 +44,23 @@ public function handle(NewAsyncJob $event) $loopComplete = 1; event(new JobFinished($result, $event->userId, $event->userIpAddress)); - switch ($result->jobinstancetype) { - case 'VirtualMachine': - if ($result->cmd == 'org.apache.cloudstack.api.command.user.vm.DeployVMCmd') { - event(new InstanceWasCreated($result->jobresult->virtualmachine)); - } - if ($result->cmd == 'org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd') { - Mail::to(User::find($event->userId)->email) - ->queue(new VMPasswordChanged($result->jobresult->virtualmachine)); - } - break; + if (isset($result->jobinstancetype)) { + switch ($result->jobinstancetype) { + case 'VirtualMachine': + if ($result->cmd == 'org.apache.cloudstack.api.command.user.vm.DeployVMCmd') { + event(new InstanceWasCreated($result->jobresult->virtualmachine)); + } + if ($result->cmd == 'org.apache.cloudstack.api.command.user.vm.ResetVMPasswordCmd') { + Mail::to(User::find($event->userId)->email) + ->queue(new VMPasswordChanged($result->jobresult->virtualmachine)); + } + break; + } + } else { + if ($result->cmd == 'org.apache.cloudstack.api.command.user.vm.RestoreVMCmd') { + Mail::to(User::find($event->userId)->email) + ->queue(new VMRestored($result->jobresult->virtualmachine)); + } } } diff --git a/app/Listeners/Cloudstack/RecordActivity.php b/app/Listeners/Cloudstack/RecordActivity.php index 8c44f52..8bfd51f 100644 --- a/app/Listeners/Cloudstack/RecordActivity.php +++ b/app/Listeners/Cloudstack/RecordActivity.php @@ -33,7 +33,11 @@ public function handle(JobFinished $event) // Job result is in $event->jobResult Log::debug('RecordActivity listener fired'); - Log::debug("Job Instance type is {$event->jobResult->jobinstancetype}"); + if (isset($event->jobResult->jobinstancetype)) { + Log::debug("Job Instance type is {$event->jobResult->jobinstancetype}"); + } else { + Log::debug("Job Instance type is not set"); + } Log::debug("Command is {$event->jobResult->cmd}"); Log::debug("VM Name is {$event->jobResult->jobresult->virtualmachine->name}"); Log::debug("Auth is " . $event->userId); diff --git a/app/Mail/VMRestored.php b/app/Mail/VMRestored.php new file mode 100644 index 0000000..7b6d3df --- /dev/null +++ b/app/Mail/VMRestored.php @@ -0,0 +1,35 @@ +vm = $vm; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->subject('Instance Was Reinstalled')->view('emails.vmRestored'); + } +} diff --git a/resources/views/emails/vmRestored.blade.php b/resources/views/emails/vmRestored.blade.php new file mode 100644 index 0000000..247d1ea --- /dev/null +++ b/resources/views/emails/vmRestored.blade.php @@ -0,0 +1,7 @@ +You reinstalled an instance!

+ +Name: {{ $vm->name }}
+IP: {{ $vm->nic[0]->ipaddress }}
+Password: {{ $vm->password }}

+ +Thanks for that. \ No newline at end of file diff --git a/resources/views/instance/show.blade.php b/resources/views/instance/show.blade.php index 3461cad..9957d6b 100644 --- a/resources/views/instance/show.blade.php +++ b/resources/views/instance/show.blade.php @@ -57,6 +57,12 @@ @endif +
  • + + Reinstall + +
  • +
  • Destroy diff --git a/routes/web.php b/routes/web.php index a56bf3f..640fb50 100644 --- a/routes/web.php +++ b/routes/web.php @@ -58,6 +58,7 @@ Route::get('instance/{instance}/restore', ['as' => 'instance.recover', 'uses' => 'InstanceController@recover']); Route::get('instance/{instance}/snapshot', ['as' => 'instance.snapshot', 'uses' => 'InstanceController@snapshot']); Route::get('instance/{instance}/resetpw', ['as' => 'instance.resetpw', 'uses' => 'InstanceController@resetPassword']); +Route::get('instance/{instance}/reinstallvm', ['as' => 'instance.reinstallvm', 'uses' => 'InstanceController@reinstallVirtualMachine']); Route::get('snapshot/{snapshot}/createTemplate', ['as' => 'snapshot.newTemplate', 'uses' => 'InstanceController@newTemplateFromSnapshot']); Route::post('snapshot/{snapshot}/createTemplate', ['as' => 'snapshot.createTemplate', 'uses' => 'InstanceController@createTemplateFromSnapshot']);