mirror of
https://github.com/chrislusf/seaweedfs
synced 2025-09-10 05:12:47 +02:00
* initial design * added simulation as tests * reorganized the codebase to move the simulation framework and tests into their own dedicated package * integration test. ec worker task * remove "enhanced" reference * start master, volume servers, filer Current Status ✅ Master: Healthy and running (port 9333) ✅ Filer: Healthy and running (port 8888) ✅ Volume Servers: All 6 servers running (ports 8080-8085) 🔄 Admin/Workers: Will start when dependencies are ready * generate write load * tasks are assigned * admin start wtih grpc port. worker has its own working directory * Update .gitignore * working worker and admin. Task detection is not working yet. * compiles, detection uses volumeSizeLimitMB from master * compiles * worker retries connecting to admin * build and restart * rendering pending tasks * skip task ID column * sticky worker id * test canScheduleTaskNow * worker reconnect to admin * clean up logs * worker register itself first * worker can run ec work and report status but: 1. one volume should not be repeatedly worked on. 2. ec shards needs to be distributed and source data should be deleted. * move ec task logic * listing ec shards * local copy, ec. Need to distribute. * ec is mostly working now * distribution of ec shards needs improvement * need configuration to enable ec * show ec volumes * interval field UI component * rename * integration test with vauuming * garbage percentage threshold * fix warning * display ec shard sizes * fix ec volumes list * Update ui.go * show default values * ensure correct default value * MaintenanceConfig use ConfigField * use schema defined defaults * config * reduce duplication * refactor to use BaseUIProvider * each task register its schema * checkECEncodingCandidate use ecDetector * use vacuumDetector * use volumeSizeLimitMB * remove remove * remove unused * refactor * use new framework * remove v2 reference * refactor * left menu can scroll now * The maintenance manager was not being initialized when no data directory was configured for persistent storage. * saving config * Update task_config_schema_templ.go * enable/disable tasks * protobuf encoded task configurations * fix system settings * use ui component * remove logs * interface{} Reduction * reduce interface{} * reduce interface{} * avoid from/to map * reduce interface{} * refactor * keep it DRY * added logging * debug messages * debug level * debug * show the log caller line * use configured task policy * log level * handle admin heartbeat response * Update worker.go * fix EC rack and dc count * Report task status to admin server * fix task logging, simplify interface checking, use erasure_coding constants * factor in empty volume server during task planning * volume.list adds disk id * track disk id also * fix locking scheduled and manual scanning * add active topology * simplify task detector * ec task completed, but shards are not showing up * implement ec in ec_typed.go * adjust log level * dedup * implementing ec copying shards and only ecx files * use disk id when distributing ec shards 🎯 Planning: ActiveTopology creates DestinationPlan with specific TargetDisk 📦 Task Creation: maintenance_integration.go creates ECDestination with DiskId 🚀 Task Execution: EC task passes DiskId in VolumeEcShardsCopyRequest 💾 Volume Server: Receives disk_id and stores shards on specific disk (vs.store.Locations[req.DiskId]) 📂 File System: EC shards and metadata land in the exact disk directory planned * Delete original volume from all locations * clean up existing shard locations * local encoding and distributing * Update docker/admin_integration/EC-TESTING-README.md Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> * check volume id range * simplify * fix tests * fix types * clean up logs and tests --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
218 lines
No EOL
3.5 KiB
CSS
218 lines
No EOL
3.5 KiB
CSS
/* SeaweedFS Dashboard Custom Styles */
|
|
|
|
/* Sidebar Styles */
|
|
.sidebar {
|
|
position: fixed;
|
|
top: 56px;
|
|
bottom: 0;
|
|
left: 0;
|
|
z-index: 100;
|
|
padding: 48px 0 0;
|
|
box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.sidebar-heading {
|
|
font-size: .75rem;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.sidebar .nav-link {
|
|
font-weight: 500;
|
|
color: #333;
|
|
}
|
|
|
|
.sidebar .nav-link:hover {
|
|
color: #007bff;
|
|
}
|
|
|
|
.sidebar .nav-link.active {
|
|
color: #007bff;
|
|
}
|
|
|
|
.sidebar .nav-link:hover .feather,
|
|
.sidebar .nav-link.active .feather {
|
|
color: inherit;
|
|
}
|
|
|
|
/* Main content area */
|
|
main {
|
|
margin-left: 240px;
|
|
}
|
|
|
|
@media (max-width: 767.98px) {
|
|
.sidebar {
|
|
top: 5rem;
|
|
}
|
|
main {
|
|
margin-left: 0;
|
|
}
|
|
}
|
|
|
|
/* Custom card styles */
|
|
.border-left-primary {
|
|
border-left: 0.25rem solid #4e73df !important;
|
|
}
|
|
|
|
.border-left-success {
|
|
border-left: 0.25rem solid #1cc88a !important;
|
|
}
|
|
|
|
.border-left-info {
|
|
border-left: 0.25rem solid #36b9cc !important;
|
|
}
|
|
|
|
.border-left-warning {
|
|
border-left: 0.25rem solid #f6c23e !important;
|
|
}
|
|
|
|
.border-left-danger {
|
|
border-left: 0.25rem solid #e74a3b !important;
|
|
}
|
|
|
|
/* Status badges */
|
|
.badge {
|
|
font-size: 0.875em;
|
|
}
|
|
|
|
/* Progress bars */
|
|
.progress {
|
|
background-color: #f8f9fc;
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.progress-bar {
|
|
font-size: 0.75rem;
|
|
font-weight: 700;
|
|
color: #fff;
|
|
text-align: center;
|
|
}
|
|
|
|
/* Tables */
|
|
.table {
|
|
color: #5a5c69;
|
|
}
|
|
|
|
.table thead th {
|
|
vertical-align: bottom;
|
|
border-bottom: 1px solid #e3e6f0;
|
|
font-weight: 700;
|
|
color: #5a5c69;
|
|
background-color: #f8f9fc;
|
|
}
|
|
|
|
.table-bordered {
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.table-bordered th,
|
|
.table-bordered td {
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
/* Cards */
|
|
.card {
|
|
box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important;
|
|
border: 1px solid #e3e6f0;
|
|
}
|
|
|
|
.card-header {
|
|
background-color: #f8f9fc;
|
|
border-bottom: 1px solid #e3e6f0;
|
|
}
|
|
|
|
/* Buttons */
|
|
.btn-primary {
|
|
background-color: #4e73df;
|
|
border-color: #4e73df;
|
|
}
|
|
|
|
.btn-primary:hover {
|
|
background-color: #2e59d9;
|
|
border-color: #2653d4;
|
|
}
|
|
|
|
/* Text utilities */
|
|
.text-gray-800 {
|
|
color: #5a5c69 !important;
|
|
}
|
|
|
|
.text-gray-300 {
|
|
color: #dddfeb !important;
|
|
}
|
|
|
|
/* Animation for HTMX updates */
|
|
.htmx-indicator {
|
|
opacity: 0;
|
|
transition: opacity 500ms ease-in;
|
|
}
|
|
|
|
.htmx-request .htmx-indicator {
|
|
opacity: 1;
|
|
}
|
|
|
|
.htmx-request.htmx-indicator {
|
|
opacity: 1;
|
|
}
|
|
|
|
/* Loading spinner */
|
|
.spinner-border-sm {
|
|
width: 1rem;
|
|
height: 1rem;
|
|
}
|
|
|
|
/* Custom utilities */
|
|
.bg-gradient-primary {
|
|
background: linear-gradient(180deg, #4e73df 10%, #224abe 100%);
|
|
}
|
|
|
|
.shadow {
|
|
box-shadow: 0 0.15rem 1.75rem 0 rgba(58, 59, 69, 0.15) !important;
|
|
}
|
|
|
|
/* Collapsible menu styles */
|
|
.nav-link[data-bs-toggle="collapse"] {
|
|
position: relative;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"] .fa-chevron-down {
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"][aria-expanded="true"] .fa-chevron-down {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"]:not(.collapsed) {
|
|
color: #007bff;
|
|
}
|
|
|
|
.nav-link[data-bs-toggle="collapse"]:not(.collapsed) .fa-chevron-down {
|
|
color: #007bff;
|
|
}
|
|
|
|
/* Submenu styles */
|
|
.nav .nav {
|
|
border-left: 1px solid #e3e6f0;
|
|
margin-left: 0.5rem;
|
|
}
|
|
|
|
.nav .nav .nav-link {
|
|
font-size: 0.875rem;
|
|
padding-left: 1rem;
|
|
}
|
|
|
|
.nav .nav .nav-link:hover {
|
|
background-color: #f8f9fc;
|
|
}
|
|
|
|
/* Responsive adjustments */
|
|
@media (max-width: 576px) {
|
|
.card-body {
|
|
padding: 1rem;
|
|
}
|
|
|
|
.h5 {
|
|
font-size: 1rem;
|
|
}
|
|
} |