Skip to content

Commit 9667a42

Browse files
authored
Merge pull request #110 from skant7/feature/resource-constraints
add cpu and memory constraints
2 parents 49fd50e + b276190 commit 9667a42

File tree

4 files changed

+39
-15
lines changed

4 files changed

+39
-15
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,9 @@ curl -X POST http://localhost:4434/createservice \
7979
"type": "postgres",
8080
"name": "localtest",
8181
"username": "spinup",
82-
"password": "spinup"
82+
"password": "spinup",
83+
"memory": 6000, //In Megabytes
84+
"cpu": 2
8385
},
8486
"version": {"maj":9,"min":6}
8587
}'

api/create.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func CreateService(w http.ResponseWriter, req *http.Request) {
4444
}
4545

4646
err = json.Unmarshal(byteArray, &s)
47-
log.Printf("%d %d", s.Version.Maj, s.Version.Min)
47+
log.Printf("%d %d %d %d", s.Version.Maj, s.Version.Min, s.Db.CPU, s.Db.Memory)
4848
if s.UserID == "" && apiKeyHeader != "" {
4949
s.UserID = "testuser"
5050
}
@@ -82,7 +82,16 @@ func CreateService(w http.ResponseWriter, req *http.Request) {
8282
if err != nil {
8383
fmt.Printf("error creating client %v", err)
8484
}
85-
postgresContainer, err := postgres.NewPostgresContainer(image, s.Db.Name, s.Db.Username, s.Db.Password, s.Db.Port)
85+
postgresContainerProp := postgres.ContainerProps{
86+
Name: s.Db.Name,
87+
Username: s.Db.Username,
88+
Password: s.Db.Password,
89+
Port: s.Db.Port,
90+
Memory: s.Db.Memory,
91+
CPUShares: s.Db.CPU,
92+
Image: image,
93+
}
94+
postgresContainer, err := postgres.NewPostgresContainer(postgresContainerProp)
8695
if err != nil {
8796
log.Printf("ERROR: creating new docker service for %s %v", s.UserID, err)
8897
http.Error(w, "Error creating postgres docker service", 500)

config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@ type dbCluster struct {
5252
Username string
5353
Password string
5454

55-
Memory string
56-
Storage string
55+
Memory int64
56+
CPU int64
5757
Monitoring string
5858
}
5959

internal/postgres/postgres.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,25 @@ const (
2020
PGDATADIR = "/var/lib/postgresql/data/"
2121
)
2222

23-
func NewPostgresContainer(image, name, postgresUsername, postgresPassword string, port int) (postgresContainer dockerservice.Container, err error) {
23+
type ContainerProps struct {
24+
Image string
25+
Name string
26+
Username string
27+
Password string
28+
Port int
29+
Memory int64
30+
CPUShares int64
31+
}
32+
33+
func NewPostgresContainer(props ContainerProps) (postgresContainer dockerservice.Container, err error) {
2434
dockerClient, err := dockerservice.NewDocker()
2535
if err != nil {
2636
fmt.Printf("error creating client %v", err)
2737
}
2838
newVolume, err := dockerservice.CreateVolume(context.Background(), dockerClient, volume.VolumeCreateBody{
2939
Driver: "local",
3040
Labels: map[string]string{"purpose": "postgres data"},
31-
Name: name,
41+
Name: props.Name,
3242
})
3343
if err != nil {
3444
return dockerservice.Container{}, err
@@ -41,7 +51,7 @@ func NewPostgresContainer(image, name, postgresUsername, postgresPassword string
4151
}
4252
}
4353
}()
44-
networkResponse, err := dockerservice.CreateNetwork(context.Background(), dockerClient, name+"_default", types.NetworkCreate{CheckDuplicate: true})
54+
networkResponse, err := dockerservice.CreateNetwork(context.Background(), dockerClient, props.Name+"_default", types.NetworkCreate{CheckDuplicate: true})
4555
if err != nil {
4656
return dockerservice.Container{}, err
4757
}
@@ -53,9 +63,8 @@ func NewPostgresContainer(image, name, postgresUsername, postgresPassword string
5363
}
5464
}
5565
}()
56-
containerName := PREFIXPGCONTAINER + name
57-
58-
newHostPort, err := nat.NewPort("tcp", strconv.Itoa(port))
66+
containerName := PREFIXPGCONTAINER + props.Name
67+
newHostPort, err := nat.NewPort("tcp", strconv.Itoa(props.Port))
5968
if err != nil {
6069
return dockerservice.Container{}, err
6170
}
@@ -82,21 +91,25 @@ func NewPostgresContainer(image, name, postgresUsername, postgresPassword string
8291
NetworkMode: "default",
8392
AutoRemove: false,
8493
Mounts: mounts,
94+
Resources: container.Resources{
95+
CPUShares: props.CPUShares,
96+
Memory: props.Memory * 1000000,
97+
},
8598
}
8699

87100
endpointConfig := map[string]*network.EndpointSettings{}
88-
networkName := name + "_default"
101+
networkName := props.Name + "_default"
89102
// setting key and value for the map. networkName=$dbname_default (eg: viggy_default)
90103
endpointConfig[networkName] = &network.EndpointSettings{}
91104
nwConfig := network.NetworkingConfig{EndpointsConfig: endpointConfig}
92105
env := []string{}
93-
env = append(env, misc.StringToDockerEnvVal("POSTGRES_USER", postgresUsername))
94-
env = append(env, misc.StringToDockerEnvVal("POSTGRES_PASSWORD", postgresPassword))
106+
env = append(env, misc.StringToDockerEnvVal("POSTGRES_USER", props.Username))
107+
env = append(env, misc.StringToDockerEnvVal("POSTGRES_PASSWORD", props.Password))
95108

96109
postgresContainer = dockerservice.NewContainer(
97110
containerName,
98111
container.Config{
99-
Image: image,
112+
Image: props.Image,
100113
Env: env,
101114
},
102115
hostConfig,

0 commit comments

Comments
 (0)