Skip to content

Commit 216775b

Browse files
klapkovameowlia
authored andcommitted
RFC-0030: Add support for file-based service bindings
Co-authored-by: [Dimitar Dimitrov] <[email protected]> [Plamen Doychev] <[email protected]>
1 parent 053f2d6 commit 216775b

File tree

13 files changed

+1228
-311
lines changed

13 files changed

+1228
-311
lines changed

models/actions.pb.go

Lines changed: 159 additions & 78 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/actions.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package models;
44

55
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
66
import "environment_variables.proto";
7+
import "file.proto";
78

89
message Action {
910
// Note: we only expect one of the following set of fields to be
@@ -55,6 +56,7 @@ message RunAction {
5556
string user = 6 [(gogoproto.jsontag) = "user"];
5657
string log_source = 7;
5758
bool suppress_log_output = 8 [(gogoproto.jsontag) = "suppress_log_output"];
59+
repeated File volume_mounted_files = 9 [(gogoproto.jsontag) = "volume_mounted_files"];
5860
}
5961

6062
message TimeoutAction {

models/actions_test.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,10 @@ var _ = Describe("Actions", func() {
306306
{"name":"BAR", "value":"2"}
307307
],
308308
"resource_limits":{"nofile": 10, "nproc": 20},
309-
"suppress_log_output": false
309+
"suppress_log_output": false,
310+
"volume_mounted_files": [
311+
{"path": "/redis/username", "content": "username"}
312+
]
310313
}`,
311314
models.WrapAction(&models.RunAction{
312315
User: "me",
@@ -318,6 +321,9 @@ var _ = Describe("Actions", func() {
318321
{"BAR", "2"},
319322
},
320323
ResourceLimits: resourceLimits,
324+
VolumeMountedFiles: []*models.File{
325+
{Path: "/redis/username", Content: "username"},
326+
},
321327
}),
322328
)
323329

@@ -370,7 +376,8 @@ var _ = Describe("Actions", func() {
370376
"resource_limits":{
371377
"nofile": 10
372378
},
373-
"suppress_log_output": false
379+
"suppress_log_output": false,
380+
"volume_mounted_files": null
374381
}
375382
},
376383
"timeout_ms": 10
@@ -452,7 +459,8 @@ var _ = Describe("Actions", func() {
452459
"path": "echo",
453460
"resource_limits":{},
454461
"user": "me",
455-
"suppress_log_output": false
462+
"suppress_log_output": false,
463+
"volume_mounted_files": null
456464
}
457465
}
458466
}`,
@@ -521,7 +529,8 @@ var _ = Describe("Actions", func() {
521529
"resource_limits": {},
522530
"path": "echo",
523531
"user": "me",
524-
"suppress_log_output": false
532+
"suppress_log_output": false,
533+
"volume_mounted_files": null
525534
}
526535
}
527536
]
@@ -615,7 +624,8 @@ var _ = Describe("Actions", func() {
615624
"resource_limits": {},
616625
"path": "echo",
617626
"user": "me",
618-
"suppress_log_output": false
627+
"suppress_log_output": false,
628+
"volume_mounted_files": null
619629
}
620630
}
621631
]
@@ -694,7 +704,8 @@ var _ = Describe("Actions", func() {
694704
"path": "echo",
695705
"resource_limits":{},
696706
"user": "me",
697-
"suppress_log_output": false
707+
"suppress_log_output": false,
708+
"volume_mounted_files": null
698709
}
699710
}
700711
}`,
@@ -764,7 +775,8 @@ var _ = Describe("Actions", func() {
764775
"resource_limits": {},
765776
"path": "echo",
766777
"user": "me",
767-
"suppress_log_output": false
778+
"suppress_log_output": false,
779+
"volume_mounted_files": null
768780
}
769781
}
770782
]

models/desired_lrp.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package models
33
import (
44
bytes "bytes"
55
"encoding/json"
6+
"errors"
67
"net/url"
78
"regexp"
89
"time"
@@ -13,6 +14,8 @@ import (
1314
const PreloadedRootFSScheme = "preloaded"
1415
const PreloadedOCIRootFSScheme = "preloaded+layer"
1516

17+
const volumeMountedFilesMaxAllowedSize = 1 * 1024 * 1024 // 1MB in bytes
18+
1619
var processGuidPattern = regexp.MustCompile(`^[a-zA-Z0-9_-]+$`)
1720

1821
type DesiredLRPChange struct {
@@ -38,6 +41,9 @@ func NewDesiredLRP(schedInfo DesiredLRPSchedulingInfo, runInfo DesiredLRPRunInfo
3841
environmentVariables[i] = &runInfo.EnvironmentVariables[i]
3942
}
4043

44+
volumeMountedFiles := make([]*File, len(runInfo.VolumeMountedFiles))
45+
copy(volumeMountedFiles, runInfo.VolumeMountedFiles)
46+
4147
egressRules := make([]*SecurityGroupRule, len(runInfo.EgressRules))
4248
for i := range runInfo.EgressRules {
4349
egressRules[i] = &runInfo.EgressRules[i]
@@ -80,6 +86,7 @@ func NewDesiredLRP(schedInfo DesiredLRPSchedulingInfo, runInfo DesiredLRPRunInfo
8086
MetricTags: metricTags,
8187
Sidecars: runInfo.Sidecars,
8288
LogRateLimit: runInfo.LogRateLimit,
89+
VolumeMountedFiles: volumeMountedFiles,
8390
}
8491
}
8592

@@ -89,6 +96,9 @@ func (desiredLRP *DesiredLRP) AddRunInfo(runInfo DesiredLRPRunInfo) {
8996
environmentVariables[i] = &runInfo.EnvironmentVariables[i]
9097
}
9198

99+
volumeMountedFiles := make([]*File, len(runInfo.VolumeMountedFiles))
100+
copy(volumeMountedFiles, runInfo.VolumeMountedFiles)
101+
92102
egressRules := make([]*SecurityGroupRule, len(runInfo.EgressRules))
93103
for i := range runInfo.EgressRules {
94104
egressRules[i] = &runInfo.EgressRules[i]
@@ -111,6 +121,7 @@ func (desiredLRP *DesiredLRP) AddRunInfo(runInfo DesiredLRPRunInfo) {
111121
desiredLRP.VolumeMounts = runInfo.VolumeMounts
112122
desiredLRP.Network = runInfo.Network
113123
desiredLRP.CheckDefinition = runInfo.CheckDefinition
124+
desiredLRP.VolumeMountedFiles = volumeMountedFiles
114125
}
115126

116127
func (*DesiredLRP) Version() format.Version {
@@ -266,6 +277,9 @@ func (d *DesiredLRP) DesiredLRPRunInfo(createdAt time.Time) DesiredLRPRunInfo {
266277
environmentVariables[i] = *d.EnvironmentVariables[i]
267278
}
268279

280+
volumeMountedFiles := make([]*File, len(d.VolumeMountedFiles))
281+
copy(volumeMountedFiles, d.VolumeMountedFiles)
282+
269283
egressRules := make([]SecurityGroupRule, len(d.EgressRules))
270284
for i := range d.EgressRules {
271285
egressRules[i] = *d.EgressRules[i]
@@ -297,6 +311,7 @@ func (d *DesiredLRP) DesiredLRPRunInfo(createdAt time.Time) DesiredLRPRunInfo {
297311
d.ImageLayers,
298312
d.Sidecars,
299313
d.LogRateLimit,
314+
volumeMountedFiles,
300315
)
301316
}
302317

@@ -308,6 +323,13 @@ func (d *DesiredLRP) Copy() *DesiredLRP {
308323
func (desired DesiredLRP) Validate() error {
309324
var validationError ValidationError
310325

326+
if len(desired.VolumeMountedFiles) > 0 {
327+
err := validateVolumeMountedFiles(desired.VolumeMountedFiles)
328+
if err != nil {
329+
validationError = validationError.Append(ErrInvalidField{"volumeMountedFiles"})
330+
}
331+
}
332+
311333
if desired.GetDomain() == "" {
312334
validationError = validationError.Append(ErrInvalidField{"domain"})
313335
}
@@ -661,6 +683,7 @@ func NewDesiredLRPRunInfo(
661683
imageLayers []*ImageLayer,
662684
sidecars []*Sidecar,
663685
logRateLimit *LogRateLimit,
686+
volumeMountedFiles []*File,
664687
) DesiredLRPRunInfo {
665688
return DesiredLRPRunInfo{
666689
DesiredLRPKey: key,
@@ -688,6 +711,7 @@ func NewDesiredLRPRunInfo(
688711
ImageLayers: imageLayers,
689712
Sidecars: sidecars,
690713
LogRateLimit: logRateLimit,
714+
VolumeMountedFiles: volumeMountedFiles,
691715
}
692716
}
693717

@@ -696,6 +720,13 @@ func (runInfo DesiredLRPRunInfo) Validate() error {
696720

697721
validationError = validationError.Check(runInfo.DesiredLRPKey)
698722

723+
if len(runInfo.VolumeMountedFiles) > 0 {
724+
err := validateVolumeMountedFiles(runInfo.VolumeMountedFiles)
725+
if err != nil {
726+
validationError = validationError.Append(ErrInvalidField{"volumeMountedFiles"})
727+
}
728+
}
729+
699730
if runInfo.Setup != nil {
700731
if err := runInfo.Setup.Validate(); err != nil {
701732
validationError = validationError.Append(ErrInvalidField{"setup"})
@@ -780,3 +811,14 @@ func (*CertificateProperties) Version() format.Version {
780811
func (CertificateProperties) Validate() error {
781812
return nil
782813
}
814+
815+
func validateVolumeMountedFiles(files []*File) error {
816+
var totalSize int
817+
for _, file := range files {
818+
totalSize += len(file.Content)
819+
if totalSize > volumeMountedFilesMaxAllowedSize {
820+
return errors.New("total size of all file values exceeds 1MB")
821+
}
822+
}
823+
return nil
824+
}

0 commit comments

Comments
 (0)