Skip to content

Commit e631114

Browse files
authored
Merge pull request #91 from aice030/feat/77
Feat/77: 实现发布系统各内部方法
2 parents 9f38ef2 + 5efc62d commit e631114

File tree

10 files changed

+1735
-116
lines changed

10 files changed

+1735
-116
lines changed

docs/deploy/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ type InstanceManager interface {
126126
func ValidatePackageURL(packageURL string) error
127127
```
128128

129-
### 5.2 **GetServiceInstanceIDs**: 根据服务名和版本获取实例ID列表
129+
### 5.2 **GetServiceInstanceInfos**: 根据服务名和版本获取实例信息列表
130130
```go
131-
func GetServiceInstanceIDs(serviceName string, version ...string) ([]string, error)
131+
func GetServiceInstanceInfos(serviceName string, version ...string) ([]*InstanceInfo, error)
132132
```
133133

134134
### 5.3 **GetInstanceIP**: 根据实例ID获取实例的IP地址
@@ -143,7 +143,7 @@ func GetInstancePort(instanceID string) (int, error)
143143

144144
### 5.5 **CheckInstanceHealth**: 检查实例的健康状态
145145
```go
146-
func CheckInstanceHealth(instanceID string) (bool, error)
146+
func CheckInstanceHealth(instanceIP string, instancePort int) (bool, error)
147147
```
148148

149149
### 5.6 **GetAvailableHosts**: 获取所有可用的主机列表

docs/deploy/interface.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,10 @@ type InstanceManager interface {
120120
**InstanceInfo结构体**:
121121
```go
122122
type InstanceInfo struct {
123-
InstanceID string `json:"instance_id"` // 实例唯一标识符
124-
ServiceName string `json:"service_name"` // 所属服务名称
125-
Version string `json:"version"` // 当前运行的版本号
126-
Status string `json:"status"` // 实例运行状态 - 'active'运行中;'pending'发布中;'error'出现故障
123+
InstanceID string `json:"instance_id"` // 实例唯一标识符
124+
ServiceName string `json:"service_name"` // 所属服务名称
125+
ServiceVersion string `json:"service_version"` // 当前运行的版本号
126+
Status string `json:"status"` // 实例运行状态 - 'active'运行中;'pending'发布中;'error'出现故障
127127
}
128128
```
129129

@@ -187,13 +187,13 @@ packageURL string // 必填,包下载URL
187187

188188
**返回结果**: `error` - 验证失败时返回错误信息
189189

190-
### 4.2 GetServiceInstanceIDs函数
190+
### 4.2 GetServiceInstanceInfos函数
191191

192-
**函数描述**: 根据服务名和版本获取实例ID列表,用于内部批量操作
192+
**函数描述**: 根据服务名和版本获取实例信息列表,用于内部批量操作
193193

194194
**函数签名**:
195195
```go
196-
func GetServiceInstanceIDs(serviceName string, version ...string) ([]string, error)
196+
func GetServiceInstanceInfos(serviceName string, version ...string) ([]*InstanceInfo, error)
197197
```
198198

199199
**输入参数**:
@@ -202,7 +202,7 @@ serviceName string // 必填,服务名称
202202
version ...string // 选填,指定版本号进行过滤,未输入则默认获取全部版本的运行实例
203203
```
204204

205-
**返回结果**: `[]string` - 实例ID数组
205+
**返回结果**: `[]*InstanceInfo` - 实例信息数组
206206

207207
### 4.3 GetInstanceIP函数
208208

@@ -242,12 +242,13 @@ instanceID string // 必填,实例ID
242242

243243
**函数签名**:
244244
```go
245-
func CheckInstanceHealth(instanceID string) (bool, error)
245+
func CheckInstanceHealth(instanceIP string, instancePort int) (bool, error)
246246
```
247247

248248
**输入参数**:
249249
```go
250-
instanceID string // 必填,实例ID
250+
instanceIP string // 必填,实例IP地址
251+
instancePort int // 必填,实例端口号
251252
```
252253

253254
**返回结果**: `bool` - 健康检查结果,true表示实例有响应,false表示无响应
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package database
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"sync"
7+
8+
_ "github.com/lib/pq" // PostgreSQL驱动
9+
"github.com/qiniu/zeroops/internal/deploy/config"
10+
)
11+
12+
// Database 数据库连接管理器
13+
type Database struct {
14+
db *sql.DB
15+
mu sync.RWMutex
16+
}
17+
18+
// NewDatabase 创建新的数据库连接
19+
func NewDatabase(cfg *config.DatabaseConfig) (*Database, error) {
20+
dsn := cfg.GetDSN()
21+
22+
db, err := sql.Open("postgres", dsn)
23+
if err != nil {
24+
return nil, fmt.Errorf("failed to open database connection: %w", err)
25+
}
26+
27+
// 测试连接
28+
if err := db.Ping(); err != nil {
29+
db.Close()
30+
return nil, fmt.Errorf("failed to ping database: %w", err)
31+
}
32+
33+
database := &Database{
34+
db: db,
35+
}
36+
37+
return database, nil
38+
}
39+
40+
// GetDB 获取数据库连接(供repo使用)
41+
func (d *Database) GetDB() *sql.DB {
42+
d.mu.RLock()
43+
defer d.mu.RUnlock()
44+
return d.db
45+
}
46+
47+
// Close 关闭数据库连接
48+
func (d *Database) Close() error {
49+
d.mu.Lock()
50+
defer d.mu.Unlock()
51+
52+
if d.db != nil {
53+
return d.db.Close()
54+
}
55+
return nil
56+
}
57+
58+
// Ping 测试数据库连接
59+
func (d *Database) Ping() error {
60+
d.mu.RLock()
61+
defer d.mu.RUnlock()
62+
63+
return d.db.Ping()
64+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package database
2+
3+
import (
4+
"database/sql"
5+
"fmt"
6+
"strconv"
7+
8+
"github.com/qiniu/zeroops/internal/deploy/model"
9+
)
10+
11+
// HostRepo 主机数据访问层
12+
type HostRepo struct {
13+
db *sql.DB
14+
}
15+
16+
// NewHostRepo 创建主机仓库
17+
func NewHostRepo(db *Database) *HostRepo {
18+
return &HostRepo{
19+
db: db.GetDB(),
20+
}
21+
}
22+
23+
// GetAvailableHostInfos 获取所有可用的主机信息列表
24+
func (r *HostRepo) GetAvailableHostInfos() ([]*model.HostInfo, error) {
25+
query := `
26+
SELECT id, name, ip_address, is_stopped
27+
FROM hosts
28+
WHERE is_stopped = false
29+
ORDER BY id
30+
`
31+
32+
rows, err := r.db.Query(query)
33+
if err != nil {
34+
return nil, fmt.Errorf("failed to query available hosts: %w", err)
35+
}
36+
defer rows.Close()
37+
38+
var hostInfos []*model.HostInfo
39+
for rows.Next() {
40+
hostInfo := new(model.HostInfo)
41+
var id int
42+
err := rows.Scan(&id, &hostInfo.HostName, &hostInfo.HostIPAddress, &hostInfo.IsStopped)
43+
if err != nil {
44+
return nil, fmt.Errorf("failed to scan host: %w", err)
45+
}
46+
hostInfo.HostID = strconv.Itoa(id)
47+
hostInfos = append(hostInfos, hostInfo)
48+
}
49+
50+
if err := rows.Err(); err != nil {
51+
return nil, fmt.Errorf("error iterating hosts: %w", err)
52+
}
53+
54+
return hostInfos, nil
55+
}

0 commit comments

Comments
 (0)