Skip to content
Snippets Groups Projects
Commit f4b3a4e1 authored by Thibault Debatty's avatar Thibault Debatty
Browse files

add racks management

parent b91afaf7
No related branches found
No related tags found
No related merge requests found
Pipeline #14016 passed
Showing with 273 additions and 26 deletions
...@@ -77,12 +77,6 @@ class OrganizationController extends Controller ...@@ -77,12 +77,6 @@ class OrganizationController extends Controller
$this->authorize("show", $organization); $this->authorize("show", $organization);
return view("organization.show", array("organization" => $organization)); return view("organization.show", array("organization" => $organization));
} }
public function rack(Organization $organization)
{
$this->authorize("show", $organization);
return view("organization.rack", ["organization" => $organization]);
}
public function dashboard(Organization $organization) public function dashboard(Organization $organization)
{ {
......
<?php
namespace App\Http\Controllers;
use App\Rack;
use App\Organization;
use Illuminate\Http\Request;
class RackController extends Controller
{
/**
* Display a listing of the resource.
*
*/
public function index(Organization $organization)
{
$this->authorize("show", $organization);
return view("organization.rack", ["organization" => $organization]);
}
/**
* Show the form for creating a new resource.
*
*/
public function create(Organization $organization)
{
return view("rack.edit", [
"rack" => new Rack(),
"organization" => $organization]);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
*/
public function store(Organization $organization, Request $request)
{
return $this->save($organization, $request, new Rack());
}
public function save(Organization $organization, Request $request, Rack $rack)
{
$request->validate([
"name" => "required|string",
"height" => "required|integer|min:1|max:50"
]);
$rack->name = $request->name;
$rack->height = $request->height;
$rack->organization_id = $organization->id;
$rack->save();
return redirect(action("RackController@index", ["organization" => $organization]));
}
/**
* Remove the specified resource from storage.
*
* @param \App\Rack $rack
*/
public function destroy(Rack $rack)
{
//
}
}
...@@ -22,6 +22,7 @@ class ServerController extends Controller ...@@ -22,6 +22,7 @@ class ServerController extends Controller
'name' => 'required|string|regex:/^[a-zA-Z0-9\s\-\.]+$/|max:255', 'name' => 'required|string|regex:/^[a-zA-Z0-9\s\-\.]+$/|max:255',
"organization_id" => Rule::in(Auth::user()->organizations->modelKeys()), "organization_id" => Rule::in(Auth::user()->organizations->modelKeys()),
"description" => 'nullable|string', "description" => 'nullable|string',
"rack_id" => "required|integer",
"size" => "nullable|int|min:0|max:48", "size" => "nullable|int|min:0|max:48",
"position" => "nullable|int|min:0|max:48"]; "position" => "nullable|int|min:0|max:48"];
} }
...@@ -94,6 +95,12 @@ class ServerController extends Controller ...@@ -94,6 +95,12 @@ class ServerController extends Controller
$server->description = $request->description; $server->description = $request->description;
$server->size = $request->size; $server->size = $request->size;
$server->position = $request->position; $server->position = $request->position;
$server->rack_id = $request->rack_id;
if ($server->rack_id == 0) {
$server->rack_id = null;
}
$server->save(); $server->save();
return redirect(action("ServerController@show", ["server" => $server])); return redirect(action("ServerController@show", ["server" => $server]));
......
...@@ -43,12 +43,18 @@ class Organization extends Model ...@@ -43,12 +43,18 @@ class Organization extends Model
public function users() public function users()
{ {
return $this->belongsToMany("App\User"); return $this->belongsToMany(User::class);
} }
public function servers() public function servers()
{ {
return $this->hasMany("App\Server"); return $this->hasMany(Server::class);
}
public function racks()
{
return $this->hasMany(Rack::class);
} }
public function url() : string public function url() : string
......
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Rack extends Model
{
public function servers()
{
return $this->hasMany(Server::class);
}
}
...@@ -199,4 +199,9 @@ class Server extends Model ...@@ -199,4 +199,9 @@ class Server extends Model
$converter = new CommonMarkConverter(); $converter = new CommonMarkConverter();
return $converter->convertToHtml($this->description ?? ''); return $converter->convertToHtml($this->description ?? '');
} }
public function rack()
{
return $this->belongsTo(Rack::class);
}
} }
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateRacksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('racks', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
$table->integer("organization_id")->references("id")->on("organizations");
$table->string("name");
$table->integer("height");
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('racks');
}
}
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ServersAddRackId extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('servers', function (Blueprint $table) {
$table->bigInteger("rack_id")
->nullable()
->references("id")->on("servers")
->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('servers', function (Blueprint $table) {
//
});
}
}
@extends('layouts.app') @extends('layouts.app')
@section('content') @section('content')
<div class="container-fluid pb-4"> <div class="container-fluid pb-4 text-center">
<div class="rack size-42u"> @foreach ($organization->racks as $rack)
@for ($i = 0; $i < 42; $i++) <div class="rack size-{{ $rack->height + 1 }}u">
<div class="slot" style="bottom: {{ 2*$i }}rem"> <div class="slot" style="top: 0">
{{ $rack->name }}
</div>
@for ($i = 0; $i < $rack->height; $i++)
<div class="slot text-left" style="bottom: {{ 2*$i }}rem">
{{ $i + 1 }} {{ $i + 1 }}
</div> </div>
@endfor @endfor
@foreach ($organization->servers as $server) @foreach ($rack->servers as $server)
@if ($server->size == 0) @if ($server->size == 0)
@continue @continue
@endif @endif
<div class="server size-{{ $server->size }}u" <div class="server text-left size-{{ $server->size }}u"
style="bottom: {{ 2*($server->position - 1) }}rem;"> style="bottom: {{ 2*($server->position - 1) }}rem;">
<p> <p>
<a href="{{ $server->getUrlAttribute() }}" <a href="{{ $server->getUrlAttribute() }}"
...@@ -26,13 +31,6 @@ ...@@ -26,13 +31,6 @@
</div> </div>
@endforeach @endforeach
</div> </div>
@endforeach
<div class="rack size-12u">
@for ($i = 0; $i < 12; $i++)
<div class="slot" style="bottom: {{ 2*$i }}rem">
{{ $i + 1 }}
</div>
@endfor
</div>
</div> </div>
@endsection @endsection
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</a> </a>
<a class="btn btn-primary btn-sm" <a class="btn btn-primary btn-sm"
href="{{ action("OrganizationController@rack", ["organization" => $organization]) }}"> href="{{ action("RackController@index", ["organization" => $organization]) }}">
<i class="fas fa-server"></i> Rack view <i class="fas fa-server"></i> Rack view
</a> </a>
</p> </p>
......
@extends('layouts.app')
@section('content')
<div class="container">
<div class="card">
<div class="card-header">Rack</div>
<div class="card-body">
@if (!$rack->exists)
<form method="POST" action="{{ action("RackController@store", ["organization" => $organization]) }}">
@else
<form method="POST"
action="{{ action("RackController@update", ["rack" => $rack]) }}">
{{ method_field("PUT") }}
@endif
{{ csrf_field() }}
<div class="form-group">
<label for="name">Name</label>
<input id="name" type="text"
class="form-control{{ $errors->has('name') ? ' is-invalid' : '' }}"
name="name"
value="{{ old('name', $rack->name) }}" autofocus>
@if ($errors->has('name'))
<span class="invalid-feedback">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
<div class="form-group">
<label for="height">Height</label>
<input id="height"
type="number" min="1" max="50" step="1"
class="form-control{{ $errors->has('height') ? ' is-invalid' : '' }}"
name="height"
value="{{ old('height', $rack->height) }}" autofocus>
@if ($errors->has('name'))
<span class="invalid-feedback">
<strong>{{ $errors->first('name') }}</strong>
</span>
@endif
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-sm">
<i class="fas fa-check"></i> Save
</button>
</div>
</form>
</div>
</div>
</div>
@endsection
...@@ -28,10 +28,9 @@ ...@@ -28,10 +28,9 @@
@foreach (Auth::user()->organizations as $organization) @foreach (Auth::user()->organizations as $organization)
<option value="{{ $organization->id }}">{{ $organization->name }}</option> <option value="{{ $organization->id }}">{{ $organization->name }}</option>
@endforeach @endforeach
</select> </select>
@if ($errors->has('name')) @if ($errors->has('organization_id'))
<span class="invalid-feedback"> <span class="invalid-feedback">
<strong>{{ $errors->first('organization_id') }}</strong> <strong>{{ $errors->first('organization_id') }}</strong>
</span> </span>
...@@ -69,6 +68,26 @@ ...@@ -69,6 +68,26 @@
@endif @endif
</div> </div>
<div class="form-group">
<label for="rack_id">Rack</label>
<select id="rack_id"
class="form-control{{ $errors->has('rack_id') ? ' is-invalid' : '' }}"
name="rack_id">
<option value="0">--</option>
@foreach ($organization->racks as $rack)
<option value="{{ $rack->id }}">{{ $rack->name }}</option>
@endforeach
</select>
@if ($errors->has('organization_id'))
<span class="invalid-feedback">
<strong>{{ $errors->first('organization_id') }}</strong>
</span>
@endif
</div>
<div class="form-group"> <div class="form-group">
<label for="size">Form factor</label> <label for="size">Form factor</label>
......
...@@ -44,6 +44,16 @@ window.monitorServerToken = "{{ $server->read_token }}"; ...@@ -44,6 +44,16 @@ window.monitorServerToken = "{{ $server->read_token }}";
</p> </p>
<p>Uptime: {{ $server->info()->uptime() }}</p> <p>Uptime: {{ $server->info()->uptime() }}</p>
@if (! is_null($server->rack_id))
<p>
Rack
<b>
{{ $server->rack->name }}#{{ $server->position }}
[{{ $server->size }}u]
</b>
</p>
@endif
</div> </div>
</div> </div>
......
...@@ -51,8 +51,10 @@ Route::get( ...@@ -51,8 +51,10 @@ Route::get(
'app/organizations/{organization}/{token}/dashboard.json', 'app/organizations/{organization}/{token}/dashboard.json',
'OrganizationDashboardController@json' 'OrganizationDashboardController@json'
); );
Route::get('app/organizations/{organization}/rack', 'OrganizationController@rack');
Route::resource('app/organizations', 'OrganizationController'); Route::resource('app/organizations', 'OrganizationController');
Route::resource("app/organizations.user", "OrganizationUserController")->only(["create", "store", "destroy"]); Route::resource("app/organizations.user", "OrganizationUserController")->only(["create", "store", "destroy"]);
Route::resource("app/organizations.rack", 'RackController')->only(["index", "create", "store", "destroy"]);
Route::resource('app/servers', 'ServerController')->except(["index"]); Route::resource('app/servers', 'ServerController')->except(["index"]);
Route::get("app/records/{record}", "RecordController@show"); Route::get("app/records/{record}", "RecordController@show");
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment