This repository has been archived by the owner on Jan 21, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 9
/
backend.go
121 lines (103 loc) · 3.48 KB
/
backend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package backend
import (
"encoding/json"
"fmt"
"net/url"
"time"
"code.cloudfoundry.org/garden"
"code.cloudfoundry.org/garden-windows/container"
"code.cloudfoundry.org/garden-windows/dotnet"
"code.cloudfoundry.org/lager"
)
type dotNetBackend struct {
logger lager.Logger
client *dotnet.Client
graceTime time.Duration
}
type WindowsContainer interface {
garden.Container
GraceTime() (time.Duration, error)
}
func NewDotNetBackend(
client *dotnet.Client,
logger lager.Logger,
graceTime time.Duration,
) (*dotNetBackend, error) {
return &dotNetBackend{
logger: logger,
client: client,
graceTime: graceTime,
}, nil
}
func (dotNetBackend *dotNetBackend) Start() error {
return nil
}
func (dotNetBackend *dotNetBackend) Stop() {}
func (dotNetBackend *dotNetBackend) GraceTime(container garden.Container) time.Duration {
graceTime, err := container.(WindowsContainer).GraceTime()
if err != nil {
return dotNetBackend.graceTime
}
return graceTime
}
func (dotNetBackend *dotNetBackend) Ping() error {
return dotNetBackend.client.Get("/api/ping", nil)
}
func (dotNetBackend *dotNetBackend) Capacity() (garden.Capacity, error) {
var capacity garden.Capacity
err := dotNetBackend.client.Get("/api/capacity", &capacity)
return capacity, err
}
func (dotNetBackend *dotNetBackend) Create(containerSpec garden.ContainerSpec) (garden.Container, error) {
var returnedContainer createContainerResponse
err := dotNetBackend.client.Post("/api/containers", containerSpec, &returnedContainer)
netContainer := container.NewContainer(dotNetBackend.client, returnedContainer.Handle, dotNetBackend.logger)
if err != nil {
return netContainer, err
}
for _, v := range containerSpec.NetIn {
if _, _, err := netContainer.NetIn(v.HostPort, v.ContainerPort); err != nil {
return netContainer, err
}
}
if err = netContainer.BulkNetOut(containerSpec.NetOut); err != nil {
return netContainer, err
}
return netContainer, err
}
func (dotNetBackend *dotNetBackend) Destroy(handle string) error {
u := fmt.Sprintf("/api/containers/%s", handle)
return dotNetBackend.client.Delete(u)
}
func (dotNetBackend *dotNetBackend) Containers(props garden.Properties) ([]garden.Container, error) {
containers := []garden.Container{}
u, err := url.Parse("/api/containers")
if len(props) > 0 {
jsonString, err := json.Marshal(props)
if err != nil {
return containers, err
}
values := url.Values{"q": []string{string(jsonString)}}
u.RawQuery = values.Encode()
}
var ids []string
err = dotNetBackend.client.Get(u.String(), &ids)
for _, containerId := range ids {
containers = append(containers, container.NewContainer(dotNetBackend.client, containerId, dotNetBackend.logger))
}
return containers, err
}
func (dotNetBackend *dotNetBackend) Lookup(handle string) (garden.Container, error) {
netContainer := container.NewContainer(dotNetBackend.client, handle, dotNetBackend.logger)
return netContainer, nil
}
func (dotNetBackend *dotNetBackend) BulkInfo(handles []string) (map[string]garden.ContainerInfoEntry, error) {
containersInfo := make(map[string]garden.ContainerInfoEntry)
err := dotNetBackend.client.Post("/api/bulkcontainerinfo", handles, &containersInfo)
return containersInfo, err
}
func (dotNetBackend *dotNetBackend) BulkMetrics(handles []string) (map[string]garden.ContainerMetricsEntry, error) {
containersMetrics := make(map[string]garden.ContainerMetricsEntry)
err := dotNetBackend.client.Post("/api/bulkcontainermetrics", handles, &containersMetrics)
return containersMetrics, err
}