Skip to content
This repository was archived by the owner on Nov 16, 2020. It is now read-only.

Commit 937dff1

Browse files
rjewberndtj
authored andcommitted
Move source out of function entity and into its own entity store (#548)
* Move source out of function entity and into its own entity store. * Moved source url out of source entity and into function entity. Removed the need for a separate sourceEntityHandler controller.
1 parent 423d27f commit 937dff1

File tree

12 files changed

+321
-47
lines changed

12 files changed

+321
-47
lines changed

pkg/api/v1/function.go

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ import (
2222
type Function struct {
2323

2424
// source
25-
// Required: true
2625
Source strfmt.Base64 `json:"source,omitempty"`
2726

27+
// sourceURL
28+
SourceURL string `json:"sourceURL,omitempty"`
29+
2830
// only used in seed.yaml
2931
SourcePath string `json:"sourcePath,omitempty"`
3032

@@ -87,11 +89,6 @@ type Function struct {
8789
func (m *Function) Validate(formats strfmt.Registry) error {
8890
var res []error
8991

90-
if err := m.validateSource(formats); err != nil {
91-
// prop
92-
res = append(res, err)
93-
}
94-
9592
if err := m.validateFaasID(formats); err != nil {
9693
// prop
9794
res = append(res, err)
@@ -148,15 +145,6 @@ func (m *Function) Validate(formats strfmt.Registry) error {
148145
return nil
149146
}
150147

151-
func (m *Function) validateSource(formats strfmt.Registry) error {
152-
153-
if err := validate.Required("source", "body", m.Source); err != nil {
154-
return err
155-
}
156-
157-
return nil
158-
}
159-
160148
func (m *Function) validateFaasID(formats strfmt.Registry) error {
161149

162150
if swag.IsZero(m.FaasID) { // not required

pkg/function-manager/controller.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ func (h *funcEntityHandler) Add(ctx context.Context, obj entitystore.Entity) (er
5151
h.Store.UpdateWithError(ctx, e, err)
5252
}()
5353

54+
code, err := h.resolveSourceURL(ctx, e.OrganizationID, e.SourceURL)
55+
if err != nil {
56+
log.Debugf("failed to retrieve source because of %s", err)
57+
return errors.Wrap(err, "store error when retrieving source")
58+
}
59+
5460
img, err := h.getImage(ctx, e.OrganizationID, e.ImageName)
5561
if err != nil {
5662
return errors.Wrapf(err, "Error when fetching image for function %s", e.Name)
@@ -70,7 +76,7 @@ func (h *funcEntityHandler) Add(ctx context.Context, obj entitystore.Entity) (er
7076
e.Status = entitystore.StatusCREATING
7177
h.Store.UpdateWithError(ctx, e, nil)
7278

73-
e.FunctionImageURL, err = h.ImageBuilder.BuildImage(ctx, e)
79+
e.FunctionImageURL, err = h.ImageBuilder.BuildImage(ctx, e, code)
7480
if err != nil {
7581
return errors.Wrapf(err, "Error building image for function '%s'", e.ID)
7682
}
@@ -84,6 +90,33 @@ func (h *funcEntityHandler) Add(ctx context.Context, obj entitystore.Entity) (er
8490
return
8591
}
8692

93+
func (h *funcEntityHandler) resolveSourceURL(ctx context.Context, organizationID string, sourceURL string) ([]byte, error) {
94+
span, ctx := trace.Trace(ctx, "")
95+
defer span.Finish()
96+
97+
scheme, err := getScheme(sourceURL)
98+
if err != nil {
99+
return nil, errors.Wrapf(err, "Error when parsing scheme from source url %s", sourceURL)
100+
}
101+
switch scheme {
102+
case entityScheme:
103+
s := new(functions.Source)
104+
sourceName, err := getURLWithoutScheme(sourceURL)
105+
if err != nil {
106+
return nil, errors.Wrapf(err, "Error when parsing source url %s", sourceURL)
107+
}
108+
109+
if err := h.Store.Get(ctx, organizationID, sourceName, entitystore.Options{}, s); err != nil {
110+
log.Debugf("Error returned by h.Store.Get: %+v", err)
111+
return nil, errors.Wrapf(err, "Failed to retreive source %s", sourceName)
112+
}
113+
114+
return s.Code, nil
115+
default:
116+
return nil, errors.Errorf("Received non-supported source url %s", sourceURL)
117+
}
118+
}
119+
87120
// Update updates functions (and function images) for the configured FaaS
88121
// TODO: we are leaking images... the images should be deleted from the image
89122
// repository
@@ -119,6 +152,22 @@ func (h *funcEntityHandler) Delete(ctx context.Context, obj entitystore.Entity)
119152
}
120153
}
121154

155+
scheme, err := getScheme(e.SourceURL)
156+
if err != nil {
157+
return errors.Wrapf(err, "Error when parsing scheme from source url %s", e.SourceURL)
158+
}
159+
if scheme == entityScheme {
160+
sourceName, err := getURLWithoutScheme(e.SourceURL)
161+
if err != nil {
162+
return errors.Wrapf(err, "Error when parsing source url %s", e.SourceURL)
163+
}
164+
var s functions.Source
165+
if err := h.Store.Delete(ctx, e.OrganizationID, sourceName, &s); err != nil {
166+
log.Debugf("fail to delete entity because of %s", err)
167+
return errors.Wrap(err, "store error when deleting source")
168+
}
169+
}
170+
122171
log.Debugf("trying to delete entity=%s, org=%s, id=%s, status=%s\n", e.Name, e.OrganizationID, e.ID, e.Status)
123172
if err := h.Store.Delete(ctx, e.OrganizationID, e.Name, e); err != nil {
124173
log.Debugf("fail to delete entity because of %s", err)

pkg/function-manager/controller_test.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ func TestFuncEntityHandler_Add_ImageNotReady(t *testing.T) {
3131
Status: v1.StatusINITIALIZED,
3232
}, nil)
3333
faas := &fnmocks.FaaSDriver{}
34+
source := &functions.Source{
35+
BaseEntity: entitystore.BaseEntity{
36+
Name: "sourceName",
37+
OrganizationID: testOrgID,
38+
},
39+
Code: []byte("some source"),
40+
}
3441
function := &functions.Function{
3542
BaseEntity: entitystore.BaseEntity{
3643
Name: "testFunction",
@@ -39,6 +46,7 @@ func TestFuncEntityHandler_Add_ImageNotReady(t *testing.T) {
3946
},
4047
ImageName: "testImage",
4148
Handler: "main",
49+
SourceURL: entityScheme + schemeSeparator + source.Name,
4250
}
4351

4452
h := &funcEntityHandler{
@@ -47,7 +55,10 @@ func TestFuncEntityHandler_Add_ImageNotReady(t *testing.T) {
4755
ImgClient: imgMgr,
4856
}
4957

50-
_, err := h.Store.Add(context.Background(), function)
58+
_, err := h.Store.Add(context.Background(), source)
59+
require.NoError(t, err)
60+
61+
_, err = h.Store.Add(context.Background(), function)
5162
require.NoError(t, err)
5263

5364
require.NoError(t, h.Add(context.Background(), function))
@@ -65,6 +76,13 @@ func TestFuncEntityHandler_Add_ImageReady(t *testing.T) {
6576
Status: v1.StatusREADY,
6677
}, nil)
6778
faas := &fnmocks.FaaSDriver{}
79+
source := &functions.Source{
80+
BaseEntity: entitystore.BaseEntity{
81+
Name: "sourceName",
82+
OrganizationID: testOrgID,
83+
},
84+
Code: []byte("some source"),
85+
}
6886
function := &functions.Function{
6987
BaseEntity: entitystore.BaseEntity{
7088
Name: "testFunction",
@@ -74,11 +92,12 @@ func TestFuncEntityHandler_Add_ImageReady(t *testing.T) {
7492
ImageName: "testImage",
7593
ImageURL: "test/image:latest",
7694
Handler: "main",
95+
SourceURL: entityScheme + schemeSeparator + source.Name,
7796
}
7897
faas.On("Create", mock.Anything, function).Return(nil)
7998

8099
imageBuilder := &fnmocks.ImageBuilder{}
81-
imageBuilder.On("BuildImage", mock.Anything, mock.Anything).Return("fake-image:latest", nil)
100+
imageBuilder.On("BuildImage", mock.Anything, mock.Anything, mock.Anything).Return("fake-image:latest", nil)
82101

83102
h := &funcEntityHandler{
84103
Store: helpers.MakeEntityStore(t),
@@ -87,7 +106,10 @@ func TestFuncEntityHandler_Add_ImageReady(t *testing.T) {
87106
ImageBuilder: imageBuilder,
88107
}
89108

90-
_, err := h.Store.Add(context.Background(), function)
109+
_, err := h.Store.Add(context.Background(), source)
110+
require.NoError(t, err)
111+
112+
_, err = h.Store.Add(context.Background(), function)
91113
require.NoError(t, err)
92114

93115
require.NoError(t, h.Add(context.Background(), function))

pkg/function-manager/gen/restapi/embedded_spec.go

Lines changed: 5 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)