Skip to content

Commit bf754dc

Browse files
author
Pavel Safonov
committed
additional http api methods
1 parent 3cd3f0b commit bf754dc

File tree

4 files changed

+79
-2
lines changed

4 files changed

+79
-2
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ module github.com/pnsafonov/pind
33
go 1.19
44

55
require (
6-
github.com/lrita/numa v1.0.2
6+
github.com/lrita/numa v1.0.3
77
github.com/prometheus/procfs v0.12.0
88
github.com/sirupsen/logrus v1.9.3
9+
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816
910
golang.org/x/sys v0.12.0
1011
gopkg.in/natefinch/lumberjack.v2 v2.2.1
1112
gopkg.in/yaml.v3 v3.0.1
1213
)
1314

1415
require (
1516
github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6 // indirect
16-
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816 // indirect
1717
golang.org/x/sync v0.3.0 // indirect
1818
)

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6/go.mod h1:RmeVYf9Xr
77
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
88
github.com/lrita/numa v1.0.2 h1:RzJFNvgHXtzyf+RsGRP9XyMHjNUQFOEypv+2oXaJBj8=
99
github.com/lrita/numa v1.0.2/go.mod h1:B0HvTeFKP4P+yb/BvVhww9Sx+q/zZEwTfzPL0LhF79M=
10+
github.com/lrita/numa v1.0.3 h1:9vx+77J1GSYdphcABftzenMTqzYLygLJa5EzZN1wa9w=
11+
github.com/lrita/numa v1.0.3/go.mod h1:B0HvTeFKP4P+yb/BvVhww9Sx+q/zZEwTfzPL0LhF79M=
1012
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1113
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
1214
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=

pkg/http_api/http_api.go

+28
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,38 @@ func (x *HttpApi) serve(l net.Listener) {
6565
_ = x.Server.Serve(l)
6666
}
6767

68+
func writeStateBytes(w http.ResponseWriter, state *State) error {
69+
stateBytes, err := json.MarshalIndent(state, "", " ")
70+
if err != nil {
71+
log.Errorf("HttpApi writeStateBytes, json.Marshal err = %v", err)
72+
return err
73+
}
74+
75+
_, err = w.Write(stateBytes)
76+
return err
77+
}
78+
6879
// getApiState - /api/state
6980
func (x *HttpApi) getApiState(w http.ResponseWriter, r *http.Request) {
7081
header := w.Header()
7182
header.Set("Content-Type", "application/json; charset=utf-8")
7283

84+
// /api/state?vm_name=my_env_db
85+
vmName := r.URL.Query().Get("vm_name")
86+
if vmName != "" {
87+
state1 := x.state.CloneWithFilter1(vmName)
88+
_ = writeStateBytes(w, state1)
89+
return
90+
}
91+
92+
// /api/state?vm_prefix=my_env_
93+
vmPrefix := r.URL.Query().Get("vm_prefix")
94+
if vmPrefix != "" {
95+
state1 := x.state.CloneWithFilter2(vmPrefix)
96+
_ = writeStateBytes(w, state1)
97+
return
98+
}
99+
100+
// /api/state
73101
_, _ = w.Write(x.stateBytes)
74102
}

pkg/http_api/state0.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package http_api
2+
3+
import "strings"
4+
5+
func (x *State) CloneWithFilter0(inFilter map[string]*Proc) *State {
6+
procs0 := &Procs{
7+
NotInFilter: x.Procs.NotInFilter,
8+
InFilter: inFilter,
9+
}
10+
11+
state0 := &State{
12+
Version: x.Version,
13+
GitHash: x.GitHash,
14+
Errors: x.Errors,
15+
Time: x.Time,
16+
Procs: procs0,
17+
18+
Pool: x.Pool,
19+
Numa: x.Numa,
20+
21+
Config: x.Config,
22+
}
23+
24+
return state0
25+
}
26+
27+
func (x *State) CloneWithFilter1(vmName string) *State {
28+
inFilter := make(map[string]*Proc)
29+
for k, v := range x.Procs.InFilter {
30+
if v.VmName == vmName {
31+
inFilter[k] = v
32+
}
33+
}
34+
35+
return x.CloneWithFilter0(inFilter)
36+
}
37+
38+
func (x *State) CloneWithFilter2(vmPrefix string) *State {
39+
inFilter := make(map[string]*Proc)
40+
for k, v := range x.Procs.InFilter {
41+
if strings.HasPrefix(v.VmName, vmPrefix) {
42+
inFilter[k] = v
43+
}
44+
}
45+
46+
return x.CloneWithFilter0(inFilter)
47+
}

0 commit comments

Comments
 (0)