[增添]添加了etcd服务与对应页面

This commit is contained in:
makotocc0107
2024-08-27 13:35:26 +08:00
parent 84e0393ebc
commit ad88fb8d6c
4 changed files with 159 additions and 5 deletions

View File

@@ -0,0 +1,78 @@
<?php
namespace App\Filament\Pages;
use App\Services\EtcdService;
use Filament\Pages\Page;
use Illuminate\Support\Facades\DB;
use Filament\Notifications\Notification;
class UpdateToEtcd extends Page
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
protected static string $view = 'filament.pages.update-to-etcd';
public function updateSettingsToEtcd()
{
try {
$etcd = new EtcdService();
// $etcd->deleteByPrefix("datasource");
$settings = DB::table('settings')
->where('group', 'datasource')
->get(); // 获取 group 为 datasource 的所有记录
foreach ($settings as $setting) {
$key = '/' . $setting->group . '/' . $setting->name;
$etcd->put($key, $setting->payload);
}
$metrics = DB::table('metrics')->get(); // 获取所有 metrics 数据
foreach ($metrics as $index => $metric) {
$baseKey = '/metrics/' . $index;
// 存储 name 到 etcd
$etcd->put($baseKey . '/name', $metric->name);
// 存储 identifier_type 到 etcd
$etcd->put($baseKey . '/identifier_type', $metric->identifier_type);
// 根据 identifier_type 生成 nodeid 并存储到 etcd
switch ($metric->identifier_type) {
case 1: // Numeric
$nodeId = 'ns=' . $metric->namespace_index . ';i=' . $metric->numeric_id;
break;
case 2: // String
$nodeId = 'ns=' . $metric->namespace_index . ';s=' . $metric->string_id;
break;
case 3: // GUID
$nodeId = 'ns=' . $metric->namespace_index . ';g=' . $metric->guid_id;
break;
default:
$nodeId = ''; // 若 identifier_type 不符合预期,则 nodeId 为空
break;
}
$etcd->put($baseKey . '/nodeid', $nodeId);
// 存储 help 到 etcd
$etcd->put($baseKey . '/help', $metric->help ?? '');
}
Notification::make()
->title('配置更新成功!')
->success() // 设置为成功类型
->send(); // 发送通知
} catch (\Exception $e) {
// 失败通知
Notification::make()
->title('配置更新失败!')
->danger() // 设置为错误类型
->body($e->getMessage()) // 显示异常信息
->send(); // 发送通知
}
}
}

View File

@@ -0,0 +1,54 @@
<?php
namespace App\Services;
use GuzzleHttp\Client;
class EtcdService
{
protected $client;
protected $baseUri = 'http://127.0.0.1:2379/v3/'; // etcd 默认地址
public function __construct()
{
$this->client = new Client(['base_uri' => $this->baseUri]);
}
public function put($key, $value)
{
$this->client->post('kv/put', [
'json' => [
'key' => base64_encode($key),
'value' => base64_encode($value),
],
]);
}
public function get($key)
{
$response = $this->client->post('kv/range', [
'json' => [
'key' => base64_encode($key),
],
]);
return json_decode($response->getBody()->getContents(), true);
}
public function deleteByPrefix($prefix)
{
// Encode the prefix
$encodedPrefix = base64_encode($prefix);
// Calculate the range end by incrementing the last character
$lastChar = $prefix[strlen($prefix) - 1];
$rangeEnd = $prefix . chr(ord($lastChar) + 1);
$encodedRangeEnd = base64_encode($rangeEnd);
// Send the delete request
$this->client->post('kv/deletion_range', [
'json' => [
'key' => $encodedPrefix,
'range_end' => $encodedRangeEnd,
],
]);
}
}

View File

@@ -0,0 +1,10 @@
<x-filament::page>
<form wire:submit.prevent="updateSettingsToEtcd" class="space-y-6">
{{$this->form }}
<div class="flex flex-wrap items-center gap-4 justify-start">
<x-filament::button type="submit">
导出配置到ETCD
</x-filament::button>
</div>
</form>
</x-filament::page>